Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档定义了 SHACL 的核心。
SHACL,即形状约束语言,是一种用于描述 RDF 图结构的语言。 SHACL 可用于定义类以及这些类的实例可以具有的属性。 比类和实例更通用的是,SHACL 引入了形状的概念, 它可以形式化地指定 RDF 节点和边结构上的约束。 SHACL 形状本身表示在称为形状图的 RDF 图中。 由形状图描述的 RDF 图称为数据图。
SHACL 可用于多种目的,例如 验证、推理、领域建模、生成本体以告知其他代理、 构建用户界面、生成代码以及集成数据。
本节描述本文档在发布时的状态。当前 W3C 出版物以及本技术报告最新修订版的列表可在 W3C 标准和草案 索引中找到。
本文档由 Data Shapes 工作组作为 工作草案发布,采用 推荐标准 轨道。
发布为 工作草案并不意味着 W3C 及其成员认可。
这是一份草案文档,可能随时被其他 文档更新、替换或废弃。除作为正在进行中的工作外,不宜引用本文档。
本文档由一个依据 W3C 专利 政策运作的小组制作。 W3C 维护了一份 任何专利 披露的公开列表, 这些披露与该小组的交付物相关;该页面还包括 披露专利的说明。实际知晓某项专利且认为该专利包含 必要权利要求 的个人,必须依照 W3C 专利政策第 6 节披露相关信息。
本文档受 2025 年 8 月 18 日 W3C 流程文档约束。
本规范是 SHACL 1.2 规范族的一部分。有关它们的更详细 介绍,请参阅 SHACL 1.2 概述。
这些规范如下:
工作草案:
工作组说明草案:
实现者可以通过成功通过 SHACL 1.2 测试套件 的测试用例,部分检查其对上述规范的一致性级别。 但请注意,通过测试套件中的所有测试并不意味着完全符合这些 规范。 它只意味着该实现符合测试套件所测试的那些方面。
引言包含一个术语小节。
第 2 节和第 3 节涵盖 SHACL 形状和约束,以及属性路径。
第 4 节介绍节点表达式,而第 5 节定义 SHACL 中的验证。
第 6 节定义内置的 SHACL Core 约束组件,第 7 节讨论非验证性 属性。
SHACL 的语法是 RDF。 本文档中的示例使用 Turtle [rdf12-turtle] 和 JSON-LD [json-ld]。 实践中也可以使用其他 RDF 序列化格式,例如 RDF/XML。 读者应熟悉基本 RDF 概念 [rdf12-concepts],例如三元组。
本文档规定了 SHACL(Shapes Constraint Language,形状约束语言)的核心,这是一种用于描述和 验证 RDF 图的语言。 本节通过关键术语概述和一个用于说明基本 概念的示例来介绍 SHACL。
本文档通篇使用以下术语。
链接到 RDF 1.2 Concepts and Abstract Syntax 各部分的术语,在 SHACL 中按该处定义使用。链接到 SPARQL 1.2 Query Language 各部分的术语,在 SHACL 中按该处定义使用。对 某个术语的一次链接足以为本文档中该术语的所有出现提供 定义。
定义在本文档内是完备的,即,如果本文档中没有规则使 某种情况为真,则该情况为假。
n,谓词为 p,且宾语为 v,则一个
RDF 项 n 对属性 p 具有
值 v。
短语“图 G 中 P 的每个值……”表示“G 中谓词为 P 的三元组的每个宾语
……”
(在本文档中,动词 specify 或 declare 有时用于表达
某个 RDF 项在图中对给定谓词具有值这一事实。)
G 执行 SPARQL
查询
SELECT ?s ?o WHERE { ?s p' ?o } 的结果中存在一个
解映射,
它将 ?s 绑定到
n 并将 ?o 绑定到 v,其中 p' 是
p 的 SPARQL 表层语法,则 RDF 项 n 在 RDF 图 G 中对
SPARQL 属性
路径表达式
p 具有值 v。
G 中的一个
SHACL 列表
是一个 IRI
或一个 空白节点,
它要么是 rdf:nil(前提是 rdf:nil 对
rdf:first 或 rdf:rest 均没有
值),
要么在 G 中对属性 rdf:first 恰好有一个
值,
并且在 G 中对属性 rdf:rest 恰好有一个
值,
该值在 G 中也为 SHACL 列表,
并且该列表在
G 中不将自身作为属性路径 rdf:rest+ 的值。
G 中除 rdf:nil 之外的任一 SHACL 列表的
成员由其在 G 中对 rdf:first 的值,
后接其在 G 中对 rdf:rest 的值在 G 中的
成员组成。
SHACL 列表 rdf:nil 在任何 RDF 图中都没有成员。
在本文档中,使用以下命名空间前缀定义:
| 前缀 | 命名空间 |
|---|---|
owl: |
http://www.w3.org/2002/07/owl# |
rdf: |
http://www.w3.org/1999/02/22-rdf-syntax-ns# |
rdfs: |
http://www.w3.org/2000/01/rdf-schema# |
sh: |
http://www.w3.org/ns/shacl# |
xsd: |
http://www.w3.org/2001/XMLSchema# |
ex: |
http://example.com/ns# |
在本文档中,使用以下 JSON-LD 上下文:
{
"@context": {
"owl": "http://www.w3.org/2002/07/owl#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"sh": "http://www.w3.org/ns/shacl#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"ex": "http://example.com/ns#"
}
}
请注意,定义 SHACL 词汇本身的图的 URI 等同于
上述命名空间,即它包括 #。
对 SHACL 词汇的引用,例如通过 owl:imports,应包括
#。
在整个文档中,会出现包含 Turtle、JSON-LD 和 SHACL-C 中 RDF 图的 彩色编码框。 这些 Turtle 文档片段使用上面给出的前缀绑定。 JSON-LD 文档片段使用上面给出的上下文。 只有 Turtle 文档可以突出显示某些部分。 SHACL-C 规范并不稳定——本文档中的 SHACL-C 文档片段是 资料性的
像这样的灰色框包含适用于形状图的语法规则。
true 表示 RDF 项 "true"^^xsd:boolean。
false 表示 RDF 项 "false"^^xsd:boolean。
除标记为非规范性的章节外,本规范中的所有编写指南、图示、示例和注释 均为非规范性的。本规范中的其他所有内容均为规范性的。
本文档中的关键词 MAY、MUST、MUST NOT、SHOULD 和 SHOULD NOT 当且仅当它们像此处所示以全 大写形式出现时,应按 BCP 14 [RFC2119] [RFC8174] 中的说明解释。
本文档定义 SHACL Core 语言,也简称为 SHACL。 本规范描述以下对象的一致性标准:
本文档包括形状和其他节点需要在形状图中满足的语法规则。 这些规则通常采用 A shape must have...、The values of X are literals 或 All objects of triples with predicate P must be IRIs 的形式。 这些规则的完整列表可在附录中找到。 违反任一此类规则的节点称为 格式不良。 不违反任何这些规则的节点称为 格式良好。
owl:imports 语句确定)
满足 OWL 2 语法规范
[owl2-syntax]
第 3.4
节定义的约束,
即它不包含两个形状图,其中:
owl:versionIRI 值),或者
owl:incompatibleWith 注解,其值等于
另一个的形状图 IRI 或 owl:versionIRI。
SHACL 使用 RDF 和 RDFS 词汇,但并不要求完整的 RDFS 推理。
不过,SHACL 处理器可以在包含蕴涵的 RDF 图上操作
[sparql12-entailment],
无论这些蕴涵是在提交给 SHACL 处理器之前预先计算的,还是作为
SHACL 处理的一部分即时执行的(不修改数据图或形状图)。
为支持蕴涵处理,SHACL 包含属性
sh:entailment,用于指示给定形状图所需的推理。
属性
sh:entailment 的值
是 IRI。
此属性的常见值由 [sparql12-entailment] 涵盖。
SHACL 实现可以支持蕴涵机制,但并非必须支持。
如果一个形状图包含任一
三元组,其
谓词为 sh:entailment 且
宾语为 E,
并且 SHACL 处理器不支持 E 作为给定数据
图的蕴涵机制,
则该处理器必须发出失败信号。
否则,SHACL 处理器必须为形状图中
sh:entailment 的所有值提供蕴涵,
并且在验证过程中,针对数据
图的所有查询都必须返回任何推断出的三元组。
本节是非规范性的。
在本节中,我们将通过一个简单示例,引入 SHACL Core 的基础。 你将学习如何描述你的数据应当是什么样子,以及 SHACL 处理器如何检查你的数据 是否满足该描述。
假设你有一组实体(Alice、Bob、Calvin),并且你想向计算机或另一个 人说明:
ex:Person 的类,它是这些实体的类型
ex:Person 的每个实例至多有一个社会安全号码(SSN),并且该 SSN
需要是格式正确的文本(例如 123-45-6789)
ex:Person 的每个实例可以为一个或多个公司工作,但这些公司
必须在你的数据中被类型化为 ex:Company
ex:ssn)、工作隶属关系(ex:worksFor)以及强制类型
(rdf:type)之外,ex:Person 不允许有其他属性
以下是我们要描述和验证的数据:
下面是一个自包含示例,展示如何表示我们关注的领域。 在 SHACL 术语中,这称为形状图,但你也可以把它看作 一个领域模型或一个本体。
让我们来拆解一下:
sh:targetClass ex:Person 表示“将此约束应用于所有人”。
sh:property 定义声明:
sh:datatype xsd:string),
sh:maxCount 1),
sh:pattern "^\d{3}-\d{2}-\d{4}$")。
sh:property 定义声明:
ex:worksFor 属性,它的值必须是一个 IRI,并且指向
某个属于 ex:Company 的对象。
sh:closed true 表示不允许超出所列属性之外的属性(显式忽略的属性除外)。
sh:ignoredProperties ( rdf:type ) 允许 rdf:type 通过,
即使它不在允许的属性列表中。
当我们使用形状图对我们的数据图运行 SHACL 验证时, 验证器会根据我们编写的约束检查每个 Person。
用普通英语来说,它发现了以下内容:
987-65-432A 在应该是
数字的位置有一个字母)。
sh:maxCount 表示只
允许一个)。
ex:UntypedCompany)工作,而该对象未声明为
ex:Company。
ex:birthDate,而该属性不被形状允许。
下面是此示例的 SHACL 验证报告可能呈现的样子(为便于阅读而简化):
如何阅读该报告:
sh:ValidationReport 是总体报告,其中 sh:conforms false 表示
至少存在一个违规。
sh:ValidationResult 都是发现的一个问题:
sh:resultSeverity —— 告诉你问题的严重程度。在此示例中,所有
问题都是 sh:Violation(最高且默认的严重性)。
sh:focusNode —— 验证失败的数据节点。
sh:resultPath —— 涉及的属性。
sh:value —— 触发失败的实际值。
sh:sourceConstraintComponent —— 哪种约束被破坏(最大计数、
模式、类等)。
sh:sourceShape —— 定义该约束的形状。
sh:resultMessage —— 面向人类可读的解释。
虽然 SHACL 主要设计用于表示形状,但它也借用了 RDF Schema 命名空间中的
rdfs:Class 和 rdfs:subClassOf 等术语和概念。
有些人更喜欢将这些概念分开,如上面的原始示例所示,
其中 ex:Person 和 ex:PersonShape 是分离的实体。
不过,也可以将它们更紧密地耦合在一起,并使用 sh:ShapeClass
同时声明一个类和一个形状。
此外,有时你会看到属性形状被声明为空白节点,而不是 IRI。 这是一种更紧凑的记法,但它意味着该属性形状不容易从 外部引用;例如,如果某个其他图想复用一个节点形状但停用一个属性 形状。
以下 Turtle 示例展示了这两种语法变体的实际用法。
我们可以使用上面的形状声明来介绍 SHACL 使用的一些正式术语。 这可能有助于你阅读本规范的其余部分。
ex:PersonShape 这个形状的
目标
是 ex:Person 这个类的所有 SHACL 实例的集合。
这是使用属性 sh:targetClass 指定的。
在验证期间,这些目标节点会成为该形状的焦点节点。
ex:PersonShape 这个形状
是一个节点形状,这意味着它应用于焦点节点。
它声明了关于焦点节点的约束,例如使用
sh:closed 和
sh:ignoredProperties 这些参数。
该节点形状还使用属性
sh:property 声明了另外两个约束,
并且每个约束都由一个属性形状支持。
这些属性形状使用 sh:datatype 和
sh:maxCount 等参数声明额外的约束。
某些属性形状会指定来自多个
约束组件的参数,以便
限制属性值的多个方面。
例如,在 ex:ssn 的属性形状中,使用了来自三个
约束组件的参数。
这些约束
组件的参数是 sh:datatype、sh:pattern 和
sh:maxCount。
对于每个焦点节点,ex:ssn 的属性值都将根据这三个组件进行
验证。
以下引言是非规范性的。
以下非正式图示概述了 SHACL 词汇中的一些关键类。
每个框表示一个类。
类名下方的框列出了这些类的实例可能具有的一小部分常用属性,
以及它们的值类型。
箭头表示 rdfs:subClassOf 三元组。
SHACL 词汇的 Turtle 序列化包含完整的 SHACL 词汇。
注意,上面的定义并未包含格式良好形状的所有语法规则。
这些规则分布在整个文档中,并在附录 A. SHACL
语法规则摘要中汇总。
例如,具有字面量作为 sh:targetClass 值的形状是格式不良的。
非正式地说,形状根据焦点节点的属性 值和其他特征, 决定如何验证该焦点节点。 例如,形状可以声明某个焦点节点必须是 IRI,或者声明某个焦点节点对某个属性具有特定值, 并且该属性还具有最小数量的值。
SHACL Core 语言定义了两种类型的形状:
sh:Shape 是 SHACL 词汇中这两种形状类型的
SHACL 超类。
其子类 sh:NodeShape 和 sh:PropertyShape 可以分别用作节点形状和属性形状的
SHACL 类型。
一个 约束 组件是一个 IRI。 每个约束组件都有一个或多个 必需 参数,每个参数都是一个属性。 每个约束组件都有零个或多个 可选 参数,每个参数都是一个属性。 约束组件的 参数是其必需参数加上 其可选参数。
例如,组件
sh:MinCountConstraintComponent 声明参数
sh:minCount,用于表示这样一种限制:
某个节点对某个特定属性至少具有最小数量的值。
对于一个具有必需参数 p1, ...
pn 的约束组件 C,
当形状图 SG 中的一个形状
s 在 SG 中对 pi 具有
vi 作为值时,
s 声明一个具有种类
C、且具有必需参数值
<p1,v1>, ... <pn,vn>
的约束。
对于具有可选参数的约束组件,
约束声明由该形状对该组件所有必需参数和可选
参数所具有的值组成。
有些约束组件只声明单个参数。
例如 sh:ClassConstraintComponent 只有单个
参数 sh:class。
这些参数可以在同一个形状中多次使用,
并且这类参数的每个值都声明一个单独的约束。
这些声明的解释是合取,即所有约束都适用。
下面的示例指定 ex:customer 的值必须同时是
ex:Customer 和 ex:Person 的SHACL 实例。
某些约束组件(如 sh:PatternConstraintComponent)声明多个
参数。
对这类组件的任一参数具有多个值的形状是格式不良的。
绕过此语法规则的一种方式是将约束分散到多个(属性)形状中, 如下例所示。
约束组件与验证器相关联, 验证器提供关于如何使用参数来验证数据的指令(例如通过 SPARQL 查询表达)。 针对某个形状验证一个 RDF 项, 涉及使用相应组件关联的验证器, 针对每个约束来验证该项;其中该 形状对该约束所属组件的所有必需 参数都具有值。
SHACL Core 中包含的约束组件列表在第 4 节中描述。 SHACL-SPARQL 可用于声明额外的基于 SPARQL 的约束组件。
使用来自数据图的三元组针对某个形状进行验证的 RDF 项称为焦点节点。
本节其余部分是非规范性的。
形状图中一个形状的
目标声明是一些三元组,
这些三元组以该形状为主语,并以本文档描述的某些属性
(例如 sh:targetClass)作为谓词。
此外,sh:shape 三元组可以在数据图中声明目标。
目标声明可用于为某个形状产生焦点节点。
一个目标声明的目标是通过将本节其余部分描述的规则应用于
数据图而产生的
RDF 项集合。
形状的目标是为该形状声明的各个
目标
所产生的所有 RDF 项的并集。
SHACL Core 包括以下种类的目标:
本引言的其余部分是非规范性的。
目标产生的 RDF 项不要求作为节点存在于数据图中。
当焦点节点被直接作为该形状验证过程的输入提供时,形状的目标会被忽略。
这包括如下情况:该形状是某个期望形状的约束参数(例如
sh:node)的值,并且
在验证相应约束组件(例如 sh:NodeConstraintComponent)期间确定了一个焦点节点。
在这种情况下,提供的焦点节点无需位于形状的
目标中。
节点
目标使用 sh:targetNode 谓词指定。
形状中
sh:targetNode 的每个值都是一个格式良好的节点表达式。
s 是形状图 SG 中的一个形状,并且
s 在
SG 中对 sh:targetNode 具有
值
expr,
则
evalExpr(expr, data graph, s, {})
的输出节点
是以数据图 DG 作为焦点图时的目标。
本节其余部分是非规范性的。
对于下面的示例数据,只有 ex:Alice 是所提供形状的目标:
类
目标使用 sh:targetClass 谓词指定。
形状中
sh:targetClass 的每个值都是一个 IRI。
s 是形状图 SG 中的一个形状,且 s 在
SG 中对
sh:targetClass 具有值 c,则数据图
DG 中 c 的 SHACL
实例集合,是从 DG 为 SG 中的 s 得到的一个目标。
本节其余部分是非规范性的。
在此示例中,只有 ex:Alice 和 ex:Bob 是焦点节点。
请注意,根据 SHACL 实例定义,
遍历类层级所需的所有 rdfs:subClassOf 声明都需要存在于
数据图中。
但是,ex:Person a rdfs:Class 三元组并不要求存在于任一
图中。
在下面的示例中,被选中的焦点节点只有 ex:Who。
请注意,rdfs:subClassOf 三元组可以从形状图中查询
(参见 6.3
rdfs:subClassOf
三元组的图),在这种情况下,上例中的 rdfs:subClassOf 三元组
不需要位于数据图中。
非正式地说,如果一个形状也在形状图中声明为一个类,那么 该类的所有 SHACL 实例都是该形状的目标。
如果 s 是 RDF 图 G 中 sh:NodeShape 或
sh:PropertyShape
的 SHACL 实例,
并且 s 在 G 中也是
rdfs:Class 的SHACL
实例,且 s 不是 IRI,
则 s 是 G 中的一个格式不良形状。
s 是形状图 SG 中 sh:NodeShape 或
sh:PropertyShape
的 SHACL 实例,并且 s 在 SG 中也是
rdfs:Class
的SHACL 实例,
则数据图 DG 中 s 的
SHACL 实例集合,是从 DG 为
SG 中的 s 得到的一个目标。
SHACL 命名空间包含专用类 sh:ShapeClass,它可以作为
隐式类目标模式的语法捷径。
sh:ShapeClass 是 sh:NodeShape 和
rdfs:Class 二者的 rdfs:subClassOf。
如果 s 是形状图 SG 中 sh:ShapeClass 的 SHACL 实例,
则数据图
DG 中 s 的 SHACL 实例集合,是从 DG 为
SG 中的
s 得到的一个目标。
请记住,某些不了解 SHACL 的实现可能不会理解 sh:ShapeClass 是
rdfs:Class 的子类。
因此,建议(但不要求)使用 sh:ShapeClass 的图
包含一个 owl:imports sh: 语句。
本节其余部分是非规范性的。
在下面的示例中,ex:Alice 是一个焦点节点,因为它是
ex:Person 的 SHACL 实例,
而 ex:Person 在形状图中既是类也是形状。
在上述示例的以下变体中,ex:Person 被声明为
sh:ShapeClass 的实例,
其解释相同。
subjects-of 目标使用谓词
sh:targetSubjectsOf 指定。
形状中
sh:targetSubjectsOf 的值是 IRI。
s 是形状图 SG 中的一个形状,并且 s 在
SG 中对 sh:targetSubjectsOf 具有值
p,则数据图 DG 中作为 DG 内谓词为
p 的三元组的主语的节点集合,
是从 DG 为 SG 中的 s 得到的一个
目标。
本节其余部分是非规范性的。
在上面的示例中,只有 ex:Alice 会根据给定形状进行验证,
因为它是一个以 ex:knows 作为谓词的
三元组的主语。
objects-of 目标使用谓词
sh:targetObjectsOf 指定。
形状中
sh:targetObjectsOf 的
值是
IRI。
s 是形状图 SG 中的一个形状,并且 s 在
SG 中对 sh:targetObjectsOf 具有值
p,则数据图 DG 中作为 DG 内谓词为
p 的三元组的宾语的节点集合,
是从 DG 为 SG 中的 s 得到的一个
目标。
本节其余部分是非规范性的。
在上面的示例中,只有 ex:Bob 会根据给定形状进行验证,
因为它是一个以 ex:knows 作为谓词的
三元组的宾语。
where 目标使用 sh:targetWhere
谓词指定。
形状中 sh:targetWhere 的每个值都是一个格式良好的形状。
s 是形状图 SG 中的一个形状,并且 s 在
SG 中对
sh:targetWhere 具有值 w,则数据图
DG 中符合 w 的节点集合,是从
DG 为 SG 中的 s 得到的一个目标。
本节其余部分是非规范性的。
TODO
在此示例中,只有 ex:Bob 是 ex:AdultPerson 的焦点节点,
因为他符合 sh:targetWhere 形状定义的两个约束。
基于 sh:class 约束,他是 ex:Person 的
SHACL
实例,
并且他的 ex:age 大于或等于 18。
然而,由于 ex:AdultPerson 形状声明所有成年人都必须对
ex:votedFor 具有一个值,
ex:Bob 不符合 ex:AdultPerson。
注意,sh:targetWhere 可以解释为一个“定义”,为某个形状提供
必要且充分的条件。
因此,它可能用于“分类”任务,例如收集所有
满足给定条件集合的节点。
需要提醒的是,where 目标计算的性能可能因实现而异。 在最坏情况下,引擎需要遍历数据图中的所有节点,并逐个过滤它们。
显式形状目标使用 sh:shape
谓词指定。
sh:shape
的每个值都是一个 IRI。
本节其余部分是非规范性的。
sh:shape 不同于 sh:targetNode,虽然二者都可用于
将单个节点与形状链接起来。
sh:shape 从特定主语节点指向一个宾语形状。
此外,sh:targetNode 三元组是从形状图中查询的,
而 sh:shape 三元组预期位于数据图中。
对于下面的示例数据,只有 ex:Alice 是所提供形状的目标:
形状可以在形状图中为属性 sh:severity 指定一个
值。
sh:severity 的每个值都是一个 IRI。
除了按形状声明严重性之外,属性 sh:severity 还可以用于一个三元组的
具化器上,其中该三元组以形状为主语,并以该约束的参数之一作为谓词。
令 T 为在某个形状中表示约束的一组
三元组。
一个形状图可以在 T 中这些
三元组的具化器中,为属性 sh:severity
指定至多一个值。
sh:severity 的值称为严重性。
SHACL 包括下表列出的 IRI,用于表示严重性。
它们在 SHACL 词汇中声明为 sh:Severity 的 SHACL 实例。
| 严重性 | 描述 |
|---|---|
sh:Trace |
一条不是约束违规的跟踪消息。 |
sh:Debug |
一条不是约束违规的调试消息。 |
sh:Info |
表示信息性消息的非关键约束违规。 |
sh:Warning |
表示警告的非关键约束违规。 |
sh:Violation |
约束违规。 |
本节其余部分是非规范性的。
验证过程根据一致性检查处理 sh:severity 的值。
此外,用户界面工具可以使用这些值对验证结果进行分类。
sh:severity 的值由 SHACL 处理器用来填充验证结果的
sh:resultSeverity 字段,参见验证结果中关于严重性的章节。
任何 IRI 都可以用作严重性。
对于每个形状和约束,如果未指定 sh:severity,
默认值为 sh:Violation。
以下示例说明了这一点。
以下示例是上面形状图的一个变体,但使用具化来 指定单个约束的严重性:
形状可以具有属性 sh:message 的值。
sh:message 的值是具有数据类型
xsd:string、rdf:dirLangString、rdf:langString 或
rdf:HTML 的字面量。
一个主语不应对 sh:message 具有多个带相同语言标签的值,
也不应具有多个数据类型为 xsd:string 的值。
如果一个形状在形状图中至少具有一个 sh:message 的值,则
由该形状产生的所有验证结果都会恰好具有这些消息
作为其 sh:resultMessage 的值,即这些值会从形状
图复制到结果图中。
除了按形状声明消息之外,属性 sh:message 还可以用于一个三元组的
具化器上,其中该三元组以形状为主语,并以该约束的参数之一作为谓词。
令 T 为在某个形状中表示约束的一组
三元组。
一个形状图可以在 T 中这些
三元组的具化器中,为属性 sh:message
指定至多一个值。
本节其余部分是非规范性的。
有关如何填充 sh:resultMessage 值的更多详细信息,
请参阅验证结果中关于 sh:resultMessage 的章节。
前一节中的示例使用此机制为第二个验证结果提供 两条消息。 以下示例是一个使用具化声明消息的变体。
形状对属性
sh:deactivated 最多可以具有一个值。
sh:deactivated 的值是一个节点表达式,
其(唯一)输出节点必须是 true 或
false。
令 expr 为一个形状中
sh:deactivated 的值。
如果
evalExpr(expr, data graph, focus node, {})
产生 true 作为其唯一
输出节点,则该形状称为已停用。
已停用的形状在验证期间会被忽略。
除了停用一个形状的所有约束之外,还可以停用 单个约束。 这通过具化完成。
一个以形状为主语、
以参数(例如 sh:minCount)为
谓词的
三元组,最多可以具有一个
带有属性 sh:deactivated 的值的
具化器。
令 expr 为一个具化器中 sh:deactivated 的
值,该具化器位于一个
三元组上,
该三元组以形状为主语,并以一个参数作为谓词。
如果
evalExpr(expr, data graph, focus node, {})
产生 true 作为其唯一
输出节点,则使用该三元组的约束称为已停用约束。
已停用约束在验证期间会被忽略。
本节其余部分是非规范性的。
在 SHACL Core 中,sh:deactivated 唯一有效的值是
常量字面量节点表达式
true 和 false。
此特性的用例包括形状复用和调试。
在从其他图或文件将形状导入给定形状图的场景中,
可以在本地形状图中将导入形状的 sh:deactivated 设置为 true,
以排除不适用于当前应用上下文的形状。
这使得复用他人开发的 SHACL 图成为可能,即使你不同意原作者所作的某些
假设。
如果形状作者预期某个形状可能需要被他人禁用或修改,最佳实践是
对实际形状使用 IRI,而不是空白节点。
例如,形状 ex:PersonShape 上属性
ex:name 的一个属性形状可以具有 IRI
ex:PersonShape-name。
sh:deactivated 的另一个典型用例是在形状的开发和测试期间
(临时)禁用某些形状。
以下示例说明如何使用 sh:deactivated 来停用形状。
在从其他图导入形状的情况下,sh:deactivated true 三元组
会位于导入图中。
对于以下数据,即使该实例对 ex:name 没有任何值,
也不会报告约束违规。
以下变体使用具化只停用 sh:minCount
约束,而不影响同一属性形状上的其他约束。
节点形状是形状图中的一个
形状,
它不是一个以 sh:path 作为谓词的三元组的主语。
建议(但不要求)将一个节点形状声明为 sh:NodeShape 的
SHACL 实例。
sh:NodeShape 的SHACL 实例不能对属性 sh:path 具有
值。
非正式地说,节点形状指定需要相对于焦点 节点满足的约束。 与属性形状不同,它们主要应用于焦点节点本身, 而不是其属性值。
属性形状是形状图中的一个
形状,
它是一个以 sh:path 作为谓词的三元组的主语。
一个形状对 sh:path
最多有一个值。
属性形状中
sh:path 的值是一个格式良好的
SHACL 属性路径。
建议(但不要求)将一个属性形状声明为 sh:PropertyShape 的
SHACL 实例。
sh:PropertyShape 的SHACL 实例对属性 sh:path
具有一个
值。
一个属性形状
对属性 sh:values 最多有一个值,并且该值
是一个格式良好的节点
表达式。
一个属性形状对属性
sh:defaultValue 最多有一个值,并且该
值是一个格式良好的节点表达式。
只有当一个属性形状对
sh:path 的值是
谓词路径时,它才可以对
sh:values 和/或 sh:defaultValue 具有值。
非正式地说,属性形状指定需要相对于可从焦点
节点到达的节点满足的约束:
(a) 直接沿着给定属性(使用
sh:path 指定为一个 IRI),
(b) 直接沿着任何其他SHACL 属性路径(使用
sh:path 指定),
(c) 求值使用 sh:values 指定的节点表达式,或者
(d) 如果不存在其他值,则求值使用
sh:defaultValue 指定的节点表达式。
请注意,SHACL Core 不要求支持 sh:values 和 sh:defaultValue,
但对于诸如 [shacl12-sparql] 这样的扩展来说是必要的。
请注意,格式良好属性形状和节点 形状的定义使这两组节点互不相交。
以下示例说明属性形状的一些语法变体。
SHACL 包括用于表示以下 SPARQL 属性
路径子集的 RDF 项:
PredicatePath、InversePath、SequencePath、
AlternativePath、
ZeroOrMorePath、OneOrMorePath 和 ZeroOrOnePath。
以下小节提供格式良好的 SHACL 属性路径的
语法规则,以及到 SPARQL 1.2 属性路径的映射规则。
这些规则定义了 RDF 图 G 中 RDF 项 p 的路径映射 path(p,G),其中 p 是
G 中的 SHACL
属性路径。
当两个 SHACL 属性路径映射到完全相同的 SPARQL 属性路径时,它们被视为等价路径。
RDF 图中的一个节点是一个格式良好的 SHACL 属性
路径 p,当且仅当它恰好满足以下
小节中的一个语法规则。
如果节点 p 是
空白节点,且 p 的任何路径映射直接或传递地引用 p,则节点 p 不是
格式良好的 SHACL 属性路径。
以下示例说明了一些有效的 SHACL 属性路径,以及它们的 SPARQL 1.2 等价形式。
谓词 路径是一个 IRI。
如果 p 是一个谓词路径,则 path(p,G) 是一个
SPARQL PredicatePath,其中 p 作为 iri。
序列 路径是一个空白节点,它是一个SHACL 列表, 具有至少两个成员,且每个成员都是格式良好的 SHACL 属性路径。
如果 p 是 G 中一个序列路径,其列表成员
为 v1、v2、...、vn,
则 path(p,G) 是一个 SPARQL SequencePath,其中
path(v1,G) 作为 elt1,并且列表节点
v2 的路径映射
结果作为 elt2。
替代
路径是一个空白节点,它是
G 中恰好一个三元组的主语。
该三元组以 sh:alternativePath 作为谓词,以 L 作为宾语,
且 L 是一个SHACL 列表,具有至少两个成员,
且 L 的每个成员都是格式良好的 SHACL 属性路径。
如果 p 是 G 中的替代路径,
则对于其 SHACL 列表 L 的成员:
v1、v2、...、vn,
path(p,G) 是一个 SPARQL AlternativePath,其中
path(v1,G) 作为 elt1,后接一个用于
v2 的 AlternativePath 作为 elt2,...,直到
path(vn,G)。
反向路径
是一个空白节点,它是 G 中恰好一个
三元组的主语。
该三元组以 sh:inversePath 作为谓词,并且宾语 v 是格式良好的 SHACL
属性路径。
如果 p 是 G 中的反向路径,则 path(p,G) 是一个
SPARQL InversePath,其中 path(v,G) 作为其 elt。
零个或多个
路径是一个空白节点,它是 G 中恰好一个
三元组的主语。
该三元组以 sh:zeroOrMorePath 作为谓词,并且宾语 v 是格式良好的 SHACL
属性路径。
如果 p 是 G 中的零个或多个路径,则
path(p,G) 是一个
SPARQL ZeroOrMorePath,其中 path(v,G) 作为其 elt。
一个或多个
路径是一个空白节点,它是 G 中恰好一个
三元组的主语。
该三元组以 sh:oneOrMorePath 作为谓词,并且宾语 v 是格式良好的 SHACL
属性路径。
如果 p 是 G 中的一个或多个路径,则
path(p,G) 是一个
SPARQL OneOrMorePath,其中 path(v,G) 作为其 elt。
零个或一个
路径是一个空白节点,它是 G 中恰好一个
三元组的主语。
该三元组以 sh:zeroOrOnePath 作为谓词,并且宾语 v 是格式良好的 SHACL
属性路径。
如果 p 是 G 中的零个或一个路径,则
path(p,G) 是一个
SPARQL ZeroOrOnePath,其中 path(v,G) 作为其 elt。
本节介绍节点表达式的概念。 SHACL Core 在以下特性中支持节点表达式:
sh:values 和 sh:defaultValue 处,用于派生
属性形状的值节点。sh:targetNode 处,用于动态计算形状的目标。
sh:deactivated 处,用于在特定
条件下停用某些形状。只对 SHACL Core 感兴趣的读者通常可以跳过本节。 鉴于 Core 仅支持常量 IRI 和字面量作为节点表达式,节点 表达式的用例 与传统使用 SHACL Core 的用例相同。
evalExpr(expr, focusGraph, focusNode, scope) -> outputNodes
其中
expr 是形状图中的一个节点表达式。
在求值期间,引擎可以访问形状图中与 expr 相关的三元组。focusGraph 是一个图,称为焦点图。这是节点表达式求值的默认
查询图。focusNode 是一个节点,称为输入焦点节点。此变量可以没有
值。scope 是从(键)项到单个(值)项的映射。
空映射写作 {}。
SHACL Core 规范仅精确定义了基于接下来两个小节的节点表达式 函数。 [shacl12-node-expr] 提供了关于节点表达式 一般设计的更多背景,并包含一个全面的 节点表达式函数库。 其他规范,例如 [shacl12-sparql],使用 空白节点引入额外函数。 因此,节点表达式充当 SHACL 的扩展点。
验证以数据图和形状图作为输入,并 产生一个 验证报告,其中包含验证结果。 一致性检查是验证的简化版本, 产生一个布尔结果。 能够执行验证的系统称为处理器, 动词 处理有时用于指代验证过程。
SHACL 定义了一个 RDF 验证报告词汇,供以 RDF 结果图形式生成验证报告的 处理器使用。 本规范使用 SHACL 结果词汇,为与约束组件关联的验证器 提供规范性定义。 只有能够生成验证报告词汇所有强制属性的 SHACL 实现才是 符合标准的。
形状图是一个RDF 图,其作用是向 SHACL 验证过程提供形状和相关信息, 以便可以根据这些形状验证数据图。
sh:ShapesGraph 类
MAY 用作一个图的 IRI 的
rdf:type,
该图通常扮演形状图的角色。
给定验证的形状图可以是组合多个形状图的结果,
例如通过 owl:imports 或 sh:shapesGraph。
无论如何构造,用于验证的形状图在验证过程中MUST
保持固定。
更多详情见6.5 验证。
本节其余部分是非规范性的。
形状图可以是可复用的验证模块,可通过谓词 owl:imports 交叉引用。
作为预验证步骤,SHACL 处理器应通过传递地跟随并导入所有
引用的形状图,
经由 owl:imports 谓词来扩展最初提供的形状图。
在解析导入的 IRI 时,如果检索到的图包含一个以该导入 IRI 作为
owl:versionIRI
宾语的三元组,
则处理器应将该三元组的主语视为所导入图的形状图 IRI,
用于继续跟随 owl:imports 语句。
形式上,处理器应迭代地使用属性路径 ^owl:versionIRI?/owl:imports
来解析导入,以便版本 IRI 可用于导入带版本的形状图。
在以下示例中,形状图导入
<http://example.com/shapes/company/v2>。
当处理器检索该 IRI 处的图时,
它发现该 IRI 被声明为
<http://example.com/shapes/company> 的 owl:versionIRI。
然后处理器使用 <http://example.com/shapes/company> 来标识该图,
以便继续跟随其他 owl:imports 语句;在此例中会导入
<http://example.com/shapes/base>。
{
"@graph": [
{
"@id": "http://example.com/shapes/myapp",
"owl:imports": {
"@id": "http://example.com/shapes/company/v2"
}
},
{
"@id": "ex:PersonShape",
"@type": "sh:NodeShape",
"sh:targetClass": { "@id": "ex:Person" },
"sh:property": {
"sh:path": { "@id": "ex:worksFor" },
"sh:class": { "@id": "ex:Company" }
}
}
]
}
{
"@graph": [
{
"@id": "http://example.com/shapes/company",
"owl:versionIRI": {
"@id": "http://example.com/shapes/company/v2"
},
"owl:imports": {
"@id": "http://example.com/shapes/base"
}
},
{
"@id": "ex:CompanyShape",
"@type": "sh:NodeShape",
"sh:targetClass": { "@id": "ex:Company" },
"sh:property": {
"sh:path": { "@id": "ex:name" },
"sh:minCount": 1,
"sh:datatype": { "@id": "xsd:string" }
}
}
]
}
所得图构成用于验证的不可变形状图。
使用 owl:versionIRI 导入带版本的形状图时,应注意
避免导入不兼容版本。特别是,形状图的导入闭包
SHOULD NOT 包含两个同一系列的不同版本的图,
或者一个图
声明 owl:incompatibleWith 另一个图。这样的形状图被视为
格式不良。详情请参见格式良好形状
图的定义。
除形状声明外,形状图还可以包含供 SHACL
处理器使用的其他信息,例如 sh:entailment 语句。
任何 RDF 图都可以是数据图。
sh:DataGraph 类 MAY 用作通常作为数据图使用的图的
IRI
的 rdf:type。
但请注意,形状图也MAY扮演
数据
图的角色;例如,
当要验证形状本身时。
本节其余部分是非规范性的。
数据图是 SHACL 处理器进行验证的输入之一。 SHACL 处理器将其视为一般 RDF 图,并且不对其性质作任何假设。 例如,它可以是内存中的图、RDF 数据集中的命名图,或 SPARQL 端点中的图。
SHACL 可用于通过任何方式获得的 RDF 图,例如来自文件系统、HTTP 请求,或 RDF 数据集。 SHACL 不假设图是否包含在任何 RDF 蕴涵机制下从该图蕴涵出的三元组。
数据图预期包含与数据相关的所有本体公理,尤其是所有
rdfs:subClassOf 三元组,以便 SHACL 正确识别类目标并验证
Core SHACL 约束。
数据图中的 owl:imports 不会被执行,以避免验证工作量不受控制地增加。
如果你想验证
若干相关本体,请将它们全部传递给 SHACL 处理器(一起或逐个),不要
依赖 owl:imports 链接。
虽然 SHACL 不会执行数据图中的 owl:imports,但数据图维护者应
仍然注意那些确实依赖
owl:imports 行为作为导入指令的应用。特别是,某些应用可能在语法上依赖于直接
存在 X a owl:Ontology .,使得 X owl:imports Y . 会将
owl:imports 语句作为
加载 Y 的指令来处理。更多详情见 OWL 2
Web Ontology Language Mapping
to RDF Graphs,第 3.1.1 节。因此,在使用形如
X a sh:DataGraph . 的语句时,也应包含 X a owl:Ontology .。
SHACL 的某些特性(例如
7.1.1 sh:class、
3.1.3.2 基于类的目标
(sh:targetClass),以及
3.1.3.3 隐式类目标
和 sh:ShapeClass)依赖
SHACL
类型这一概念,以确定一个节点
是否为给定类的 SHACL 实例。
默认情况下,这通过在数据图中查找 rdfs:subClassOf 和 rdf:type
三元组
来确定。
然而,在某些情况下这并不足够,因为 rdfs:subClassOf 三元组通常作为
类和/或形状定义的一部分存储,而不是作为实例数据存储。
SHACL 处理器 SHOULD 提供参数 subClassOfInShapesGraph,
如果将其设置为 true,
则应改变 SHACL 类型的定义,使得 rdfs:subClassOf 三元组除了从
数据图
中查询之外,还从形状图中查询。
rdf:type 三元组始终预期位于数据图中。
一个数据
图可以包含用于向 SHACL 处理器建议一个或多个图的三元组,其谓词为
sh:shapesGraph。
sh:shapesGraph
的每个值
都是一个IRI,表示一个图,该图SHOULD 被纳入用于验证该数据
图的形状图。
sh:shapesGraph 的值可以是
owl:versionIRI 的值,
因此在形状图中描述的从版本 IRI 解析形状图 IRI 的相同策略也适用于此处。
在以下示例中,SHACL 处理器 SHOULD 在验证给定图时使用
ex:graph-shapes1 和 ex:graph-shapes2 图(以及它们的
owl:imports)的并集作为形状图。
验证是从某种 输入到验证结果的映射,如以下段落所定义。
根据形状图验证数据图: 给定一个数据图和一个形状图, 验证结果是针对形状图中所有 形状,对 数据图执行验证所得结果的并集。
根据形状验证数据图: 给定一个数据图,以及形状图中的一个 形状, 验证结果是该形状在数据图中的 目标内所有焦点 节点的验证结果的并集。
根据形状验证焦点节点: 给定数据图中的一个焦点节点,以及形状图中的一个形状, 验证结果是对该焦点节点根据该 形状声明的所有 约束进行验证所得结果的并集,除非该形状已被 停用, 在这种情况下,验证结果为空。
根据约束验证焦点节点:
给定数据图中的一个焦点节点,以及形状图中种类
为 C 的约束,
验证结果由约束
组件 C 的验证器定义。
这些验证器通常以焦点节点、形状图中该
约束的 C
的参数的具体
值,以及声明该约束的
形状的值
节点作为输入。
在验证期间,数据图和形状图 MUST 保持不可变,即验证结束时两个图都 MUST 与验证开始时的图相同。 SHACL 处理器 MUST NOT 更改它们用于构造 形状图或数据图的图, 即使这些图是允许更改其已存储图的 RDF 存储的一部分。 SHACL 处理器 MAY 存储它们创建的图,例如包含验证结果的图, 并且该操作 MAY 更改 RDF 存储中的现有图,但不得更改任何 用于构造形状图或数据图的图。 因此,SHACL 处理是幂等的。
验证和一致性 检查可能导致失败。 例如,某个特定 SHACL 处理器可能允许递归形状,但如果它检测到数据中的循环, 则报告失败。 失败也可能因资源耗尽而被报告。 失败通过实现特定的通道发出信号。
如果形状图包含格式不良节点, 则验证过程的结果是未定义的。 在这种情况下,SHACL 处理器 SHOULD 产生失败。 另见 6.7.1.4 形状图的 语法检查(sh:shapesGraphWellFormed)。
以下属性是 SHACL Core 中所谓的期望形状的约束 参数:
以下属性是 SHACL Core 中所谓的接受列表的约束参数:
RDF 图 G 中的一个形状 s1 引用 G 中的形状 s2,
当且仅当它对某个约束组件的某个非接受列表、期望形状的参数具有
s2 作为值,或者 s2 是某个
约束组件的某个接受列表、期望形状的参数的
值的成员。
如果 RDF 图 G 中的一个形状通过 G 中引用关系的传递闭包与
它自身相关联,则它是 G 中的递归
形状。
使用递归形状进行的 验证在 SHACL 中未定义,并留给 SHACL 处理器实现决定。 例如,SHACL 处理器可以支持递归场景,或者在检测到 递归时产生失败。
本节其余部分是非规范性的。
上述递归策略被选择用于支持多种实现 策略。 通过将递归留为未定义,实现可以选择不支持递归,从而 能够发出一组静态 SPARQL 查询(针对 SPARQL 端点),而无需支持 循环。 工作组知道其他实现可能支持递归,并且某些形状 图可能 依赖这些具体特性。 预期未来工作,例如在 W3C Community Groups 中的工作,将会定义 递归具有良好定义的特定 SHACL 方言。
一个焦点节点符合一个形状,当且仅当 对该焦点节点根据该形状进行 验证所得结果集合,不包含任何严重性级别属于 禁止级别集合的验证结果,并且它未报告任何失败。
禁止的严重性级别集合定义为以
sh:conformanceDisallows 为谓词、以验证报告为主语的三元组的宾语。
如果验证报告不包含此类三元组,则默认使用 sh:Violation、sh:Warning
和
sh:Info。
一致性检查当且仅当给定的焦点节点
符合
给定形状时产生
true,否则产生 false。
请注意,SHACL Core 的所有期望形状的约束参数
都依赖一致性检查。
在这些情况下,用于确定一致性检查结果的验证结果
会与外围验证过程的结果分离,并且通常不会出现在同一
验证报告中
(也许作为 sh:detail 的值除外)。
验证报告是验证过程的结果,用于报告符合性以及所有 验证结果的集合。 验证报告使用本节定义的 SHACL 验证报告词汇描述。 该词汇定义了 RDF 属性,用于表示可为如何识别或修复数据图中的违规 提供指引的结构性信息。
符合 SHACL 的处理器 MUST 能够返回一个验证报告, 其中包含本规范描述的所有必需验证结果。 符合 SHACL 的处理器 MAY 支持可选参数,使其能够 限制返回结果的数量。 这种灵活性例如在某些大规模数据集验证用例中是必要的。
以下图表示一个符合形状图的数据图的验证报告示例。
以下图表示一个不符合形状图的数据图的验证报告示例。
请注意,sh:resultMessage 的具体值并非 SHACL 强制规定,并被视为
实现特定的。
验证过程的结果是一个 RDF 图,其中恰好有一个
sh:ValidationReport 的 SHACL 实例。
该 RDF 图 MAY 包含额外信息,例如出处
元数据。
结果图中 sh:ValidationReport 的每个 SHACL 实例对属性
sh:conforms 恰好具有一个值,并且该值的数据类型为
xsd:boolean。
它表示一致性检查的结果。
结果图中 sh:ValidationReport 的每个 SHACL 实例 MAY 对属性
sh:conformanceDisallows 具有一个或多个值。
sh:conformanceDisallows 的所有值 MUST 是 IRI。
所有值合并定义禁止的严重性级别集合。存在任何严重性级别位于该
禁止严重性级别集合中的 sh:ValidationResult,MUST
导致关联的 sh:ValidationReport 实例上的 sh:conforms
值
为 false。
如果结果图中不存在属性
sh:conformanceDisallows 的值,则 MUST 使用一个默认集合,
该集合由
sh:Violation、sh:Warning 和 sh:Info 组成。
一致性禁止集由验证引擎定义。 验证引擎 MAY 提供用于自定义此集合的机制。
对于验证过程产生的每个验证结果
(在一致性
检查上下文中提到的结果除外),
结果图中 sh:ValidationReport 的 SHACL 实例对属性
sh:result 具有一个值。
sh:result 的每个值都是类
sh:ValidationResult 的SHACL 实例。
SHACL 验证引擎并不严格要求检查形状图是否格式良好。
执行此类检查的实现(例如在形状图安装到系统中时,
或在验证之前或期间)SHOULD 使用属性
sh:shapesGraphWellFormed 来告知
验证报告的消费者这一事实。
如果结果图中 sh:ValidationReport 的一个 SHACL 实例对
sh:shapesGraphWellFormed 具有
true 作为值,
则处理器确信用于
验证过程的形状图是格式良好的。
SHACL 将 sh:ValidationResult 定义为 sh:AbstractResult 的子类,
用于报告单个 SHACL 验证结果。
SHACL 实现可以使用 sh:AbstractResult 的其他
SHACL 子类,例如,
用于报告成功完成的约束检查或累积结果。
本节其余小节中描述的所有属性都可以在
sh:ValidationResult 中指定。
属性 sh:focusNode、sh:resultSeverity 和
sh:sourceConstraintComponent
是所有验证结果唯一强制要求的属性。
每个验证结果对属性 sh:focusNode 恰好具有一个值,
该值等于导致该结果的焦点节点。
这是产生该验证结果时被验证的焦点节点。
验证结果可以具有属性 sh:resultPath 的值,指向一个格式良好的 SHACL
属性路径。
对于由属性形状产生的结果,此
SHACL 属性路径等价于该形状的
sh:path 的值,
除非另有说明。
如果 sh:path p 是空白节点,则 sh:resultPath 是
结果图中 p 的深拷贝。
验证结果可以包含至多一个导致该结果的 RDF 项,作为属性
sh:value 的值。
SHACL Core 组件的验证器的文本定义会指定该
值如何构造——通常它们是违反某项约束的值节点。
验证结果对属性
sh:sourceConstraintComponent
恰好具有一个值,并且该值是导致该结果的约束组件的
IRI。
例如,因基于 sh:minCount 值的约束违规而产生的结果,
其来源约束组件将是 sh:MinCountConstraintComponent。
属性 sh:detail 可以将一个(父)结果链接到一个或多个
sh:AbstractResult 的 SHACL 实例,
后者可以提供关于该(父)结果原因的更多详细信息。
取决于 SHACL 处理器的能力,这例如可以包括通过 sh:node 作为一致性检查的一部分求值的
约束违规。
验证结果可以具有属性 sh:resultMessage 的值,
例如用于向人类传达额外的文本细节。
虽然 sh:resultMessage 可以有多个值,但不应有两个值
带有相同的语言标签。
这些值由验证引擎基于形状图中约束的 sh:message
值产生,见为形状声明消息。
使用具化声明的消息优先于在外围形状上声明的消息。
在某个约束在形状图中没有任何 sh:message 值的情况下,
SHACL 处理器 MAY 自动为
sh:resultMessage 生成其他值。
每个验证结果对属性
sh:resultSeverity 恰好具有一个值,并且该值是一个IRI。
该值由以下规则(按顺序)确定:
sh:severity 的值
sh:severity 的值
sh:severity,
则默认为 sh:Violation。大多数约束组件的验证器使用值节点这一概念,它由以下两个小节定义。
对于对 sh:path p 具有值的
属性形状,
值节点集合由以下步骤产生:
p 的
路径映射到达的节点。
e 是该属性形状上 sh:values 的
值,
则添加
evalExpr(e, data graph, focus node, {})
的输出节点。
d 是该属性形状上
sh:defaultValue 的值,
则添加
evalExpr(d, data graph, focus node, {})
的输出节点。
本节定义内置的 SHACL Core 约束组件,所有 SHACL Core 处理器都必须支持这些组件。 每个约束组件的定义包含其 IRI,以及一张列出其参数的表。 除非另有说明,所有这些参数都是必需参数。 违反这些参数表中列举的任何语法规则的形状都是格式不良的。
每个约束组件还包含一个文本定义,用于描述与该组件关联的验证器。
这些文本定义通过形如
$paramName 的变量引用约束中参数的值,其中 paramName 是参数 IRI 中
sh: 命名空间之后的部分。
例如,sh:ClassConstraintComponent 的文本定义使用变量 $class
来引用 sh:class 的值。
在 SHACL Core 中,术语 参数值表示参数的值,
即宾语,该宾语来自三元组,该三元组位于形状图中,其中主语
是形状,
且谓词是参数(例如 sh:class)。
在撰写本文时,工作组的意图是在 SHACL Core 之外定义一种 SHACL 方言,
在该方言中,术语
参数值也允许节点表达式。
请注意,并非所有约束组件都使用术语参数值,有些会改为引用术语值。
例如,sh:node 的值永远不能是节点表达式,
因为这会使
空白节点的处理复杂化。
TODO: 如果节点表达式规范已准备好,则添加指向该规范的链接;否则澄清上面的句子。
请注意,这些验证器定义了该组件产生的唯一验证结果。 此外,验证器总是产生新的结果节点,即当文本定义 表述为 “...there is a validation result...” 时,它指的是结果图中的一个不同的新节点。
本节其余部分是非规范性的。
纳入 SHACL Core 的约束组件的选择,是基于 [shacl-ucr] 文档收集的需求作出的。 特别注意了在尽可能覆盖更多常见用例与保持 Core 语言规模可管理之间取得平衡。 并非所有用例都可以仅用 Core 语言表达。 因此,SHACL-SPARQL 提供了一种扩展机制,该机制在本规范的第二部分中描述。 预期第三方将维护其他可复用的约束组件库。
除非另有说明,Core 约束组件既可用于属性形状,也可用于节点
形状。
某些约束参数附带语法规则,这些规则会使使用这些参数的节点形状格式不良。
这方面的示例包括 sh:minCount,它仅支持用于属性形状。
本节中的约束组件的共同点是,它们可用于限制 值节点的类型。 请注意,可以使用 sh:or 表示多个值类型备选项。
sh:class 指定的条件是,每个值节点都是给定类型的 SHACL 实例。
约束组件 IRI:
sh:ClassConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:class |
所有值节点的类型。
形状中
sh:class 的值要么是 IRI,
要么是空白节点,并且这些空白节点是格式良好的 SHACL
列表,其中所有成员都是 IRI。
|
本节其余部分是非规范性的。
请注意,sh:class 的多个值被解释为合取,
即这些值需要是所有这些类的 SHACL 实例。
使用列表来表达并集语义。
以下示例说明 sh:class 的基于列表的语法,
这意味着属性 ex:pet 的值必须是猫或狗。
sh:datatype 指定一个需要满足的条件,该条件涉及每个
值节点的数据类型。
约束组件 IRI:
sh:DatatypeConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:datatype |
所有值节点允许的数据类型(例如 xsd:integer)。
一个形状
对 sh:datatype 最多有一个值。
sh:datatype
在形状中的值要么是一个 IRI,
要么是一个空白节点,并且该空白节点是一个格式良好的 SHACL
列表,其中所有成员都是 IRI。
|
$datatype 为 sh:datatype 的一个参数值。
令 datatypes 为一组 IRI,
使得当 $datatype 是一个 IRI
时,该集合仅恰好包含该 IRI;
当 $datatype 是一个空白节点SHACL 列表时,
该集合恰好由该列表的成员组成。datatypes 中的任何数据类型,
则存在一个验证结果,其中该值节点作为
sh:value。本节其余部分是非规范性的。
sh:datatype 的值通常是数据类型,例如 xsd:string。
以下示例说明基于列表的语法,这意味着
rdfs:label 的所有值必须是 xsd:string 或 rdf:langString。
sh:nodeKind 指定一个条件,该条件需要由每个值节点的 RDF 节点种类满足。
约束组件 IRI:
sh:NodeKindConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:nodeKind |
所有值节点的节点种类(IRI、空白节点、字面量、三元组项,或这些种类的组合)。
一个形状
对 sh:nodeKind 最多有一个值。
sh:nodeKind 在形状中的值要么是 IRI,要么是一个空白节点,该空白节点
是格式良好的 SHACL 列表,其中所有成员都是 IRI。
如果 sh:nodeKind 的值是 IRI,则形状中
sh:nodeKind 的值是类 sh:NodeKind 的以下七个实例之一:
sh:BlankNode、sh:IRI、sh:Literal、
sh:BlankNodeOrIRI、sh:BlankNodeOrLiteral、
sh:IRIOrLiteral 和 sh:TripleTerm。
如果 sh:nodeKind 的值是格式良好的 SHACL 列表,则形状中这些列表的成员
是类 sh:NodeKind 的以下四个实例之一:
sh:BlankNode、sh:IRI、sh:Literal 和
sh:TripleTerm。
|
$nodeKind 为 sh:nodeKind 的一个参数值。
令 $nodeKinds 为一组 IRI,
使得当 $nodeKind 是一个 IRI
时,该集合仅恰好包含该 IRI;
当 $nodeKind 是一个空白节点SHACL 列表时,
该集合恰好由该列表的成员组成。$nodeKinds 中任何节点种类的值节点,
存在一个验证结果,其中该值节点作为
sh:value。
任何 IRI 仅匹配 sh:IRI、
sh:BlankNodeOrIRI 和 sh:IRIOrLiteral。
任何空白节点仅匹配 sh:BlankNode、
sh:BlankNodeOrIRI 和 sh:BlankNodeOrLiteral。
任何字面量仅匹配 sh:Literal、
sh:BlankNodeOrLiteral 和 sh:IRIOrLiteral。
任何三元组项仅匹配
sh:TripleTerm。
本节其余部分是非规范性的。
以下示例声明,在任何主语处,ex:knows 的所有值都需要是 IRI。
以下示例说明基于列表的语法,这意味着在任何主语处,
ex:knows
的所有值都需要是 IRI 或空白节点。
sh:minCount 指定满足条件的值节点的最小数量。
如果最小基数值为 0,则此约束始终满足,因此可以
省略。
约束组件 IRI:
sh:MinCountConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:minCount |
最小基数。
节点形状不能对
sh:minCount 具有任何值。
一个属性形状对
sh:minCount 最多有一个值。
属性形状中
sh:minCount 的值是数据类型为
xsd:integer 的字面量。
|
本节其余部分是非规范性的。
sh:maxCount 指定满足条件的值节点的最大数量。
约束组件 IRI:
sh:MaxCountConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:maxCount |
最大基数。
节点形状不能对
sh:maxCount 具有任何值。
一个属性形状对
sh:maxCount 最多有一个值。
属性形状中
sh:maxCount 的值是数据类型为
xsd:integer 的字面量。
|
本节其余部分是非规范性的。
以下约束组件指定需要由可通过 <、<=、>
和 >= 等运算符比较的值节点满足的值范围条件。
以下示例说明这些约束组件的一个典型用例。
约束组件 IRI:
sh:MinExclusiveConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:minExclusive |
排他的最小值。
形状中 sh:minExclusive 的值是字面量。
一个
形状对 sh:minExclusive 最多有一个值。
|
本节其余部分是非规范性的。
如果值节点无法与指定范围比较,则存在验证结果, 例如当有人将字符串与整数比较时。
约束组件 IRI:
sh:MinInclusiveConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:minInclusive |
包含的最小值。
形状中 sh:minInclusive 的值是字面量。
一个
形状对 sh:minInclusive 最多有一个值。
|
约束组件 IRI:
sh:MaxExclusiveConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:maxExclusive |
排他的最大值。
形状中 sh:maxExclusive 的值是字面量。
一个
形状对 sh:maxExclusive 最多有一个值。
|
约束组件 IRI:
sh:MaxInclusiveConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:maxInclusive |
包含的最大值。
形状中 sh:maxInclusive 的值是字面量。
一个
形状对 sh:maxInclusive 最多有一个值。
|
本节中的约束组件的共同点是,它们指定关于值节点字符串表示的条件。
sh:minLength 指定满足条件的每个值节点的最小字符串长度。
这可以应用于任何字面量和 IRI,
但不能应用于空白节点。
约束组件 IRI:
sh:MinLengthConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:minLength |
最小长度。
形状中 sh:minLength 的值是数据类型为
xsd:integer 的字面量。
一个形状
对 sh:minLength 最多有一个值。
|
$minLength 为 sh:minLength 的一个参数值。
对于每个值节点 v,
如果 v 的字符串表示(按 SPARQL str 函数定义)
的长度(按 SPARQL STRLEN 函数定义)
小于 $minLength,或者 v 是空白节点,
则存在一个验证结果,其中 v 作为
sh:value。
本节其余部分是非规范性的。
请注意,如果 sh:minLength 的值为 0,则对字符串长度没有限制,
但如果值节点是空白节点,仍然会违反该约束。
sh:maxLength 指定满足条件的每个值节点的最大字符串长度。
这可以应用于任何字面量和 IRI,
但不能应用于空白节点。
约束组件 IRI:
sh:MaxLengthConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:maxLength |
最大长度。
形状中 sh:maxLength 的值是数据类型为
xsd:integer 的字面量。
一个形状
对 sh:maxLength 最多有一个值。
|
$maxLength 为 sh:maxLength 的一个参数值。
对于每个值节点 v,
如果 v 的字符串表示(按 SPARQL str 函数定义)
的长度(按 SPARQL STRLEN 函数定义)
大于 $maxLength,或者 v 是空白节点,
则存在一个验证结果,其中 v 作为
sh:value。
本节其余部分是非规范性的。
sh:pattern 指定一个正则表达式,每个值节点都要与其匹配
才满足条件。
约束组件 IRI:
sh:PatternConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:pattern |
所有值节点都需要匹配的正则表达式。
形状中 sh:pattern 的值是数据类型为
xsd:string 的字面量。
形状中 sh:pattern 的值是 SPARQL REGEX
函数的有效 pattern 参数。
|
sh:flags |
可选的标志字符串,按 SPARQL 1.2 REGEX 中的方式解释。
形状中 sh:flags 的值是数据类型为
xsd:string 的字面量。
|
$pattern 为 sh:pattern 的一个参数值。
令 $flags 为 sh:flags 的一个参数值。
对于每个值节点,
如果它是空白节点,或者其字符串表示(按 SPARQL str 函数定义)
不匹配正则表达式 $pattern(按 SPARQL REGEX 函数定义),
则存在一个验证结果,其中该值节点作为
sh:value。
如果 $flags 具有值,则匹配必须遵循
SPARQL REGEX 函数三参数变体的定义,并使用 $flags 作为
第三个参数。
本节其余部分是非规范性的。
此特性“存在风险”,等待工作组就此特性(以及类似的)便利特性作出决议。 工作组尚不确定应在进入 Core 的特性与 某个其他文档中的特性之间如何划线。 最初作为 问题 177 讨论。
当设置为 true 时,sh:singleLine 指定值节点不得包含换行符。
除了约束验证之外,用户界面构建器还可以利用此信息
在(单行)文本字段和(多行)文本区域之间进行选择。
约束组件 IRI:
sh:SingleLineConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:singleLine |
用 true 激活此约束。
形状中 sh:singleLine 的值是数据类型为
xsd:boolean 的字面量。
一个
形状对 sh:singleLine 最多有一个值。
|
$singleLine 为 sh:singleLine 的一个参数值。
如果 $singleLine 为 true,则对于每个值节点,
如果它是字面量,且其词法形式匹配正则表达式(按 SPARQL REGEX 函数定义)
[\f\r\n\v],则存在一个验证结果。
本节其余部分是非规范性的。
在此示例中,该形状的有效目标节点只能包含
rdfs:label 的单行值。
rdfs:comment 的值被明确允许包含换行符,
这向表单构建器表明
这些值应在多行(文本区域)输入控件中编辑。
sh:languageIn 指定的条件是,每个值节点所允许的语言标签受给定语言标签列表限制。
约束组件 IRI:
sh:LanguageInConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:languageIn |
符合 [BCP47] 的基本语言范围列表。
形状中
sh:languageIn 的每个值都是一个SHACL
列表。
此类列表的每个成员
都是数据类型为 xsd:string 的字面量。
一个
形状对 sh:languageIn 最多有一个值。
|
本节其余部分是非规范性的。
以下示例形状声明 ex:prefLabel 的所有值
可以是英语或毛利语。
在示例实例中,ex:Berg 的所有标签都会导致约束违规。
属性 sh:uniqueLang 设置为 true,用于指定任意一对值节点都不得使用相同的语言标签,
如果存在文本方向,则也将其纳入考虑。
约束组件 IRI:
sh:UniqueLangConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:uniqueLang |
用 true 激活此约束。
形状中 sh:uniqueLang 的值是数据类型为
xsd:boolean 的字面量。
一个
属性形状对 sh:uniqueLang 最多有一个值。
节点形状不能对
sh:uniqueLang 具有任何值。
|
本节其余部分是非规范性的。
本节中的约束组件适用于作为 SHACL 列表的值节点。 它们指定关于 SHACL 列表的结构、长度和成员的条件。
sh:memberShape 指定 SHACL
列表值节点的所有成员都必须符合给定的节点形状。
约束组件 IRI:
sh:MemberShapeConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:memberShape |
SHACL 列表的所有成员都必须
符合的形状。
sh:memberShape
的值必须是一个格式良好的节点形状。
|
本节其余部分是非规范性的。
值节点 v 中每个不符合
$memberShape 的成员 m,都应在 v 的验证结果中作为单独的
sh:detail 报告。
如果 v 不是有效的 SHACL 列表,则应将其
作为顶层验证结果报告,并且不应尝试验证各个成员。
关于如何在验证结果中生成 sh:detail 的示例,可在 SHACL 测试套件中
sh:memberShape 的测试用例中找到:memberShape-001.ttl。
在以下示例中,属性 ex:speakerOrder 的所有值都必须是
成员为 IRI 的 SHACL 列表。
sh:minListLength 指定 SHACL 列表值节点必须具有的最少成员数量。
约束组件 IRI:
sh:MinListLengthConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:minListLength |
SHACL 列表中的最少成员数量。
形状中 sh:minListLength
的值是数据类型为 xsd:integer 的字面量。
形状中
sh:minListLength 的值是大于或等于
0 的整数。
|
本节其余部分是非规范性的。
在以下示例中,属性 ex:skills 的所有值都必须是
至少有 1 个成员的 SHACL 列表。
关于 sh:minListLength 的其他测试用例可在 SHACL 测试套件中找到:minListLength-001.ttl。
sh:maxListLength 指定 SHACL 列表值节点必须具有的最多成员数量。
约束组件 IRI:
sh:MaxListLengthConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:maxListLength |
SHACL 列表中的最多成员数量。
形状中 sh:maxListLength
的值是数据类型为 xsd:integer 的字面量。
形状中
sh:maxListLength 的值是大于或等于
0 的整数。
|
本节其余部分是非规范性的。
在以下示例中,属性 ex:hobbies 的所有值都必须是
最多有 2 个成员的 SHACL 列表。
关于 sh:maxListLength 的其他测试用例可在 SHACL 测试套件中找到:maxListLength-001.ttl。
sh:uniqueMembers 指定 SHACL 列表值节点是否必须具有唯一成员。
约束组件 IRI:
sh:UniqueMembersConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:uniqueMembers |
一个布尔值,指定 SHACL 列表的成员是否必须唯一。
形状中 sh:uniqueMembers
的值是数据类型为 xsd:boolean 的字面量。
|
本节其余部分是非规范性的。
列表 v 中的每个重复成员 m 都应在
v 的验证结果中作为单独的
sh:detail 报告。如果列表 v 不是有效的 SHACL
列表,则应将其作为顶层验证
结果报告,并且不应尝试验证唯一成员资格。
关于如何在验证结果中生成 sh:detail 的示例,可在 SHACL 测试套件中
sh:uniqueMembers 的测试用例中找到:uniqueMembers-001.ttl。
在以下示例中,属性 ex:preferences 的所有值都必须是
其成员在每个 SHACL 列表内部具有唯一值的 SHACL 列表。
本节中的约束组件指定值节点集合与其他属性或属性路径之间关系的条件。 这些约束组件只能由属性形状使用。
sh:equals 指定这样一种条件:所有值节点的集合
等于可从焦点节点通过使用 sh:equals
指定的SHACL 属性
路径到达的节点集合。
约束组件 IRI:
sh:EqualsConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:equals |
要与之比较的属性路径。
形状中
sh:equals 的值是格式良好的 SHACL 属性路径。
|
本节其余部分是非规范性的。
以下示例说明在形状中使用 sh:equals,以指定
某些焦点节点需要对 ex:firstName 和
ex:givenName 具有相同的值集合。
以下示例展示 SHACL 属性路径既可以用作
sh:path 的值,也可以用作 sh:equals 的值。
在此示例中,如果 Bob 的配偶名称与他的纹身不同,或者反过来不相同, 就会报告警告。 如果 Bob 既没有配偶也没有纹身,或者 二者都有且其名称和文本完全匹配同一组节点,则不会产生警告。
sh:disjoint 指定这样一种条件:值节点集合
与可从焦点节点
通过SHACL 属性路径到达的节点集合不相交,
该路径是 sh:disjoint 的值。
约束组件 IRI:
sh:DisjointConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:disjoint |
要与这些值比较的属性路径。
形状中 sh:disjoint 的值是格式良好的 SHACL 属性路径。
|
本节其余部分是非规范性的。
以下示例说明在形状中使用 sh:disjoint,以指定
某些焦点节点不能对 ex:prefLabel 和
ex:altLabel 共享任何值。
sh:subsetOf 指定这样一种条件:所有值节点
也必须可从焦点节点通过使用 sh:subsetOf 指定的
SHACL 属性
路径到达。
约束组件 IRI:
sh:SubsetOfConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:subsetOf |
要与之比较的属性路径。
形状中 sh:subsetOf 的值是格式良好的 SHACL 属性路径。
|
本节其余部分是非规范性的。
以下示例说明在形状中使用 sh:subsetOf,以指定
某个人最喜欢的孩子必须在实际孩子之中。
sh:lessThan 指定这样一种条件:每个值节点都小于
可从焦点节点通过
SHACL 属性路径到达的所有节点,
该路径是 sh:lessThan 的值。
约束组件 IRI:
sh:LessThanConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:lessThan |
要与这些值比较的属性路径。
形状中 sh:lessThan 的值是格式良好的 SHACL 属性路径。
节点形状不能对
sh:lessThan 具有任何值。
|
本节其余部分是非规范性的。
以下示例说明在形状中使用 sh:lessThan,以指定
ex:startDate 的所有值都“早于” ex:endDate 的值。
sh:lessThanOrEquals 指定这样一种条件:每个值节点
都小于或等于
可从焦点节点通过
SHACL 属性路径到达的所有节点,
该路径是 sh:lessThanOrEquals 的值。
约束组件 IRI:
sh:LessThanOrEqualsConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:lessThanOrEquals |
要与这些值比较的属性路径。
形状中
sh:lessThanOrEquals 的值是格式良好的 SHACL 属性路径。
节点
形状不能对 sh:lessThanOrEquals 具有任何值。
|
本节中的约束组件实现常见的逻辑运算符 与、或和非,以及异或的一种变体。
sh:not 指定这样一种条件:每个值节点不能符合给定的形状。
这类似于否定和逻辑“非”运算符。
约束组件 IRI:
sh:NotConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:not |
要取反的形状。
形状中
sh:not 的值必须是格式良好的形状。
|
本节其余部分是非规范性的。
以下示例说明在形状中使用 sh:not,以指定
某些焦点节点不能对 ex:property 具有任何值这一条件。
sh:and 指定这样一种条件:每个值节点都符合所有给定的
形状。
这类似于合取和逻辑“与”运算符。
约束组件 IRI:
sh:AndConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:and |
一个SHACL 列表,其中包含用于验证值节点的
形状。
形状中
sh:and 的每个值都是一个SHACL 列表。
此类列表的每个成员都必须是一个格式良好的形状。
|
本节其余部分是非规范性的。
注意,虽然 sh:and 的值是一个形状SHACL 列表,
但这些形状的顺序不会影响验证结果。
对于使用快捷求值语义的实现,该顺序可能会影响验证效率。
建议将更容易求值或更可能失败的约束放在列表前面。
以下示例说明在形状中使用 sh:and,以指定
某些焦点节点对 ex:property 恰好具有一个值这一条件。
这是通过一个单独的命名形状(ex:SuperShape)的合取实现的,该形状
指定最小数量;以及一个额外指定最大数量的属性形状。
如此处所示,sh:and 可用于在形状之间实现专门化机制。
sh:or 指定这样一种条件:每个值节点至少符合所提供形状中的一个。
这类似于析取和逻辑“或”运算符。
约束组件 IRI:sh:OrConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:or |
一个SHACL 列表,其中包含用于验证值节点的
形状。
形状中
sh:or 的每个值都是一个SHACL 列表。
此类列表的每个成员都必须是一个格式良好的形状。
|
本节其余部分是非规范性的。
注意,虽然 sh:or 的值是一个形状SHACL 列表,
但这些形状的顺序不会影响验证结果。
对于使用快捷求值语义的实现,该顺序可能会影响验证效率。
建议将更容易求值或更可能成功的约束放在列表前面。
以下示例说明在形状中使用 sh:or,以指定
某些焦点节点至少对 ex:firstName 具有一个值,
或至少对 ex:givenName 具有一个值这一条件。
下一个示例展示如何在属性形状中使用
sh:or,以声明给定属性 ex:address 的值可以是数据类型为
xsd:string
的字面量,或者是类 ex:Address 的SHACL 实例。
注意,SHACL 中的所有约束都会在执行时进行 AND 合取。考虑以下示例:
正确解释是(shapeA OR shapeB)AND(shapeC
OR shapeD)。
目标节点需要符合 shapeA 或 shapeB,然后还要符合
shapeC 或 shapeD。
sh:xone 指定这样一种条件:每个值节点恰好
符合一个所提供的形状。
约束组件 IRI:
sh:XoneConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:xone |
一个SHACL 列表,其中包含用于验证值节点的
形状。
形状中
sh:xone 的每个值都是一个SHACL 列表。
此类列表的每个成员必须是一个格式良好的形状。
每个
这样的列表应该至少具有一个
成员。
|
本节其余部分是非规范性的。
注意,虽然 sh:xone 的值是一个形状SHACL 列表,
但这些形状的顺序不会影响验证结果。
以下示例说明在形状中使用 sh:xone,以指定
某些焦点节点必须要么对 ex:fullName 具有一个值,要么对
ex:firstName 和 ex:lastName 具有值,但不能二者都有这一
条件。
本节中的约束组件可用于通过根据某些形状验证值节点来指定复杂条件。
sh:node 指定这样一种条件:每个值节点都符合给定的节点形状。
约束组件 IRI:
sh:NodeConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:node |
所有值节点都需要符合的节点形状。
形状中
sh:node 的值必须是格式良好的节点
形状。
|
本节其余部分是非规范性的。
以下示例说明在属性形状中使用 sh:node。
属性 ex:address 的所有值都必须满足由
形状
ex:AddressShape 表达的约束。
以下示例说明在节点形状中使用 sh:node。
此示例定义一个用于邮政编码的通用基础形状,以及两个针对特定国家的专门化形状。
基础约束(如 sh:datatype xsd:string 和 sh:minLength 3)
适用于所有邮政编码。
属性 sh:node 用于将较窄的形状链接到较宽的形状,
类似于 rdfs:subClassOf 用于将子类链接到超类的方式。
关于 SHACL 中递归形状的处理,请参见6.5.3 处理递归 形状。
sh:property 可用于指定每个值节点都具有一个给定的
属性形状。
约束组件 IRI:
sh:PropertyConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:property |
所有值节点都需要具有的属性形状。
形状中
sh:property 的每个值都必须是一个格式良好的属性形状。
|
本节其余部分是非规范性的。
注意,sh:property 与
sh:node 之间存在一个重要区别:
如果某个值节点违反约束,则对于 sh:node,该值节点只有一个验证结果,
且其 sh:sourceConstraintComponent 为 sh:NodeConstraintComponent。
另一方面,对于 sh:property,可能存在任意数量的验证结果,
而这些结果
会将属性形状中的约束的各个约束组件
作为其
sh:sourceConstraintComponent 的值。
与所有其他验证结果一样,每当通过 sh:property 到达一个属性形状时,
验证引擎都必须产生新的验证结果节点。
这包括以下情况:即使同一个焦点节点根据同一个
属性形状
进行验证,但它是经由形状图中的不同路径到达的。
sh:someValue 指定这样一种条件:至少有一个值节点符合给定的
形状。
约束组件 IRI:
sh:SomeValueConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:someValue |
至少一个值节点需要符合的形状。
形状中
sh:someValue 的值必须是格式良好的形状。
|
本节其余部分是非规范性的。
注意,一旦某个值节点已经符合,实现可以停止处理值节点。 由于值节点集合中节点的顺序未定义,因此不能保证会 到达某个会导致失败的节点。 因此,为了使处理可预测,除非所有值节点都已访问且没有成功, 否则会静默忽略失败。
在以下示例中,任何符合 ex:DuckFarmerShape 的节点都需要至少对
ex:tendsAnimal 具有一个值,
且该值是 ex:Duck 的SHACL 实例。
sh:someValue 可视为
sh:qualifiedValueShape 和 sh:qualifiedMinCount 1 组合的语法糖。
另请注意,sh:someValue 在属性形状中使用时通常最有意义。
在节点形状中,sh:someValue 等同于使用
sh:node 或 sh:property。
sh:qualifiedValueShape 指定这样一种条件:指定数量的值节点符合给定形状。
每个 sh:qualifiedValueShape 可以在同一个主语上具有:一个 sh:qualifiedMinCount 的值、
一个 sh:qualifiedMaxCount 的值,或者二者各一个值。
| 属性 | 摘要和语法规则 |
|---|---|
sh:qualifiedValueShape |
指定数量的值节点需要符合的形状。
形状中
sh:qualifiedValueShape 的值必须是格式良好的形状。
节点
形状不能对 sh:qualifiedValueShape 具有任何值。
这是
sh:QualifiedMinCountConstraintComponent 和
sh:QualifiedMaxCountConstraintComponent 的必需参数。
|
sh:qualifiedValueShapesDisjoint |
这是
sh:QualifiedMinCountConstraintComponent 和
sh:QualifiedMaxCountConstraintComponent 的可选参数。
如果设置为 true,则(在计数时)值节点不得符合任何兄弟形状。
形状中
sh:qualifiedValueShapesDisjoint 的值是数据类型为
xsd:boolean 的字面量。
|
sh:qualifiedMinCount |
符合该形状的值节点的最小数量。
形状中
sh:qualifiedMinCount 的值是数据类型为
xsd:integer 的字面量。
这是
sh:QualifiedMinCountConstraintComponent 的必需参数。
|
sh:qualifiedMaxCount |
可符合该形状的值节点的最大数量。
形状中
sh:qualifiedMaxCount 的值是数据类型为
xsd:integer 的字面量。
这是
sh:QualifiedMaxCountConstraintComponent 的必需参数。
|
Q 为形状图 shapes graph G 中的
一个,它声明了一个限定基数约束
(通过具有 sh:qualifiedValueShape 的值,以及
sh:qualifiedMinCount 或 sh:qualifiedMaxCount 中至少一个的值)。
令 ps 为 G 中将 Q 作为 sh:property 的一个值的形状集合。
如果 Q 对
sh:qualifiedValueShapesDisjoint 具有 true 作为一个值,则
Q 的兄弟形状集合被定义为:对于 ps 中的任一形状,
SPARQL 属性路径
sh:property/sh:qualifiedValueShape 的所有值的集合,
减去 Q
自身的 sh:qualifiedValueShape 的值。
否则,兄弟形状的集合为空。
$qualifiedValueShape 为
sh:qualifiedValueShape 的一个值。
令 $qualifiedMinCount 为 sh:qualifiedMinCount 的一个参数值。
令 C 为值节点 v 的数量,其中
v 符合 $qualifiedValueShape,
且 v 不符合当前形状的任何兄弟形状,
即正在根据其验证 v、并且以
$qualifiedValueShape 作为其 sh:qualifiedValueShape 值的形状。
如果上述任何一致性检查产生失败,则必须产生一个失败。
否则,如果 C 小于
$qualifiedMinCount,则存在一个验证结果。
sh:qualifiedMinCount 的约束组件是
sh:QualifiedMinCountConstraintComponent。
本节其余部分是非规范性的。
以下示例形状可用于指定这样一种条件:属性
ex:parent 恰好具有两个值,
并且其中至少一个是女性。
以下示例说明如何使用 sh:qualifiedValueShapesDisjoint
表达一只手必须至多有 5 个 ex:digit 值(使用
sh:maxCount 表达),
并且其中恰好一个必须是 ex:Thumb 的实例,而恰好 4 个必须是
ex:Finger 的实例,
但拇指和手指必须不相交。
换句话说,在一只手上,没有任何手指也能被计为拇指。
sh:reifierShape 可用于将属性形状与一个或多个节点形状链接起来。
任何具化器都必须符合这些节点形状。
约束组件 IRI:
sh:ReifierShapeConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:reifierShape |
该三元组的具化器必须符合的节点形状。
sh:reifierShape 的值必须是格式良好的节点
形状。
如果给出了 sh:reifierShape 的值,则 sh:path 值
受限为 IRI。
|
sh:reificationRequired |
这是
sh:ReifierShapeConstraintComponent 的可选参数。
如果设置为 true,则在数据图中,
焦点节点/路径组合必须至少具有一个具化值。
形状中
sh:reificationRequired 的值是数据类型为
xsd:boolean 的字面量。
|
本节其余部分是非规范性的。
在此示例中,形状 ex:PersonShape 声明
ex:Person 的所有实例
都必须使用一个符合形状
ex:ProvenanceShape 的具化器来具化其 ex:age 的值,即它需要指定
ex:date 和
ex:author。
本节列举了不适合归入其他类别的 Core 约束组件。
RDF 数据模型提供了极大的灵活性。
原则上,任何节点都可以对任何属性具有值。
然而,在某些情况下,指定哪些属性可以应用于
节点的条件是有意义的。
SHACL Core 语言包含一个名为 sh:closed 的属性,可用于
指定这样一种条件:每个值节点仅对那些已通过该形状经由
sh:property 指定的
属性形状显式枚举的属性具有值。
约束组件 IRI:
sh:ClosedConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:closed |
设置为 true 以关闭形状。
形状中
sh:closed 的值是数据类型为
xsd:boolean
的字面量,或者是 IRI sh:ByTypes。
|
sh:ignoredProperties |
可选的属性 SHACL 列表,这些属性除经由 sh:property
显式枚举的属性之外也被允许。
形状中
sh:ignoredProperties 的值必须是 SHACL
列表。
此类列表的每个成员
都必须是一个 IRI。
|
$closed 为
sh:closed 的一个参数值。
令 $ignoredProperties 为
sh:ignoredProperties 的一个值。
$closed 是 true 或 sh:ByTypes,且 P
是下文定义的属性集合,
则对于每个这样的三元组,都存在一个验证结果:该三元组以值节点作为其
主语,并且以一个不在 P 中的谓词作为谓词。
如果 $ignoredProperties 具有值,则作为此 SHACL 列表的成员枚举的属性,也允许用于该值节点。
该验证结果必须
以该三元组的谓词作为其
sh:resultPath,
并以该三元组的宾语作为其
sh:value。
$closed 是 true,则 P 是可从当前形状经由
SPARQL 路径 sh:property/sh:path 到达的 IRI
属性集合。
$closed 是 sh:ByTypes,则 P 是可从该值节点经由以下算法到达的
IRI 属性集合,再加上 rdf:type:
function collectProperties(S)
add all IRI properties that can be reached from S via the SPARQL path
sh:property/sh:path
if S is a SHACL instance of rdfs:Class in the shapes graph {
for each triple in the shapes graph matching (S rdfs:subClassOf ?o)
collectProperties(?o)
for each triple in the shapes graph matching (?s sh:targetClass S)
collectProperties(?s)
}
if S is a SHACL instance of sh:NodeShape in the shapes graph
for each triple in the shapes graph matching (S sh:node ?o)
collectProperties(?o)
for each rdf:type T of the value node in the data graph
collectProperties(T)
S。
本节其余部分是非规范性的。
以下示例说明在形状中使用 sh:closed,以指定这样一种
条件:
某些焦点节点仅对 ex:firstName 和
ex:lastName 具有值。
“忽略”的属性 rdf:type 也将被允许。
sh:closed sh:ByTypes 的用例包括在当前值节点类型的超类中
声明的属性(经由 rdfs:subClassOf),
以及通过 sh:targetClass 链接到这些类型的其他形状,
和可从一个节点形状经由 sh:node 到达另一个节点形状的形状。
sh:ByTypes 的示例可在测试用例库中找到:
closed-003.ttl,
closed-004.ttl.
sh:hasValue 指定这样一种条件:至少有一个值节点等于
给定的 RDF 项。
约束组件 IRI:
sh:HasValueConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:hasValue |
一个特定的必需值。 |
本节其余部分是非规范性的。
sh:in 指定这样一种条件:每个值节点都是所提供的
SHACL 列表的成员。
约束组件 IRI:sh:InConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:in |
一个SHACL 列表,其成员是允许值。
形状中
sh:in 的每个值都是一个SHACL 列表。
一个形状对
sh:in 最多有一个值。
每个这样的
列表应该至少有一个成员。
|
本节其余部分是非规范性的。
注意,字面量匹配需要精确,例如 "04"^^xsd:byte 不匹配
"4"^^xsd:integer。
sh:rootClass 指定的条件是,每个值节点都是给定类,
或者是该类的(传递)子类。
约束组件 IRI:
sh:RootClassConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:rootClass |
所有值节点都必须属于的类层级结构根。
形状中 sh:rootClass 的值要么是 IRI,
要么是空白节点,这些空白节点是格式良好的 SHACL
列表,其中所有成员都是 IRI。
|
本节其余部分是非规范性的。
sh:rootClass 约束通常与其值可以是类的属性形状一起使用
(例如通过 sh:class rdfs:Class),
以限制值节点允许的子类层级结构。
给定类充当所允许类层级结构的上边界。
sh:uniqueValuesFor 指定这样一种条件:某个值节点的一个或多个指定
属性的值
必须在当前形状的所有目标节点中唯一。
约束组件 IRI:
sh:UniqueValuesForConstraintComponent
| 属性 | 摘要和语法规则 |
|---|---|
sh:uniqueValuesFor |
一个 属性的 IRI,或者 一个 SHACL 列表,其中每个成员 都是某个属性的 IRI。 |
$uniqueValuesFor 为 sh:uniqueValuesFor 在
形状
S 中的一个
值。
令 $properties 为如下集合:
如果 $uniqueValuesFor 是一个 IRI,则
$properties = { uniqueValuesFor }。
如果 $uniqueValuesFor 是一个 SHACL 列表,则
$properties 是该列表的 成员的集合。
令 $targetNodes 为 S 的
目标节点。
V,如果在
$targetNodes 中存在另一个
节点,其对于 $properties 中所有属性的
值都与
V 完全相同,
则会产生一个验证结果。
如果 V 对于 $properties 中的任何属性都没有
值,
则不会产生结果。
本节其余部分是非规范性的。
注意,字面量匹配需要精确,例如 "04"^^xsd:byte 不匹配
"4"^^xsd:integer。
另请注意,sh:uniqueValuesFor 不规定这些值必须存在,因此
通常会与 sh:minCount 1 约束组合使用。
在此示例中,将为 ex:Record2 和
ex:Record3 报告两个约束违规,
因为它们对 ex:id 具有完全相同的值,并且位于同一形状的目标中。
然而,不会为 ex:id "One" 报告违规,因为
ex:UnrelatedNode 不是
ex:Record 的实例,因此不是 ex:SingleIdExampleShape 的目标。
注意,目标节点的计算仅依赖于形状的定义,例如
也持有
sh:uniqueValuesFor 约束的形状的 sh:targetClass 声明。
在上面的示例中,不会报告违规,因为该形状的所有焦点节点中没有任何两个节点 具有相同的两个指定属性组合。
本节是非规范性的。
虽然前几节介绍了表示验证条件的属性, 本节涵盖会被 SHACL 处理器忽略的属性。 这些所谓的非验证性 属性 的使用完全是可选的,并且不受正式解释契约约束。 它们可用于表单构建、代码生成或 RDF 文件的可预测打印等目的。
属性形状可以对 sh:name 具有一个或多个值,
以便为其出现的目标中的属性提供人类可读标签。
如果存在,工具应优先使用这种局部指定的标签,
而不是 rdf:Property 本身上的全局指定标签。
例如,如果表单显示一个位于给定属性形状目标中的节点,
且该属性形状带有 sh:name,那么工具应使用所提供的名称。
sh:name 的值
必须是字面量,其数据类型
为 xsd:string、rdf:dirLangString 或 rdf:langString。
类似地,属性形状可以对 sh:description 具有值,
以便在给定上下文中提供该属性的描述。
sh:description 的值
必须是字面量,其数据类型
为 xsd:string、rdf:dirLangString、rdf:langString 或
rdf:HTML。
sh:name 和 sh:description 都可以具有
多个值,但每个语言标签应只有一个值。
注意,sh:name 和 sh:description 不应当用于节点
形状。
对于节点形状,属性 rdfs:label 和 rdfs:comment 已经确立良好,
并且已用于类定义。
形状可以对 sh:intent 具有值,并且这些值应为字面量,
其数据类型为 xsd:string、rdf:langString
或 rdf:dirLangString。
属性 sh:intent 提供与形状相关的一个或多个预期
规则、假设或约束的人类可读描述。
不同于可能包含一般文档或编辑性文本的 rdfs:comment,
也不同于描述属性值含义的 sh:description,
sh:intent 专门用于捕获表达形状预期语义的单个类规则语句。
可以提供 sh:intent 的多个值,以表示不同的预期规则。
其中一些规则可能与已经使用 SHACL
约束组件形式化表达的约束重叠。
当 sh:intent 的某个值表示的语义也在同一
形状图中被形式化表示时,sh:intent 语句的三元组可以用属性值
sh:formalized true 进行具化。
然而,sh:intent 的存在或内容MUST NOT影响
SHACL 验证或一致性。
在此示例中,第一个 sh:intent 已经使用
sh:maxCount 捕获,
在这种情况下,文本描述可能由技术知识较少的人创建,
或者有意作为重复内容保留给不理解 SHACL 的代理。
第二个 sh:intent 很难在 SHACL 中形式化表达
(除非例如使用 SPARQL 函数 NOW)。
第三个 sh:intent 无法由 SHACL 引擎验证。
形状可以对 sh:agentInstruction 具有值,并且这些值应为
字面量,
其数据类型为 xsd:string、
rdf:langString 或 rdf:dirLangString。
此属性可用于表示可发送给理解自然语言的软件代理的文本指令。
此属性可以与来自 rdfs:comment、
sh:description、rdfs:label、sh:name、sh:intent
以及 sh:message 的类似文本描述一起使用,
以指示软件代理如何对形状进行语义解释。
形状可以对 sh:codeIdentifier 具有一个值,
以建议一个可用于 API、查询语言和类似程序化访问中的形状表示的名称。
sh:codeIdentifier 的值是一个字面量,其数据类型为 xsd:string,
并且该字符串匹配正则表达式 ^[a-zA-Z_][a-zA-Z0-9_]*$。
一个典型用例是从形状生成 GraphQL 查询
模式,将属性形状映射到 GraphQL 字段。
默认情况下,这类模式生成器可以使用
sh:path 的局部名称,但如果存在 sh:codeIdentifier,则应使用它。
在复杂路径表达式的情况下,强烈建议显式使用 sh:codeIdentifier。
API 生成器也有类似需求,例如 Java、JavaScript 或 Python 中的 API 生成器。
形状可以对属性 sh:unit 具有值,以指示关于值节点的计量单位、货币或类似信息。
sh:unit 的值可以是字面量,其数据类型为 xsd:string,
或 rdf:langString 或 rdf:dirLangString,也可以是 IRI。
SHACL 1.2 不规定 sh:unit 的具体值,因为在撰写本文时
(2026 年),
尚无官方 W3C 标准来统一表示它们,
并且 W3C 之外存在多个标准。
对于 SHACL 1.2,给出以下建议:
sh:unit 的值可以是一个 xsd:string
字面量,它精确匹配 UCUM 中定义的代码;
例如,sh:unit "cm"。
sh:unit 的值可以是一个 xsd:string 字面量,
它精确匹配 ISO 4217 中定义的代码;
例如,sh:unit "AUD"。
sh:unit 的值可以是由
QUDT 或类似单位词汇定义的 IRI;
例如 sh:unit qudt:CentiM。
"in" 外,还可以有 "Zoll"@de。
虽然这些语法规则有意保持灵活,但具体应用可以强制执行更具体的规则;
例如,在 sh:unit 属性上声明 sh:class qudt:Unit 约束。
基于 SHACL 的用户界面工具可以使用 sh:unit 的值来渲染值。
根据用户的区域设置,这些工具甚至可以在单位之间自动转换,
或者允许以不同于实际值存储单位的单位进行数据输入。
对于此示例,用户界面可以将高度渲染为
180.5 cm (71 in)
或者,对于美国访问者,渲染为
71 in (180.5 cm)
虽然 SHACL Core 没有为 sh:unit 指定具体语义,但某些
基于 SHACL 的扩展可能会将单位用于其他目的,包括验证。
例如,可以定义一个形状,对其属性声明 sh:unit "K" 的任何字面量强制执行
sh:minInclusive 0 约束。
上述示例的以下变体使用一个节点形状来封装 “欧元价格”的可复用定义,其中包含单位,也包含诸如最小值之类的约束。
属性形状可以对属性 sh:order 具有一个值,
以指示属性形状在表单构建等用途中的相对顺序。
sh:order 的值是字面量,其数据类型为 xsd:decimal 或
xsd:integer。
sh:order 不用于验证目的,
并且可用于任何类型的主语。
如果存在于属性形状上,sh:order 的建议用法是按升序排序
属性形状,例如使具有较小顺序值的属性
放在具有较大顺序值的属性之上或开头(在从左到右语言中为左侧)。
属性形状可以使用属性 sh:group 链接到类 sh:PropertyGroup 的一个
SHACL 实例,
以指示该形状属于一组相关属性形状。
每个组都可以有额外的三元组来服务于应用目的,
例如用于表单构建的 rdfs:label。
组也可以有一个 sh:order 属性,
以指示同一表单中各组的相对顺序。
以下示例说明这些不同特性如何一起使用。
表单构建应用可以使用上述信息显示如下内容:
| 名: | John |
| 姓: | Doe |
| 街道地址: | 123 Silverado Ave |
| 所在地: | Cupertino |
| 邮政编码: | 54321 |
注意,以下示例也会生成相同的信息,
它改变了三元组的顺序,但没有改变 sh:order 值:
xsd:string、rdf:langString、
rdf:dirLangString 或 rdf:HTML 类型字面量的谓词,用户应避免使用
xsd:string,而优先使用 rdf:langString 或 rdf:dirLangString。
建议使用语言标签,并在适当时使用方向性标记,以支持国际化并正确处理
双向文本。
本节枚举 SHACL 的所有规范性语法规则。 本节由本规范的其他部分自动生成,并提供超链接返回到正文, 以便在规则上下文不清楚时查看。 在形状图中违反这些规则的节点是格式不良的。
| 语法规则 ID | 语法规则文本 |
|---|---|
| SHACL-list | RDF 图 G 中的 SHACL 列表是一个 IRI 或空白节点,
它要么是 rdf:nil(前提是 rdf:nil 对 rdf:first
或 rdf:rest 都没有值),
要么在 G 中对属性 rdf:first 恰好有一个值,
并且在 G 中对属性 rdf:rest 恰好有一个值,
该值在 G 中也为 SHACL 列表,
并且该列表在 G 中不以自身作为属性路径 rdf:rest+ 的值。
|
| entailment-nodeKind | 属性 sh:entailment 的值是 IRI。 |
| shape |
形状
是一个 IRI 或空白节点 s,
它在形状图中
满足以下条件中的至少一个:
|
| multiple-parameters |
某些约束组件(例如 sh:PatternConstraintComponent)声明多个
参数。
对此类组件的任何参数具有多个值的形状是格式不良的。
|
| targetNode-nodeKind | 形状中 sh:targetNode 的每个值都是格式良好的
节点表达式。
|
| targetClass-nodeKind | 形状中 sh:targetClass 的每个值都是 IRI。
|
| implicit-targetClass-nodeKind |
如果 s 是 RDF 图 G 中 sh:NodeShape 或
sh:PropertyShape 的 SHACL 实例,
并且 s 在 G 中也是
rdfs:Class 的 SHACL 实例,
且 s 不是 IRI,则
s 是 G 中的格式不良形状。
|
| targetSubjectsOf-nodeKind | 形状中 sh:targetSubjectsOf 的值是 IRI。
|
| targetObjectsOf-nodeKind | 形状中 sh:targetObjectsOf 的值是 IRI。
|
| targetWhere-node | 形状中 sh:targetWhere 的每个值都是格式良好的形状。
|
| shape-nodeKind | sh:shape 的每个值都是 IRI。
|
| severity-maxCount | 形状可以在形状图中为属性 sh:severity 指定一个值。 |
| severity-nodeKind | sh:severity 的每个值都是 IRI。
|
| severity-reifier-maxCount |
令 T 为表示某个形状中
约束的一组三元组。
形状图可以在 T 中这些三元组的具化器中,
为属性 sh:severity 最多指定一个值。
|
| message-datatype | sh:message 的值是字面量,其数据类型
为 xsd:string、rdf:dirLangString、rdf:langString 或
rdf:HTML。
一个主语不应具有多个带相同语言标签的 sh:message 值,
也不应具有多个数据类型为 xsd:string 的值。
|
| message-reifier-maxCount |
令 T 为表示某个形状中
约束的一组三元组。
形状图可以在 T 中这些三元组的具化器中,
为属性 sh:message 最多指定一个值。
|
| deactivated-maxCount | 形状对属性 sh:deactivated 最多可以有一个值。 |
| deactivated-datatype | sh:deactivated 的值是一个节点表达式,
它必须以 true 或 false 作为(唯一的)输出节点。 |
| deactivated-reified-maxCount | 一个三元组,如果其形状作为主语,
并以参数(例如 sh:minCount)作为谓词,
则它最多可以有一个具化器,该具化器对属性
sh:deactivated 具有一个值。
|
| NodeShape-path-maxCount | sh:NodeShape 的 SHACL 实例不能对属性 sh:path
具有值。
|
| PropertyShape | 属性形状是形状图中的一个形状,
该形状是一个以 sh:path 作为其谓词的三元组的主语。 |
| path-maxCount | 一个形状对 sh:path 最多有一个值。 |
| path-node | 属性形状中 sh:path 的值是格式良好的
SHACL 属性路径。
|
| PropertyShape-path-minCount | sh:PropertyShape 的 SHACL 实例对属性 sh:path 有一个
值。
|
| path-values | 属性形状对属性
sh:values 最多有一个值,并且此值是格式良好的节点表达式。
|
| path-defaultValue | 属性形状对属性
sh:defaultValue 最多有一个值,并且此值是格式良好的节点表达式。
|
| path-values-iri | 只有当属性形状的
sh:path 值是谓词路径时,
它才能对 sh:values 和/或 sh:defaultValue 具有值。
|
| path-metarule | 如果 RDF 图中的节点恰好满足以下子节中的一个语法规则,则它是格式良好的 SHACL 属性
路径 p。 |
| path-non-recursive | 如果 p 是空白节点,并且 p 的任何路径映射直接或传递地引用
p,则节点 p 不是格式良好的 SHACL 属性路径。
|
| path-sequence | 序列路径是一个空白节点,它是一个具有至少两个成员的 SHACL 列表, 且每个成员都是格式良好的 SHACL 属性路径。 |
| path-alternative |
备选路径是一个空白节点,它在 G 中恰好是一个三元组的主语。
该三元组以 sh:alternativePath 作为谓词,以 L 作为宾语,
并且 L 是具有至少两个成员
的 SHACL 列表,
且 L 的每个成员都是格式良好的 SHACL 属性路径。
|
| path-inverse |
反向路径是一个空白节点,它在 G 中恰好是一个三元组的主语。
该三元组以 sh:inversePath 作为谓词,且宾语 v 是格式良好的 SHACL
属性路径。
|
| path-zero-or-more |
零次或多次路径是一个空白节点,它在 G 中恰好是一个三元组的主语。
该三元组以 sh:zeroOrMorePath 作为谓词,且宾语 v 是格式良好的 SHACL
属性路径。
|
| path-one-or-more |
一次或多次路径是一个空白节点,它在 G 中恰好是一个三元组的主语。
该三元组以 sh:oneOrMorePath 作为谓词,且宾语 v 是格式良好的 SHACL
属性路径。
|
| path-zero-or-one |
零次或一次路径是一个空白节点,它在 G 中恰好是一个三元组的主语。
该三元组以 sh:zeroOrOnePath 作为谓词,且宾语 v 是格式良好的 SHACL
属性路径。
|
| IRIExpression-syntax | 如果 RDF 图中的节点是 IRI,则它是格式良好的 IRI 表达式。 |
| LiteralExpression-syntax | 如果 RDF 图中的节点是字面量,则它是格式良好的字面量 表达式。 |
| ShapesGraph | sh:ShapesGraph 类MAY用作某个图的 IRI 的
rdf:type,该图通常承担形状图的角色。
|
| DataGraph | sh:DataGraph 类MAY用作某个图的 IRI
的 rdf:type,
该图通常用作数据图。 |
| shapesGraph-nodeKind | sh:shapesGraph 的每个值都是 IRI |
| class-nodeKind | 形状中 sh:class 的值要么是 IRI,
要么是空白节点,并且这些空白节点是格式良好的 SHACL 列表,其中所有成员都是 IRI。
|
| datatype-maxCount | 一个形状对 sh:datatype 最多有一个值。 |
| datatype-nodeKind | 形状中 sh:datatype 的值要么是 IRI,
要么是空白节点,并且该空白节点是格式良好的 SHACL 列表,其中所有成员都是 IRI。
|
| nodeKind-maxCount | 一个形状对 sh:nodeKind 最多有一个值。 |
| nodeKind-in |
如果 sh:nodeKind 的值是 IRI,则形状中 sh:nodeKind 的值是类
sh:NodeKind 的以下七个实例之一:
sh:BlankNode、sh:IRI、sh:Literal
sh:BlankNodeOrIRI、sh:BlankNodeOrLiteral、sh:IRIOrLiteral
和 sh:TripleTerm。
如果 sh:nodeKind 的值是格式良好的 SHACL 列表,则形状中这些列表的成员
是类 sh:NodeKind 的以下四个实例之一:
sh:BlankNode、sh:IRI、sh:Literal 和
sh:TripleTerm。
|
| minCount-scope | 节点形状不能对
sh:minCount 具有任何值。
|
| minCount-maxCount | 属性形状对
sh:minCount 最多有一个值。
|
| minCount-datatype | 属性形状中 sh:minCount 的值是数据类型为
xsd:integer 的字面量。
|
| maxCount-scope | 节点形状不能对
sh:maxCount 具有任何值。
|
| maxCount-maxCount | 属性形状对
sh:maxCount 最多有一个值。
|
| maxCount-datatype | 属性形状中 sh:maxCount 的值是数据类型为
xsd:integer 的字面量。
|
| minExclusive-nodeKind | 形状中 sh:minExclusive 的值是字面量。 |
| minExclusive-maxCount | 一个形状对 sh:minExclusive 最多有一个值。 |
| minInclusive-nodeKind | 形状中 sh:minInclusive 的值是字面量。 |
| minInclusive-maxCount | 一个形状对 sh:minInclusive 最多有一个值。 |
| maxExclusive-nodeKind | 形状中 sh:maxExclusive 的值是字面量。 |
| maxExclusive-maxCount | 一个形状对 sh:maxExclusive 最多有一个值。 |
| maxInclusive-nodeKind | 形状中 sh:maxInclusive 的值是字面量。 |
| maxInclusive-maxCount | 一个形状对 sh:maxInclusive 最多有一个值。 |
| minLength-datatype | 形状中 sh:minLength 的值是数据类型为
xsd:integer 的字面量。
|
| minLength-maxCount | 一个形状对 sh:minLength 最多有一个值。 |
| maxLength-datatype | 形状中 sh:maxLength 的值是数据类型为
xsd:integer 的字面量。
|
| maxLength-maxCount | 一个形状对 sh:maxLength 最多有一个值。 |
| pattern-datatype | 形状中 sh:pattern 的值是数据类型为 xsd:string 的字面量。
|
| pattern-regex | 形状中 sh:pattern 的值是 SPARQL REGEX 函数的有效 pattern 参数。 |
| flags-datatype | 形状中 sh:flags 的值是数据类型为 xsd:string 的字面量。
|
| singleLine-datatype | 形状中 sh:singleLine 的值是数据类型为
xsd:boolean 的字面量。
|
| singleLine-maxCount | 一个形状对 sh:singleLine 最多有一个值。 |
| languageIn-node | 形状中 sh:languageIn 的每个值都是 SHACL 列表。 |
| languageIn-members-datatype | 此类列表的每个成员都是数据类型为
xsd:string 的字面量。
|
| languageIn-maxCount | 一个形状对 sh:languageIn 最多有一个值。 |
| uniqueLang-datatype | 形状中 sh:uniqueLang 的值是数据类型为
xsd:boolean 的字面量。
|
| uniqueLang-maxCount | 属性形状对 sh:uniqueLang 最多有一个值。 |
| uniqueLang-scope | 节点形状不能对
sh:uniqueLang 具有任何值。
|
| memberShape-node | sh:memberShape 的值必须是格式良好的节点形状。 |
| minListLength-datatype | 形状中 sh:minListLength 的值是数据类型为
xsd:integer 的字面量。
|
| minListLength-minInclusive | 形状中 sh:minListLength 的值是大于或等于 0 的整数。 |
| maxListLength-datatype | 形状中 sh:maxListLength 的值是数据类型为
xsd:integer 的字面量。
|
| maxListLength-minInclusive | 形状中 sh:maxListLength 的值是大于或等于 0 的整数。 |
| uniqueMembers-datatype | 形状中 sh:uniqueMembers 的值是数据类型为
xsd:boolean 的字面量。
|
| equals-nodeKind | 形状中 sh:equals 的值是格式良好的 SHACL 属性路径。 |
| disjoint-nodeKind | 形状中 sh:disjoint 的值是格式良好的 SHACL 属性路径。 |
| subsetOf-nodeKind | 形状中 sh:subsetOf 的值是格式良好的 SHACL 属性路径。 |
| lessThan-nodeKind | 形状中 sh:lessThan 的值是格式良好的 SHACL 属性路径。 |
| lessThan-scope | 节点形状不能对
sh:lessThan 具有任何值。
|
| lessThanOrEquals-nodeKind | 形状中 sh:lessThanOrEquals 的值是格式良好的 SHACL 属性路径。 |
| lessThanOrEquals-scope | 节点形状不能对
sh:lessThanOrEquals 具有任何值。
|
| not-node | 形状中 sh:not 的值必须是格式良好的形状。 |
| and-node | 形状中 sh:and 的每个值都是 SHACL 列表。 |
| and-members-node | 此类列表的每个成员都必须是格式良好的形状。 |
| or-node | 形状中 sh:or 的每个值都是 SHACL 列表。 |
| or-members-node | 此类列表的每个成员都必须是格式良好的形状。 |
| xone-node | 形状中 sh:xone 的每个值都是 SHACL 列表。 |
| xone-members-node | 此类列表的每个成员MUST是格式良好的形状。 |
| xone-minListLength | 每个这样的列表SHOULD至少有一个成员。 |
| node-node | 形状中 sh:node 的值必须是格式良好的节点形状。 |
| property-node | 形状中 sh:property 的每个值都必须是格式良好的属性形状。 |
| someValue-shape | 形状中 sh:someValue 的值必须是格式良好的形状。
|
| qualifiedValueShape-node | 形状中 sh:qualifiedValueShape 的值必须是格式良好的形状。
|
| qualifiedValueShape-scope | 节点形状不能对
sh:qualifiedValueShape 具有任何值。
|
| qualifiedValueShapesDisjoint-datatype | 形状中 sh:qualifiedValueShapesDisjoint 的值是数据类型为
xsd:boolean 的字面量。
|
| qualifiedMinCount-datatype | 形状中 sh:qualifiedMinCount 的值是数据类型为
xsd:integer 的字面量。
|
| qualifiedMaxCount-datatype | 形状中 sh:qualifiedMaxCount 的值是数据类型为
xsd:integer 的字面量。
|
| reifierShape-node |
sh:reifierShape 的值必须是格式良好的节点形状。
如果给出了 sh:reifierShape 的值,则 sh:path 值受限为
IRI。
|
| reificationRequired-datatype | 形状中 sh:reificationRequired 的值是数据类型为
xsd:boolean 的字面量。
|
| closed-datatype | 形状中 sh:closed 的值是数据类型为 xsd:boolean 的字面量,
或者是 IRI sh:ByTypes。 |
| ignoredProperties-node | 形状中 sh:ignoredProperties 的值必须是 SHACL 列表。 |
| ignoredProperties-members-nodeKind | 此类列表的每个成员都必须是 IRI。 |
| in-node | 形状中 sh:in 的每个值都是 SHACL 列表。 |
| in-maxCount | 一个形状对 sh:in 最多有一个值。 |
| in-minListLength | 每个这样的列表SHOULD至少有一个成员。 |
| rootClass-nodeKind |
形状中 sh:rootClass 的值要么是 IRI,
要么是空白节点,并且这些空白节点是格式良好的 SHACL 列表,其中所有成员都是 IRI。
|
| uniqueValuesFor-node | 一个属性的 IRI,或者 一个 SHACL 列表,其中每个成员都是 某个属性的 IRI。 |
本节是非规范性的。
SHACL 1.2 概述的 SHACL-SHACL 附录 描述了可用于验证其他 SHACL 形状图的 SHACL 图,因此可以强制执行许多与旨在符合各类 SHACL 规范的 RDF 数据相关的语法 约束。
SHACL-SHACL 形状图按规范提供,也以捆绑的“并集”形式提供于 http://www.w3.org/ns/shacl-shacl,如 概述的附录中所示。
本节枚举 SHACL Core 的所有规范性验证器。 本节由本规范的其他部分自动生成,并提供超链接返回到正文, 以便在验证器上下文不清楚时查看。
| 按约束组件列出的验证器 |
|---|
sh:ClassConstraintComponent:
令 $class 为 sh:class 的一个参数值。
令 classes 为一组 IRI,
使得
当 $class 是一个 IRI 时,
该集合仅恰好包含该 IRI;
当 $class 是一个空白节点 SHACL 列表时,该
集合恰好由该列表的成员组成。对于每个值节点, 如果它是字面量,或者是非字面量但在 数据图中不是任何 classes 的SHACL 实例,
则存在一个验证结果,其中该值节点作为
sh:value。
|
sh:DatatypeConstraintComponent:
令 $datatype 为
sh:datatype 的一个参数值。
令 datatypes 为一组 IRI,
使得
当 $datatype 是一个 IRI 时,
该集合仅恰好包含该 IRI;
当 $datatype 是一个空白节点 SHACL 列表时,该
集合恰好由该列表的成员组成。对于每个值节点, 如果它不是字面量,或者是字面量且其数据类型与 datatypes 中任何一个都不匹配,
则存在一个验证结果,其中该值节点作为
sh:value。字面量的数据类型按照 SPARQL 1.2 的 datatype 函数确定。 如果字面量的数据类型具有相同的 IRI, 并且对于 SPARQL 1.2 支持的数据类型而言,该字面量不是类型错误字面量,则该字面量匹配该数据类型。 |
sh:NodeKindConstraintComponent:
令 $nodeKind 为
sh:nodeKind 的一个参数值。
令 $nodeKinds 为一组 IRI,
使得
当 $nodeKind 是一个 IRI 时,
该集合仅恰好包含该 IRI;
当 $nodeKind 是一个空白节点 SHACL 列表时,该
集合恰好由该列表的成员组成。对于每个与 $nodeKinds 中任何一个都不匹配的值节点,
存在一个验证结果,其中该值节点作为
sh:value。
任何 IRI 仅匹配 sh:IRI、
sh:BlankNodeOrIRI 和 sh:IRIOrLiteral。
任何空白节点仅匹配 sh:BlankNode、
sh:BlankNodeOrIRI 和 sh:BlankNodeOrLiteral。
任何字面量仅匹配 sh:Literal、
sh:BlankNodeOrLiteral 和 sh:IRIOrLiteral。
任何三元组项仅匹配 sh:TripleTerm。
|
sh:MinCountConstraintComponent:
令 $minCount 为
sh:minCount 的一个参数值。
如果值节点的数量少于 $minCount,
则存在一个验证结果。
|
sh:MaxCountConstraintComponent:
令 $maxCount 为
sh:maxCount 的一个参数值。
如果值节点的数量大于 $maxCount,
则存在一个验证结果。
|
sh:MinExclusiveConstraintComponent:
令 $minExclusive 为
sh:minExclusive 的一个参数值。
对于每个值节点 v,
如果 SPARQL 表达式 $minExclusive < v 不返回 true,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:MinInclusiveConstraintComponent:
令 $minInclusive 为
sh:minInclusive 的一个参数值。
对于每个值节点 v,
如果 SPARQL 表达式 $minInclusive <= v 不返回 true,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:MaxExclusiveConstraintComponent:
令 $maxExclusive 为
sh:maxExclusive 的一个参数值。
对于每个值节点 v,
如果 SPARQL 表达式 $maxExclusive > v 不返回 true,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:MaxInclusiveConstraintComponent:
令 $maxInclusive 为
sh:maxInclusive 的一个参数值。
对于每个值节点 v,
如果 SPARQL 表达式 $maxInclusive >= v 不返回 true,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:MinLengthConstraintComponent:
令 $minLength 为
sh:minLength 的一个参数值。
对于每个值节点 v,
如果 v 的字符串表示(按 SPARQL str 函数定义)
的长度(按 SPARQL STRLEN 函数定义)
小于 $minLength,或者 v 是空白节点,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:MaxLengthConstraintComponent:
令 $maxLength 为
sh:maxLength 的一个参数值。
对于每个值节点 v,
如果 v 的字符串表示(按 SPARQL str 函数定义)
的长度(按 SPARQL STRLEN 函数定义)
大于 $maxLength,或者 v 是空白节点,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:PatternConstraintComponent:
令 $pattern 为
sh:pattern 的一个参数值。
令 $flags 为 sh:flags 的一个参数值。
对于每个值节点,
如果它是空白节点,或者其字符串表示(按 SPARQL str 函数定义)
不匹配正则表达式 $pattern(按 SPARQL REGEX 函数定义),
则存在一个验证结果,其中该值节点作为
sh:value。
如果 $flags 具有值,则匹配MUST遵循
SPARQL REGEX 函数三参数变体的定义,并使用 $flags 作为
第三个参数。
|
sh:SingleLineConstraintComponent:
令 $singleLine 为
sh:singleLine 的一个参数值。
如果 $singleLine 为 true,则对于每个值节点,
如果它是字面量,且其词法形式匹配正则表达式(按 SPARQL REGEX 函数定义)
[\f\r\n\v],则存在一个验证结果。
|
sh:LanguageInConstraintComponent:
令 $languageIn 为 sh:languageIn 的一个值。
对于每个值节点,
如果它不是字面量,或者它没有与
$languageIn 的成员中的任何基本语言范围相匹配的语言标签,
该匹配遵循 SPARQL langMatches 函数定义的过滤模式,
则存在一个验证结果,其中该值节点作为
sh:value。
|
sh:UniqueLangConstraintComponent:
令 $uniqueLang 为
sh:uniqueLang 的一个参数值。
如果 $uniqueLang 为 true,
则对于每个被至少两个值节点使用的非空语言标签,
存在一个验证结果。
对于值节点中数据类型为 数据类型 rdf:dirLangString 的节点,
基底方向会纳入唯一性
条件,
例如,"1"@ar--rtl 与 "1"@ar-ltr 不同,
"1"@ar--rtl 与 "1"@ar 这一对也是如此。
|
sh:MemberShapeConstraintComponent:
令 $memberShape 为
sh:memberShape 的一个参数值。
每个值节点 v 必须是一个 SHACL 列表——如果 v 不是 SHACL 列表,则存在一个
验证结果。
如果 SHACL 列表 v 的任何成员 m
不符合
$memberShape,则存在一个验证结果。
|
sh:MinListLengthConstraintComponent:
令 $minListLength 为
sh:minListLength 的一个参数值。
每个值节点 v 必须是一个 SHACL 列表——如果 v 不是 SHACL 列表,则存在一个
验证结果。
如果列表 v 中的成员数量少于 $minListLength,
则存在一个验证结果。
|
sh:MaxListLengthConstraintComponent:
令 $maxListLength 为
sh:maxListLength 的一个参数值。
每个值节点 v 必须是一个 SHACL 列表——如果 v 不是 SHACL 列表,则存在一个
验证结果。
如果列表 v 中的成员数量多于 $maxListLength,
则存在一个验证结果。
|
sh:UniqueMembersConstraintComponent:
令 $uniqueMembers 为
sh:uniqueMembers 的一个参数值。
每个值节点 v 必须是一个 SHACL 列表——如果 v 不是 SHACL 列表,则存在一个
验证结果。
如果 $uniqueMembers 为 true,并且列表 v 有重复
成员,
则存在一个验证结果。
|
sh:EqualsConstraintComponent:
令 $equals 为 sh:equals 的一个值,并令 $path
为SHACL 属性路径,它由
$equals 在形状图中表示。
令 $otherNodes 为可从焦点节点通过
$path 到达的节点集合。
对于每个不存在于 $otherNodes 中的值节点,
存在一个验证结果,其中该值节点作为
sh:value。
对于 $otherNodes 中每个不是值节点之一的节点,
存在一个验证结果,其中该值作为
sh:value。
|
sh:DisjointConstraintComponent:
令 $disjoint 为
sh:disjoint 的一个参数值,并令 $path
为SHACL 属性路径,它由
$disjoint 在形状图中表示。
令 $otherNodes 为可从焦点节点通过
$path 到达的节点集合。
对于每个也在 $otherNodes 中的值节点,
存在一个验证结果,其中该值节点作为
sh:value。
|
sh:SubsetOfConstraintComponent:
令 $subsetOf 为 sh:subsetOf 的一个值,并令 $path
为SHACL 属性路径,它由
$subsetOf 在形状图中表示。
令 $otherNodes 为可从焦点节点通过
$path 到达的节点集合。
对于每个不存在于 $otherNodes 中的值节点,
存在一个验证结果,其中该值节点作为
sh:value。
|
sh:LessThanConstraintComponent:
令 $lessThan 为 sh:lessThan 的一个值,并令 $path
为SHACL 属性路径,它由
$lessThan 在形状图中表示。
令 $otherNodes 为可从焦点节点通过
$path 到达的节点集合。
对于每一对值节点和 $otherNodes 中的成员,
如果第一个值不小于第二个值(基于 SPARQL 的
< 运算符),
或者这两个值无法比较,
则存在一个验证结果,其中该值节点作为
sh:value。
|
sh:LessThanOrEqualsConstraintComponent:
令 $lessThanOrEquals 为 sh:lessThanOrEquals 的一个值,
并令 $path
为SHACL 属性路径,它由
$lessThanOrEquals 在形状图中表示。
令 $otherNodes 为可从焦点节点通过
$path 到达的节点集合。
对于每一对值节点和 $otherNodes 中的成员,
如果第一个值不小于或等于第二个值
(基于 SPARQL 的 <= 运算符),
或者这两个值无法比较,
则存在一个验证结果,其中该值节点作为
sh:value。
|
sh:NotConstraintComponent:
令 $not 为 sh:not 的一个值。
对于每个值节点 v:
如果针对形状 $not 对 v 进行一致性检查产生失败,
则MUST报告一个失败。
否则,如果 v 符合形状 $not,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:AndConstraintComponent:
令 $and 为 sh:and 的一个值。
对于每个值节点 v:
如果针对 $and 的任何成员对 v 进行一致性检查产生失败,
则MUST产生一个失败。
否则,如果 v 不符合
$and 的每个成员,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:OrConstraintComponent:
令 $or 为 sh:or 的一个值。
对于每个值节点 v:
如果针对任何成员对 v 进行一致性检查产生失败,
则MUST产生一个失败。
否则,如果 v 不符合
$or 的任何成员,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:XoneConstraintComponent:
令 $xone 为 sh:xone 的一个值。
对于每个值节点 v,
令 N 为这些形状的数量:它们是
$xone 的成员,
且 v 符合该形状。
如果针对任何成员对 v 进行一致性检查产生失败,
则MUST产生一个失败。
否则,如果 N 不恰好为 1,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:NodeConstraintComponent:
令 $node 为 sh:node 的一个值。
对于每个值节点 v:
如果针对 $node 对 v 进行一致性检查产生失败,
则MUST产生一个失败。
否则,如果 v 不符合 $node,
则存在一个验证结果,其中 v 作为
sh:value。
|
sh:PropertyConstraintComponent:
令 $property 为 sh:property 的一个值。
对于每个值节点 v:
如果将 v 作为焦点节点根据属性形状 $property
进行验证产生失败,
则MUST产生一个失败。
否则,验证结果即为将 v 作为焦点节点根据属性形状 $property
进行验证所得结果。
|
sh:SomeValueConstraintComponent:
令 $someValue 为 sh:someValue 的一个值。
如果对任何值节点根据
$someValue 进行一致性检查产生失败,则MUST产生一个失败,除非至少有一个值节点
符合 $someValue。
否则,如果没有任何值节点符合 $someValue,
则存在一个验证结果。
|
sh:QualifiedMinCountConstraintComponent:
令 $qualifiedValueShape 为
sh:qualifiedValueShape 的一个值。
令 $qualifiedMinCount 为
sh:qualifiedMinCount 的一个参数值。
令 C 为值节点 v 的数量,其中
v 符合 $qualifiedValueShape,
且 v 不符合当前形状的任何兄弟形状,
即正在根据其验证 v、并且以
$qualifiedValueShape 作为其 sh:qualifiedValueShape 值的形状。
如果上述任何一致性检查产生失败,则MUST产生一个失败。
否则,如果 C 小于
$qualifiedMinCount,则存在一个验证结果。
sh:qualifiedMinCount 的约束组件是
sh:QualifiedMinCountConstraintComponent。
|
sh:QualifiedMaxCountConstraintComponent:
令 $qualifiedMaxCount 为
sh:qualifiedMaxCount 的一个参数值。
令 C 为上文针对 sh:qualifiedMinCount 定义的值。
如果上述任何一致性检查产生失败,则MUST产生一个失败。
否则,如果 C 大于
$qualifiedMaxCount,则存在一个验证结果。
sh:qualifiedMaxCount 的约束组件是
sh:QualifiedMaxCountConstraintComponent。
|
sh:ReifierShapeConstraintComponent:
令 t 为三元组项(焦点节点,
$path,值节点)。
对于三元组项 t 的每个具化器,如果将该具化器作为焦点节点
根据节点形状
$reifierShape 进行验证产生失败,则MUST产生一个失败。
对于每个不符合
$reifierShape 的具化器 t,存在一个验证结果,其中 t 作为
sh:value。
|
sh:ReificationRequiredConstraintComponent:
如果 $reificationRequired 设置为 true,且数据图中不存在三元组项 t 的具化语句,
则存在一个验证结果,其中 t 作为 sh:value。
|
sh:ClosedConstraintComponent:
令 $closed 为
sh:closed 的一个参数值。
令 $ignoredProperties 为 sh:ignoredProperties 的一个值。
如果 $closed 是 true 或 sh:ByTypes,且 P
是下文定义的属性集合,
则对于每个这样的三元组,都存在一个验证结果:该三元组以值节点作为其
主语,并且以一个不在 P 中的谓词作为谓词。
如果 $ignoredProperties 具有值,则作为此 SHACL 列表的成员枚举的属性,也允许用于该值节点。
该验证结果MUST以该三元组的谓词作为其
sh:resultPath,
并以该三元组的宾语作为其 sh:value。
如果 $closed 是 true,则 P 是可从当前形状经由
SPARQL 路径 sh:property/sh:path 到达的 IRI
属性集合。
如果 $closed 是 sh:ByTypes,则 P 是可从值节点经由以下算法到达的
IRI 属性集合,再加上 rdf:type:
S。
|
sh:HasValueConstraintComponent:
令 $hasValue 为
sh:hasValue 的一个参数值。
如果 RDF 项 $hasValue 不在值节点之中,
则存在一个验证结果。
|
sh:InConstraintComponent:
令 $in 为 sh:in 的一个值。
对于每个不是 $in 的成员的值节点,
存在一个验证结果,其中该值节点作为
sh:value。
|
sh:RootClassConstraintComponent:
令 $rootClass 为
sh:rootClass 的一个参数值。
令 classes 为一组 IRI,
使得
当 $rootClass 是一个 IRI 时,
该集合仅恰好包含该 IRI;
当 $rootClass 是一个空白节点 SHACL 列表时,该
集合恰好由该列表的成员组成。对于每个值节点, 如果它不是一个 IRI,或者它是一个 IRI, 但不存在 classes 中的任何 class,
使得数据图蕴涵
valueNode rdfs:subClassOf* class,
则存在一个验证结果,其中该值节点作为
sh:value。
|
sh:UniqueValuesForConstraintComponent:
令 $uniqueValuesFor 为 sh:uniqueValuesFor 在 形状 S 中的一个
值。
令 $properties 为如下集合:
如果 $uniqueValuesFor 是一个 IRI,则
$properties = { uniqueValuesFor }。
如果 $uniqueValuesFor 是一个 SHACL 列表,则
$properties 是该列表的 成员的集合。
令 $targetNodes 为 S 的 目标节点。
对于每个值节点 V,如果在 $targetNodes 中存在另一个节点,
其对于 $properties 中所有属性的值都与
V 完全相同,
则会产生一个验证结果。
如果 V 对于 $properties 中的任何属性都没有值,
则不会产生结果。
|
本节是非规范性的。
与大多数基于 RDF 的技术一样,SHACL 处理器可能会在由各种来源组合而成的图上运行。
某些应用可能具有开放的“链接数据”架构,并动态地从组织信任网络之外的来源
组装 RDF 三元组。
由于 RDF 允许任何人添加关于任何资源的陈述,三元组可能会修改形状定义或数据图中节点原本
预期的语义,从而导致误导性结果。
防范这种(以及以下)场景,可以通过仅使用受信任且已验证的
RDF 来源,并消除通过 owl:imports 和 sh:shapesGraph
动态添加图的可能性来实现。
本节是非规范性的。
原始 SHACL core 规范由 RDF Data Shapes Working Group 制作。 请参见其致谢章节。
本节是非规范性的。
sh:targetNode、sh:deactivated 和
sh:defaultValue,并引入 sh:values 以支持节点表达式。
sh:singleLine,见 Issue 177sh:someValue,见 Issue 178sh:ShapeClass;见
Issue 212
sh:closed 添加新值 sh:ByTypes;见 Issue 172sh:class 和 sh:datatype 的值现在也可以是列表,表示一组
选择的并集;见 Issue 160sh:nodeKind 的值现在也可以是列表,
表示一组选项的并集;见 Issue 407
sh:ReifierShape;见 Issue 300sh:conformanceDisallows 属性;
见 Issue 453rdf:dirLangString 的支持,见 Issue
737
sh:rootClass,见 Issue 792sh:subsetOf,
见 Issue 786sh:DataGraph 和 sh:ShapesGraph;见 Issue 169sh:uniqueValuesFor,见 Issue 661owl:versionIRI 的支持,并扩展格式良好形状图的定义,以包含来自 [owl2-syntax]
的导入闭包约束;
见 Issue 830Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: