SHACL - bettermorn/KGCourse GitHub Wiki
https://spinrdf.org/spin-shacl.html
SHACL与知识推理
SHACL在知识推理中起什么作用?
SHACL(Shapes Constraint Language)是一种用于RDF(Resource Description Framework)数据的语义网约束语言,由W3C(World Wide Web Consortium)推出。在知识推理中,SHACL主要起到以下作用:
- 数据验证:SHACL可以用于验证RDF数据是否满足一定的约束条件。例如,我们可以定义一个SHACL形状,规定某个类的实例必须有某个属性,然后用这个形状来验证RDF数据。
- 数据建模:SHACL不仅可以用于数据验证,还可以用于数据建模。我们可以用SHACL形状来描述数据的结构和语义,这对于理解和使用数据非常有帮助。
- 数据推理:虽然SHACL本身不是一种推理语言,但是我们可以通过定义和应用SHACL形状,实现一定的推理功能。例如,我们可以定义一个SHACL形状,规定如果一个实例有某个属性,那么它必须属于某个类,然后用这个形状来推理RDF数据。
- 数据交互:SHACL还可以用于描述数据的交互接口。我们可以用SHACL形状来规定数据的输入和输出格式,这对于数据交互非常有用。
SHACL如何与其他知识推理工具进行集成和应用?
SHACL(Shapes Constraint Language)是一种用于RDF(Resource Description Framework)数据的语义网约束语言,它可以与其他知识推理工具进行集成和应用,以实现更强大的功能。以下是一些常见的集成和应用方式:
- 与RDF和OWL集成:SHACL是基于RDF的,因此它可以直接与RDF和OWL(Web Ontology Language)集成。我们可以在RDF和OWL中定义数据和本体,然后用SHACL来验证和推理这些数据和本体。
- 与SPARQL集成:SHACL支持SPARQL(SPARQL Protocol and RDF Query Language),这是一种用于查询RDF数据的语言。我们可以在SHACL中使用SPARQL表达式,以实现更复杂的验证和推理功能。
- 与规则引擎集成:SHACL可以与规则引擎(如Drools、Jess等)集成,以实现基于规则的推理。我们可以在规则引擎中定义规则,然后用SHACL来触发这些规则。
- 与数据处理工具集成:SHACL可以与数据处理工具(如Apache Jena、Protégé等)集成,以实现数据的处理和管理。我们可以在数据处理工具中处理数据,然后用SHACL来验证和推理这些数据。
- 与应用程序集成:SHACL可以与应用程序集成,以实现数据的验证和推理。我们可以在应用程序中使用SHACL API,以实现数据的验证和推理。
从 SPIN 到 SHACL
2017 年 7 月,W3C 批准形状约束语言(SHACL)成为 W3C 官方建议。SHACL 深受 SPIN 的影响,可视为其合法继承者。本文档解释了这两种语言之间的关系,并说明了 SPIN 的每项功能在 SHACL 中基本上都有直接对应的功能,而 SHACL 则对 SPIN 所探索的功能进行了改进。
历史
SPIN 在 2008 年左右作为 TopQuadrant 的 TopBraid Composer 产品中的一项功能开始发展。SPIN背后的驱动因素是,SPARQL查询可以与RDF数据模型一起存储在RDF图中,以定义类及其成员的可执行语义。特别是,SPIN 包含了属性 spin:constraint(将一个类与该类的所有实例都需要满足的约束检查联系起来)和 spin:rule(将一个类与推断规则联系起来,推断规则从实例的声明中构建新信息)。事实证明,这些简单的概念在许多实际问题领域都出奇地有用,并填补了当时其他语义网标准没有解决的一些空白。 随着时间的推移,SPIN 被扩展成一个功能更强大的生态系统,并包含了封装 SPARQL 查询的功能,这样用户就不必再编写 SPARQL 查询,而只需在更高级别的 RDF 词汇表中实例化一个所谓的模板即可。这种封装机制还被用作定义新的 SPARQL 函数的机制,使用户可以用可重复使用的构件来组装 SPARQL 查询。2011 年,SPIN 作为 W3C 成员提交,这是向 W3C 表明业界对 SPIN 所涵盖的一般问题领域(包括对基于 RDF 的数据执行封闭世界约束检查的能力)感兴趣的一种方式。 2014 年,万维网联盟成立了 RDF 数据形状工作组(RDF Data Shapes Working Group),其任务是开发一种新语言,用于表达 RDF 数据的约束。与所有 W3C 工作组一样,来自各种相关组织的成员加入了工作组,每个成员都有各自的要求、偏好和建议方法。SPIN 与 W3C 提交的其他文件一起被作为标准化进程的投入之一。新标准名为 SHACL,其设计理念是提供一个名为 SHACL Core 的高级词汇表和一个扩展机制,允许将 SPARQL 查询与类和其他资源相关联,与 SPIN 的工作方式类似。 SHACL 标准主要通过 SHACL W3C 建议文档来规定,该文档涵盖了 SHACL 核心和 SHACL-SPARQL 扩展机制。该文件涵盖了工作组的任务。不过,一些工作组成员也有兴趣编写其他文档,这两份文档都深受 SPIN 的启发:
SHACL 高级功能
SHACL JavaScript扩展 这两份文件也是 SHACL 工作组的成果之一,但不具备与主规范相同的官方地位。这主要是由于时间限制(在所有工作完成之前,工作组即将到期),但也因为一些功能(如规则和 JavaScript 扩展)超出了工作组正式章程的范围。虽然工作组说明中定义的功能不像 SHACL 的主要功能那样具有可见性,但目前已经有了一些实现方法,包括基于 Apache Jena 的开源项目 SHACL API 和 JavaScript 中的 SHACL-JS API。根据计划,这些文件可能会成为未来工作组正式标准的骨干。
功能比较
以下小节将介绍 SPIN 的主要功能领域,以及它们与 SHACL 相应功能的比较。本表总结了两者的等同性: SPIN 功能 SHACL 功能 SPARQL 中的约束(spin:constraint、sp:Construct 使用 sh:sparql 的形状 高级词汇表中的约束(spin:Attribute、spin:minCount 等) 具有 SHACL 核心属性(sh:property、sh:minCount 等)的形状 SPARQL 中的推理规则(spin:rule、sp:Construct SPARQL 中的推理规则(sh:rule、sh:construct) 高级词汇表中的推理规则(spin:rule、sp:ConstructTemplate 使用节点表达式的推理规则(sh:rule、sh:path、sh:filterShape 等) 用户定义的 SPARQL 函数(spin:Function、spin:body 用户定义的 SPARQL 函数(sh:Function、sh:select) 通用 SPIN 模板(spin:Template) 参见 DASH 模板 魔法属性(spin:MagicProperty) 约:三重规则(sh:rule、sh:predicate 等) JavaScript 支持(SPINx)(spinx:javaScriptCode 用户定义的 JavaScript 函数(sh:Function、sh:jsFunctionName) SPARQL 查询的 RDF 语法(sp:Select、sp:Filter 等 仅限于文本字符串和前缀(sh:select、sh:prefixes 等)
SPARQL 中的限制条件
在 SPIN 中,约束是使用 spin:constraint 属性附加到类上的。该属性的值可以是 SPARQL 查询,也可以是合适的查询模板。本示例使用 SPARQL 约束说明类 parent 的每个实例必须至少年满 18 岁:
ex:Parent
一个 rdfs:Class ;
rdfs:label "Parent" ;
rdfs:subClassOf ex:Person ;
自旋约束
[ a sp:Ask ;
sp:text """
# 必须至少年满 18 岁
ASK WHERE {
this ex:age age .
FILTER (?age < 18) .
}"""
] .
将其直接转换为 SHACL-SPARQL 将如下所示:
ex:Parent
a rdfs:Class, sh:NodeShape ;
rdfs:label "Parent" ;
rdfs:subClassOf ex:Person ;
sh:sparql
[ sh:message "Must be at least 18 years old, but is {?age}" ;
sh:prefixes ex: ;
sh:select """
SELECT $this ?
WHERE {
$this ex:age ?age .
FILTER (?age < 18) .
}"""
] .
除了使用不同的属性外,从 SPIN 到 SHACL 的转换非常简单。需要注意的是,SHACL 建议在执行查询时预先绑定的变量使用 $ 而不是 ?,比如 $this 就是当前已验证的实例。 SHACL 的设计吸取了 SPIN 的经验教训。例如,SPIN 需要使用相当笨拙的 CONSTRUCT 查询来产生比简单的真/假响应更多的响应,而 SHACL 则使用更简单的 SELECT 查询,这些查询可能会返回额外的变量,然后使用 sh:message 获取这些变量来生成消息。对于 SPIN CONSTRUCT 会产生额外三元组的情况,SHACL 的高级功能包括所谓的注释属性(Annotation Properties)。
高级词汇中的限制条件
由于并非每个人都想用 SPARQL 表达约束,SPIN 提供了一种称为模板(Templates)的工具,可用于将基于 SPARQL 的逻辑封装为可参数化的构建模块。作为一个常用的例子,SPIN 标准库包含模板 spl:Attribute,可在下面的示例中使用:
ex:Person
a rdfs:Class ;
spin:约束 [
a spl:Attribute ;
spl:predicate ex:dateOfBirth ;
spl:maxCount 1 ;
spl:valueType xsd:date ;
] .
SHACL 使用几乎相同的语法,只是属性不同而已:
ex:Person
a rdfs:Class, sh:NodeShape ;
sh:property [
sh:path ex:dateOfBirth ;
sh:maxCount 1 ;
sh:datatype xsd:date ;
] .
在这两种语言中,诸如 spl:maxCount 和 sh:maxCount 这样的高级词汇都是由实现可执行语义的 SPARQL 查询支持的。这意味着,在这两种语言中,约束词汇都是自描述的,因此具有一致的可扩展性。在 SHACL 中,与 SPIN 模板相对应的是约束组件(Constraint Components)。约束组件更灵活一些,因为它可以将多种约束类型(如 sh:minCount 和 sh:minLength 混合到同一形状定义中,而 SPIN 模板总是需要新实例和多个 spin:constraint 三元组。 在约束(和规则)的应用目标方面,SHACL 提供了更大的灵活性。SPIN 仅限于类,而 SHACL 的形状既可应用于类,也可应用于通过其他方式派生的节点集。请参阅 SHACL 中的各种目标机制,包括高级功能文档中的自定义目标。但请注意,除非您在形状定义中使用了明确的 sh:targetClass 三元组,并希望将其应用到一个类,否则该类也需要是 sh:NodeShape 的实例。提示:你可以通过在形状图中添加一个 rdfs:Class rdfs:subClassOf sh:NodeShape 三元组来声明每个类都是 sh:NodeShape 的实例。
SPARQL 中的推理规则
基于 SPARQL CONSTRUCT 查询的 SPIN 推断规则也可以直接转换为 SHACL。下面的 SPIN 规则示例推断了一个人的祖父母:
ex:Person
a rdfs:Class ;
rdfs:label "Person" ;
rdfs:subClassOf owl:Thing ;
spin:规则
[ a sp:Construct ;
sp:text """
构造 {
?this ex:grandParent ?grandParent .
}
WHERE {
?parent ex:child ?this .
?grandParent ex:child ?parent .
}"""
] .
SHACL 高级功能文档定义了 SPARQL 规则的语法:
ex:Person
a rdfs:Class, sh:NodeShape ;
rdfs:label "Person" ;
rdfs:subClassOf owl:Thing ;
sh:规则
[ a sh:SPARQLRule ;
sh:前缀 ex: ;
sh:construct """
构造 {
$this ex:grandParent ?
}
WHERE {
父代 ex:child $this .
?grandParent ex:child ?parent .
}"""
] .
SHACL 规则提供了更大的灵活性,因为它们可以与基于形状的前提条件相结合,参见 sh:condition。与约束一样,SHACL 规则也有更强大的目标机制,而不局限于 SPIN 这样的类。 请注意,当前版本的 SHACL 高级功能文档只定义了如何对规则进行单次迭代。这样做主要是考虑到工作组的时间限制,避免出现无限循环等潜在的复杂情况。希望本规范的未来版本能以更灵活的方式弥补这一缺陷。如果需要相互依赖的规则,一种解决方案是使用 sh:order 将它们排序。或者,假设大多数实现都会做显而易见的事情,将迭代作为一个选项来实现。
高级词汇中的推理规则
spin:rule 的值也可以是 SPIN 模板的实例,这样就可以使用比 SPARQL 查询更高级的词汇来定义规则。SPINMap 框架就是一个很好的例子,它能让用户使用图形符号定义类之间的映射。每次转换都会成为 SPIN 规则,并可使用函数调用来即时修改数据,例如将 xsd:string 字面量转换为 xsd:date 字面量。 SHACL 没有完全相同的机制,但可以说是更好的机制: SHACL 节点表达式(高级功能)。这种语法具有与 SPARQL 类似的表达能力,但又不像 SPARQL。节点表达式形成评估链,其中一个表达式的输出被用作下一个表达式的输入。例如,上述 "年龄小于 18 岁 "查询的等价节点表达式为
[
shf:lessThan ( [ sh:path my:age ] 18 )
]
这意味着 SHACL 引擎将首先获取 my:age 的值,然后将其作为第一个参数应用于名为 shf:lessThan 的函数。在上面的示例中,shf:lessThan 被假定为一个通用的 SHACL 函数(用 SPARQL、JavaScript 或其他目标语言实现),将 < 运算符抽象为一个可重复使用的构件。 这种语法特别设计用于表示数据转换任务的规则,并适合映射图等可视化编辑工具。节点表达式可用于 SHACL 三重规则的主语、谓语或宾语位置。下面的示例是对上文 "祖父母 "示例的重写,但使用的是三重规则:
ex:Person
a rdfs:Class, sh:NodeShape ;
rdfs:label "Person" ;
rdfs:subClassOf owl:Thing ;
sh:规则
[ a sh:TripleRule ;
sh:主语 sh:this ;
sh:谓词 ex:grandParent ;
对象
sh:nodes [
sh:path [ sh:inversePath ex:child ] ;
] ;
sh:path [ sh:inversePath ex:child ] ;
] ;
] .
上述规则将为 ex:Person 的任何实例推断 ex:grandParent 的值。第一步,它将 ex:child 的值(反向)匹配到 person。第二步,它将第一步的输出作为以 ex:child 为谓词的三重匹配的主语(同样是反向),然后返回节点流,这些节点将成为以原始 person 为主语、以 ex:grandParent 为谓词的三重匹配的对象。节点表达式框架非常强大,它是基于 SPIN 和 SPINMap 多年的经验而开发的。但请注意,节点表达式不像 SPARQL 那样有变量的概念,因此在某些情况下需要与基于 SPARQL 的 SHACL 规则相结合。
用户定义(SPARQL)函数
SPIN 函数将 SPARQL 代码片段封装成一个可重复使用的构件,这样它就可以像 SPARQL FILTER 和 BIND 表达式中的其他 SPARQL 函数一样被调用。事实证明,这一框架对日常工作极为重要,因为它使查询更易于维护,减少了冗余。 下面的示例定义了一个新的 SPIN 函数 ex:cardinality,用于获取给定主题中给定谓词的值的数量:
ex:cardinality
a spin:Function ;
rdfs:subClassOf spin:Functions ;
rdfs:注释 "获取给定主题中给定属性值的个数。" ;
rdfs:label "cardinality"^^xsd:string ;
spin:returnType xsd:integer ;
spin:constraint [
一个 spl:参数;
rdfs:注释 "要获取中心度的主题";
spl:predicate sp:arg1 ;
] ;
自旋约束 [
a spl:Argument ;
rdfs:注释 "要获取其千分点的属性";
spl:predicate sp:arg2 ;
] ;
spin:body [
a sp:Select ;
sp:text """
SELECT (COUNT(?object) AS ?result)
WHERE {
?arg1 ?arg2 ?object .
}"""
] .
在高级功能文档中,SHACL-SPARQL 包含一个几乎相同的功能。上面的示例将变成
ex:cardinality
a sh:SPARQLFunction ;
rdfs:subClassOf spin:Functions ;
rdfs:comment "获取给定主题中给定属性值的数量。" ;
rdfs:label "cardinality"^^xsd:string ;
sh:returnType xsd:integer ;
sh:参数
sh:description "要获取中心性的主题";
sh:path ex:arg1 ;
] ;
参数
sh:description "要获取万有引力的属性";
sh:path ex:arg2 ;
] ;
sh:prefixes ex: ;
sh:select """
SELECT (COUNT(?obj
sh:select """
SELECT (COUNT(?object) AS ?result)
WHERE {
$arg1 $arg2 ?object .
}""" .
神奇属性
SPIN 包含 SPIN 函数框架的一个概括,用于函数需要返回多个值(行)或多个变量(列)的情况。这些所谓的神奇属性依赖于许多 SPARQL 实现所支持的一种功能,而这种功能并不是 SPARQL 官方标准的一部分,即处理 SPARQL WHERE 子句中某些谓词的能力,以便在查询执行时计算它们的值。 这种情况使得 SPIN 的神奇属性很难推广到 SHACL 中。SHACL 所提供的最接近的功能是推理,尤其是三重规则(Triple Rules)。简而言之,如果需要为一个神奇谓词返回多个值,可定义一个三重规则,将 sh:this 作为 sh:subject,将给定谓词作为 sh:predicate,而 sh:object 则是一个提供实际值的节点表达式。根据这些信息,工具可以自动计算推断出的值,例如作为 SPARQL 查询中的魔法属性,或(如 TopBraid 网络产品所实现的)作为显示表单上的动态计算属性。 在 SHACL 中,没有与返回多列的神奇 SPIN 属性相对应的属性。在这种情况下,魔法属性需要分解成多个单独的属性。
JavaScript 支持
与其他功能相比,SPIN 包含一个词汇表,用于声明由 JavaScript 代码支持的新 SPARQL 函数。这种所谓的 SPINx 框架是一种高度灵活的机制,可以根据 JavaScript 库可以实现的任何功能,执行几乎任意的值计算。 SPINx 框架激发了一个全新的规范--SHACL JavaScript 扩展,该规范由 SHACL WG 以类似于高级功能文档的注释形式发布。SHACL-JS 比 SPINx 强大得多,因为它基本上是 SHACL-SPARQL 的完整替代方案,允许用户表达由 JavaScript 逻辑支持的约束、约束组件、规则和自定义目标。有了这个框架,就可以编写可由 SPARQL 处理器或 JavaScript 引擎(如客户端或使用 Node.js)执行的 SHACL 代码。开源的 SHACL-JS 应用程序接口为在线 SHACL Playground 提供了基础,全部使用 JavaScript 实现。 关于 SHACL-JS 与 SHACL 其他组件的关系,请参阅 SHACL 功能文章。
SPARQL 查询的 RDF 语法
SPIN 包含两种用 RDF 表示 SPARQL 查询的方法。最全面的变体是将 SPARQL 查询的结构分解为单个语法树元素,作为一种深度 RDF 结构。例如,SPARQL 查询
# 必须至少年满 18 岁
ASK WHERE {
?this my:age ?age .
FILTER (?age < 18) .
}
可以用 SPIN RDF 语法表示为
[ a sp:Ask ;
rdfs:comment "must be at least 18 years old" ;
sp:where (
[ sp:object sp:_age ;
sp:谓词 my:age ;
sp:主题 spin:_this
]
[ a sp:Filter ;
sp:表达式
[ sp:arg1 sp:_age ;
sp:arg2 18 ;
a sp:lt
]
])
]
这种语法的显著优点是,查询结构本身成为一种数据结构,可以通过编程进行查询或生成。这种语法的明显缺点是很难为人类读取或输入文本 RDF 文件。因此,SPIN 提供了一种基于文本字符串的更简单的变体:
[ a sp:Ask ;
sp:text """
# 必须年满 18 岁
ASK WHERE {
this my:age age .
FILTER (?age < 18) .
}"""
]
与之对应的 SHACL 将如下所示:
[
sh:ask """
# 必须年满 18 岁
ASK WHERE {
this my:age age .
FILTER (?age < 18) .
}""" ;
sh:prefixes my: ;
]
SHACL 清除了 SPIN 使用的与命名空间前缀有关的相当模糊的黑客行为。使用 sp:text 时的假设是,查询只能在它们所定义的图中进行解析,而所需的前缀声明实际上并不是 RDF 图标准的一部分(尽管大多数实现都会维护它们)。相反,SHACL 引入了前缀管理词汇,这对形状以外的其他用例也可能有用。 SHACL 并不支持像 SPIN 这样的深度结构化 SPARQL RDF 语法,这仅仅是因为在一个包括许多对 SPARQL 功能整体并不热衷的成员的工作组中,定义其所有细节和测试用例等过于繁琐和耗时。W3C 的政治要求各方做出妥协。减少功能也可以降低实施者的成本。 有关 SPIN SPARQL 语法的 SHACL 替代方案,请参阅 "高级词汇中的推理规则 "部分。
展望
尽管 SPIN 是由 TopQuadrant 创建的,但后来被其他各种团体和产品所采用。本节仅反映 TopQuadrant 的观点和期望。 SHACL 几乎在所有方面都取代了 SPIN。正如本文档所概述的,SHACL 基本上包含 SPIN 的所有功能,甚至更多。最重要的是,SHACL 是 W3C 的官方建议,这使得其他供应商更有可能支持它。因此,与 SPIN 相比,TopQuadrant 更倾向于使用 SHACL 来实现新功能。SPIN将无限期地继续得到支持,因为有很多生产代码在各种用途中大量使用了SPIN。