SHACL 1.2 核心

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-shacl12-core-20261014/
最新发布版本:
https://www.w3.org/TR/shacl12-core/
最新编辑草案:
https://w3c.github.io/data-shapes/shacl12-core/
历史:
https://www.w3.org/standards/history/shacl12-core/
提交历史
测试套件:
https://github.com/w3c/data-shapes/tree/gh-pages/shacl12-test-suite
最新推荐标准:
https://www.w3.org/TR/2017/REC-shacl-20170720/
编辑:
(TopQuadrant, Inc.)
(TopQuadrant, Inc.)
(Inria)
(牛津大学)
前任编辑:
Dimitris Kontokostas
反馈:
GitHub w3c/data-shapes (拉取请求, 新建议题, 未关闭的议题)
public-shacl@w3.org 并在主题 行中注明 [shacl12-core] (归档)

摘要

本文档定义了 SHACL 的核心。

SHACL,即形状约束语言,是一种用于描述 RDF 图结构的语言。 SHACL 可用于定义类以及这些类的实例可以具有的属性。 比类和实例更通用的是,SHACL 引入了形状的概念, 它可以形式化地指定 RDF 节点和边结构上的约束。 SHACL 形状本身表示在称为形状图的 RDF 图中。 由形状图描述的 RDF 图称为数据图。

SHACL 可用于多种目的,例如 验证、推理、领域建模、生成本体以告知其他代理、 构建用户界面、生成代码以及集成数据。

本文档状态

本节描述本文档在发布时的状态。当前 W3C 出版物以及本技术报告最新修订版的列表可在 W3C 标准和草案 索引中找到。

本文档由 Data Shapes 工作组作为 工作草案发布,采用 推荐标准 轨道。

发布为 工作草案并不意味着 W3C 及其成员认可。

这是一份草案文档,可能随时被其他 文档更新、替换或废弃。除作为正在进行中的工作外,不宜引用本文档。

本文档由一个依据 W3C 专利 政策运作的小组制作。 W3C 维护了一份 任何专利 披露的公开列表, 这些披露与该小组的交付物相关;该页面还包括 披露专利的说明。实际知晓某项专利且认为该专利包含 必要权利要求 的个人,必须依照 W3C 专利政策第 6 节披露相关信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档约束。

SHACL 规范

本规范是 SHACL 1.2 规范系列的一部分。请参阅 SHACL 1.2 概述,以获取更详细的 相关介绍。

这些规范如下:

工作草案:

SHACL 1.2 核心
定义 SHACL 的核心部分
SHACL 1.2 节点表达式
定义用于在 SHACL 中派生焦点节点和值节点的表达式
SHACL 1.2 SPARQL 相关特性
定义 SHACL 中与 SPARQL 相关的扩展
SHACL 1.2 推理规则
定义 SHACL 基于规则的推理框架
SHACL 1.2 剖析
定义如何使用 SHACL 对数据(包括 SHACL 数据)进行剖析
SHACL 1.2 用户 界面
定义如何使用 SHACL 生成用户界面
SPARQL 1.2 RL
定义一种用于 RDF 的 Datalog 风格规则语言,可与 SHACL 1.2 推理规则配合使用

编辑草稿:

SHACL 1.2 概述
概述了 SHACL 规范集
SHACL 1.2 紧凑语法
定义了用于表达 SHACL 概念的 RDF 语法
注

实现者可以部分检查其对上述规范的符合程度,方法是测试 自身实现, 所用测试用例由各规范提供,链接见其元数据。 但请注意,通过测试套件中的所有测试并不意味着完全符合相关 规范, 这仅意味着该实现在测试套件所测试的方面符合要求。

文档大纲

引言包含一个术语章节。

2. SHACL 核心入门 通过一个示例非正式地介绍 SHACL 核心。

3. 形状和约束以及4. SHACL 属性路径介绍 SHACL 形状和约束,以及属性路径。

5. 节点表达式介绍节点 表达式,而6. 验证和 图定义 SHACL 中的验证。

7. 核心约束组件 定义内置的 SHACL 核心约束组件,而8. 非验证性形状特征讨论非验证性属性。

SHACL 的语法是 RDF。 本文档中的示例使用 Turtle [rdf12-turtle] 和 JSON-LD [json-ld]。 实际使用中也可以采用 RDF/XML 等其他 RDF 序列化格式。 读者应熟悉基本的 RDF 概念 [rdf12-concepts],例如三元组。

1. 引言

本文档规定了 SHACL(Shapes Constraint Language,形状约束语言)的核心,这是一种用于描述和 验证 RDF 图的语言。 本节通过关键术语概述和一个用于说明基本 概念的示例来介绍 SHACL。

1.1 术语

本文档通篇使用以下术语。

链接到 RDF 1.2 Concepts and Abstract Syntax 各部分的术语,在 SHACL 中按其中的定义使用。链接到 SPARQL 1.2 Query Language 各部分的术语,在 SHACL 中按其中的定义使用。一次 链接即足以为本文档中某一 特定术语的所有出现位置提供定义。

定义在本文档内是完备的,即,如果本文档中没有规则使 某种情况为真,则该情况为假。

基本 RDF 术语
本文档使用术语 RDF 图、 RDF 三元组、 IRI、 字面量、 数据类型、 基底方向、 空白节点、 三元组项、 具化器、 RDF 图的 节点、 RDF 项、 主语、 谓词,以及 RDF 三元组的 宾语, 其定义见 RDF 1.2 Concepts and Abstract Syntax [rdf12-concepts]。 语言标签按 [BCP47] 中的定义。
属性值和路径
一个 属性是一个 IRI。 在 RDF 图中,如果图中存在一个 RDF 三元组, 其主语为 n,谓词为 p,且宾语为 v,则一个 RDF 项 n 对属性 p 具有 值 v。 短语“图 G 中 P 的每个值……”表示“G 中谓词为 P 的三元组的每个宾语 ……” (在本文档中,动词 specify 或 declare 有时用于表达 某个 RDF 项在图中对给定谓词具有值这一事实。)
SPARQL 属性路径按 SPARQL 1.2 中的定义。 如果在对 RDF 图 G 执行 SPARQL 查询 SELECT ?s ?o WHERE { ?s p' ?o } 的结果中存在一个 解映射, 它将 ?s 绑定到 n 并将 ?o 绑定到 v,其中 p' 是 p 的 SPARQL 表层语法,则 RDF 项 n 在 RDF 图 G 中对 SPARQL 属性 路径表达式 p 具有值 v。
SHACL 列表
RDF 图 G 中的一个 SHACL 列表 是一个 IRI 或一个 空白节点, 它要么是 rdf:nil(前提是 rdf:nil 对 rdf:first 或 rdf:rest 均没有 值), 要么在 G 中对属性 rdf:first 恰好有一个 值, 并且在 G 中对属性 rdf:rest 恰好有一个 值, 该值在 G 中也为 SHACL 列表, 并且该列表在 G 中不将自身作为属性路径 rdf:rest+ 的值。
RDF 图 G 中除 rdf:nil 之外的任一 SHACL 列表的 成员由其在 G 中对 rdf:first 的值, 后接其在 G 中对 rdf:rest 的值在 G 中的 成员组成。 SHACL 列表 rdf:nil 在任何 RDF 图中都没有成员。
SHACL 子类,SHACL 超类
如果在一个 RDF 图中存在一个 三元组序列, 其中每个三元组的谓词都是 rdfs:subClassOf, 且第一个 三元组的 主语是 Sub, 最后一个三元组的 宾语是 Super,并且 除最后一个之外的每个 三元组的 宾语是下一个三元组的 主语, 则该 图中的 节点 Sub 是同一 图中另一个 节点 Super 的 SHACL 子类。 如果 Sub 是某个 SHACL 子类的 Super,且位于一个 RDF 图中,那么 Super 是 Sub 在该 图中的 SHACL 超类。
SHACL 类型
一个 RDF 项在 RDF 图中的 SHACL 类型是它在该 图中对 rdf:type 的 值的集合,以及这些 值在该 图中的 SHACL 超类。 请注意,一些 SHACL 实现可以被参数化,使得确定 SHACL 子类的 rdfs:subClassOf 三元组可以除了从 数据图中查询外,还可以从 形状图中查询。 参见 6.4 rdfs:subClassOf 三元组的图。
SHACL 类
节点在 RDF 图中如果是该 图中 节点的子类、超类或类型, 则称为 SHACL 类。
SHACL 类实例
如果 n 在 G 中的 SHACL 类型之一是 C, 则 节点 n 在 RDF 图 G 中是 SHACL 类 C 在 G 中的 SHACL 实例。
深复制
对于 节点 n(位于 图 sourceGraph 中), n 在 图 targetGraph 中的 深复制 是 targetGraph 中的 n,此外,如果 n 是一个 空白节点, 还包括 sourceGraph 中可通过传递遍历 从以 n 作为 主语开始可达的三元组的 宾语位置中出现的 空白节点而可达的任何 三元组。这类似于 简明有界描述,但不包含 具体化。

1.2 文档约定

在本文档中,使用以下命名空间前缀定义:

前缀 命名空间
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。

1.3 一致性

除标记为非规范性的章节外,本规范中的所有编写指南、图示、示例和注释 均为非规范性的。本规范中的其他所有内容均为规范性的。

本文档中的关键词 MAY、MUST、MUST NOT、SHOULD 和 SHOULD NOT 当且仅当它们像此处所示以全 大写形式出现时,应按 BCP 14 [RFC2119] [RFC8174] 中的说明解释。

本文档定义 SHACL Core 语言,也简称为 SHACL。 本规范描述以下对象的一致性标准:

本文档包含一些语法规则,形状和其他节点必须在形状图中满足这些规则 (对于 sh:shapesGraph 等少数属性,则必须在数据图中满足)。 这些规则通常采用以下形式:形状必须具有……或X 的值是 字面量或谓词为 P 的三元组的所有对象都必须是 IRI。 这些规则的完整列表可在附录中找到。 违反任何一条规则的节点称为非良构节点。 不违反任何规则的节点称为良构节点。

如果满足以下所有条件,则一个形状图是 格式良好的:

  1. 它不包含格式不良节点(即所有节点都满足上文提到的语法规则)。
  2. 它的导入闭包(由传递地跟随 owl:imports 语句确定) 满足 OWL 2 语法规范 [owl2-syntax] 第 3.4 节定义的约束, 即它不包含两个形状图,其中:
    • 它们是同一系列的不同版本 (即它们共享同一个形状图 IRI,但具有不同的 owl:versionIRI 值),或者
    • 其中一个包含一个 owl:incompatibleWith 注解,其值等于 另一个的形状图 IRI 或 owl:versionIRI。

一个不是格式良好的 形状图是 格式不良的。

1.4 SHACL 与 RDFS 推理 之间的关系

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 的所有值提供蕴涵, 并且在验证过程中,针对数据 图的所有查询都必须返回任何推断出的三元组。

2. SHACL Core 入门

本节是非规范性的。

在本节中,我们将通过一个简单示例,引入 SHACL Core 的基础。 你将学习如何描述你的数据应当是什么样子,以及 SHACL 处理器如何检查你的数据 是否满足该描述。

2.1 用例

假设你有一组实体(Alice、Bob、Calvin),并且你想向计算机或另一个 人说明:

  1. 存在一个名为 ex:Person 的类,它是这些实体的类型
  2. ex:Person 的每个实例至多有一个社会安全号码(SSN),并且该 SSN 需要是格式正确的文本(例如 123-45-6789)
  3. ex:Person 的每个实例可以为一个或多个公司工作,但这些公司 必须在你的数据中被类型化为 ex:Company
  4. 除 SSN (ex:ssn)、工作隶属关系(ex:worksFor)以及强制类型 (rdf:type)之外,ex:Person 不允许有其他属性

2.2 我们的示例数据(数据图)

以下是我们要描述和验证的数据:

2.3 编写 形状和类(形状图)

下面是一个自包含示例,展示如何表示我们关注的领域。 在 SHACL 术语中,这称为形状图,但你也可以把它看作 一个领域模型或一个本体。

2.4 运行 验证(验证报告)

当我们使用形状图对我们的数据图运行 SHACL 验证时, 验证器会根据我们编写的约束检查每个 Person。

用普通英语来说,它发现了以下内容:

下面是此示例的 SHACL 验证报告可能呈现的样子(为便于阅读而简化):

如何阅读该报告:

2.5 形状和类的 语法变体

虽然 SHACL 主要设计用于表示形状,但它也借用了 RDF Schema 命名空间中的 rdfs:Class 和 rdfs:subClassOf 等术语和概念。 有些人更喜欢将这些概念分开,如上面的原始示例所示, 其中 ex:Person 和 ex:PersonShape 是分离的实体。 不过,也可以将它们更紧密地耦合在一起,并使用 sh:ShapeClass 同时声明一个类和一个形状。

此外,有时你会看到属性形状被声明为空白节点,而不是 IRI。 这是一种更紧凑的记法,但它意味着该属性形状不容易从 外部引用;例如,如果某个其他图想复用一个节点形状但停用一个属性 形状。

以下 Turtle 示例展示了这两种语法变体的实际用法。

2.6 介绍一些 SHACL 术语

我们可以使用上面的形状声明来介绍 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 的属性值都将根据这三个组件进行 验证。

3. 形状和约束

以下引言是非规范性的。

以下非正式图示概述了 SHACL 词汇中的一些关键类。 每个框表示一个类。 类名下方的框列出了这些类的实例可能具有的一小部分常用属性, 以及它们的值类型。 箭头表示 rdfs:subClassOf 三元组。

sh:targetClass : rdfs:Class
sh:targetNode : 任意
sh:targetObjectsOf : rdf:Property
sh:targetSubjectsOf : rdf:Property
sh:name : xsd:string or rdf:dirLangString or rdf:langString
sh:deactivated : xsd:boolean
sh:message : text
sh:severity : sh:Severity
类图箭头
约束参数,例如:
sh:closed : xsd:boolean 或 sh:ByTypes
sh:or, sh:and, sh:xone : rdf:List
sh:not : sh:Shape
sh:property : sh:PropertyShape
约束参数,例如:
sh:minCount, sh:maxCount : xsd:integer
sh:minLength, sh:maxLength : xsd:integer
sh:class, sh:datatype : rdfs:Resource 或 rdfs:Resources 的 rdf:List
sh:node : sh:NodeShape
sh:values : any
sh:group : sh:PropertyGroup
sh:path : rdfs:Resource

SHACL 词汇的 Turtle 序列化包含完整的 SHACL 词汇。

3.1 形状

一个形状是一个IRI或空白节点 s, 它在形状图中至少满足以下一个条件:

注意,上面的定义并未包含格式良好形状的所有语法规则。 这些规则分布在整个文档中,并在附录 A. SHACL 语法规则摘要中汇总。 例如,具有字面量作为 sh:targetClass 值的形状是格式不良的。

非正式地说,形状根据焦点节点的属性 值和其他特征, 决定如何验证该焦点节点。 例如,形状可以声明某个焦点节点必须是 IRI,或者声明某个焦点节点对某个属性具有特定值, 并且该属性还具有最小数量的值。

SHACL Core 语言定义了两种类型的形状:

sh:Shape 是 SHACL 词汇中这两种形状类型的 SHACL 超类。 其子类 sh:NodeShape 和 sh:PropertyShape 可以分别用作节点形状和属性形状的 SHACL 类型。

3.1.1 约束、参数和约束组件

形状可以使用约束组件的参数声明约束。

一个 约束 组件是一个 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 核心中包含的约束组件列表在7. 核心约束组件中进行了描述。 SHACL-SPARQL 可用于声明其他基于 SPARQL 的约束组件。

3.1.2 焦点节点

使用来自数据图的三元组针对某个形状进行验证的 RDF 项称为焦点节点。

本节其余部分是非规范性的。

某个形状的焦点节点集合可以按如下方式确定:

3.1.3 目标

目标声明是形状在形状图中的 三元组,这些三元组以该形状为主语,并以本文档中描述的某些属性 (例如 sh:targetClass)为谓词。 此外,sh:shape 三元组可以在数据图中声明目标。 目标声明可用于为形状生成焦点节点。 目标声明的目标是通过 将本节其余部分描述的规则应用于数据图而生成的 RDF 术语集合。 形状的目标是为该形状声明的各个 目标 所生成的所有 RDF 术语的并集,这些目标是为该 形状声明的。

SHACL 核心包含以下类型的目标:

本引言的其余部分为非规范性内容。

目标生成的 RDF 术语不要求作为节点存在于数据图中。 每当直接将焦点节点作为某个形状的验证过程的输入时,都会忽略该形状的目标。 这包括以下情况:形状是某个 要求形状的约束参数(例如 sh:node)的值,并且 在验证相应的约束组件(例如 sh:NodeConstraintComponent)期间确定了焦点节点。 在这种情况下,所提供的焦点节点不需要属于该形状的 目标。

3.1.3.1 节点目标 (sh:targetNode)

节点 目标使用 sh:targetNode 谓词指定。 形状中 sh:targetNode 的每个值都是一个格式良好的节点表达式。

文本定义
如果 s 是形状图 SG 中的一个形状,并且 s 在 SG 中对 sh:targetNode 具有 值 expr, 则 evalExpr(expr, data graph, s, {}) 的输出节点 是以数据图 DG 作为焦点图时的目标。

本节其余部分是非规范性的。

对于下面的示例数据,只有 ex:Alice 是所提供形状的目标:

3.1.3.2 基于类的目标(sh:targetClass)

类 目标使用 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.4 rdfs:subClassOf 三元组的图),在这种情况下,上例中的 rdfs:subClassOf 三元组 不需要位于数据图中。

3.1.3.3 隐式类目标和 sh:ShapeClass

非正式地说,如果一个形状也在形状图中声明为一个类,那么 该类的所有 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 的实例, 其解释相同。

3.1.3.4 Subjects-of 目标(sh:targetSubjectsOf)

subjects-of 目标使用谓词 sh:targetSubjectsOf 指定。 形状中 sh:targetSubjectsOf 的值是 IRI。

文本定义
如果 s 是形状图 SG 中的一个形状,并且 s 在 SG 中对于 sh:targetSubjectsOf 具有 值 p,那么数据图 DG 中作为 DG 内具有 谓词 p 的三元组的 主语的节点集合,是 SG 中 s 来自 DG 的一个 目标。

本节其余部分是非规范性的。

在上面的示例中,只有 ex:Alice 会根据给定形状进行验证, 因为它是一个以 ex:knows 作为谓词的 三元组的主语。

3.1.3.5 Objects-of 目标(sh:targetObjectsOf)

objects-of 目标使用谓词 sh:targetObjectsOf 指定。 形状中 sh:targetObjectsOf 的 值是 IRI。

文本定义
如果 s 是形状图 SG 中的一个形状,并且 s 在 SG 中对于 sh:targetObjectsOf 具有 值 p,那么数据图 DG 中作为 宾语的节点集合,这些节点来自 DG 中具有 谓词 p 的三元组,是 SG 中 s 来自 DG 的一个 目标。

本节其余部分是非规范性的。

在上面的示例中,只有 ex:Bob 会根据给定形状进行验证, 因为它是一个以 ex:knows 作为谓词的 三元组的宾语。

3.1.3.6 Where 目标 (sh:targetWhere)

where 目标使用 sh:targetWhere 谓词指定。 形状中 sh:targetWhere 的每个值都是一个格式良好的形状。

文本定义
如果 s 是形状图 SG 中的一个形状,并且 s 在 SG 中对 sh:targetWhere 具有值 w,则数据图 DG 中符合 w 的节点集合,是从 DG 为 SG 中的 s 得到的一个目标。

本节其余部分是非规范性的。

在此示例中,只有 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 目标计算的性能可能因实现而异。 在最坏情况下,引擎需要遍历数据图中的所有节点,并逐个过滤它们。

3.1.3.7 显式 形状目标(sh:shape)

显式形状目标使用 sh:shape 谓词指定。 sh:shape 的每个值都是一个IRI。

文本定义
如果 s 是形状图中的一个形状,且 n 是数据图中的一个节点。 如果在数据图中,n 的 sh:shape 值为 s, 那么 n 就是 s 的一个目标。

本节其余部分为非规范性内容。

注

sh:shape 与 sh:targetNode 不同,尽管两者都可以 用于 将单个节点与形状关联起来。 sh:shape 从特定的主语节点指向一个作为对象的形状。 此外,虽然 sh:targetNode 三元组是从形状图中查询的, 但 sh:shape 三元组应存在于数据图中。

对于以下示例数据,只有 ex:Alice 是所提供形状的目标:

3.1.4 声明形状或约束的严重性

在 形状图中,形状的 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。 以下示例说明了这一点。

以下示例是上面形状图的一个变体,但使用具化来 指定单个约束的严重性:

3.1.5 为形状或约束声明消息

形状可以具有 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 的章节。

前一节中的示例使用此机制为第二个验证结果提供 两条消息。 以下示例是一个使用具化声明消息的变体。

3.1.6 停用 形状和约束

形状最多只能有 一个 sh:deactivated 属性的值。 sh:deactivated 的值是一个节点表达式, 其唯一的输出节点必须是 true 或 false。

设 expr 为一个形状中 sh:deactivated 的值。 如果 evalExpr(expr, 数据图, 焦点节点, {}) 生成 true 作为其唯一的 输出节点,则该形状称为已停用的形状。 在验证期间会忽略已停用的形状。

除了停用一个形状的所有约束之外,还可以停用 单个约束。 这是通过具体化实现的。

一个以三元组,其形状作为主语, 某个参数(例如 sh:minCount)作为谓词,最多只能有一个 具体化节点,其值属于 属性 sh:deactivated。

设 expr 为一个具体化节点中 sh:deactivated 的值,该节点具体化了一个以形状为 主语、以参数为谓词的三元组。 如果 evalExpr(expr, 数据图, 焦点节点, {}) 生成 true 作为其唯一的 输出节点,则使用该三元组的约束称为已停用的约束。 在验证期间会忽略已停用的约束。

本节其余部分为非规范性内容。

在 SHACL 核心中,sh:deactivated 的唯一有效值是 常量字面量节点表达式 true 和 false。

此特性的用例包括形状复用和调试。 在将其他图或文件中的形状导入给定形状图的情况下, 可以在本地形状图中将导入 形状的 sh:deactivated 设置为 true, 以排除不适用于当前应用上下文的形状。 这样,即使不同意原作者作出的某些 假设,也可以复用他人开发的 SHACL 图。 如果形状作者预期其他人可能需要停用或修改某个形状,那么 最好使用IRI 而不是空白节点 来标识实际形状。例如,形状 ex:PersonShape 中属性 ex:name 的属性形状可以具有 IRI ex:PersonShape-name。 sh:deactivated 的另一个典型用例是在形状的开发和测试期间 (临时)停用某些形状。

以下示例演示如何使用 sh:deactivated 停用一个形状。 如果形状是从其他图导入的,则 sh:deactivated true 三元组 将位于执行导入的图中。

以下变体使用具化只停用 sh:minCount 约束,而不影响同一属性形状上的其他约束。

3.2 节点形状

节点形状是形状图中的一个 形状, 它不是一个以 sh:path 作为谓词的三元组的主语。 建议(但不要求)将一个节点形状声明为 sh:NodeShape 的 SHACL 实例。 sh:NodeShape 的SHACL 实例不能对属性 sh:path 具有 值。

非正式地说,节点形状指定需要相对于焦点 节点满足的约束。 与属性形状不同,它们主要应用于焦点节点本身, 而不是其属性值。

3.3 属性形状

属性形状是形状图中的一个 形状, 它是一个以 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 具有值。

通俗地说,属性形状指定了必须针对以下节点满足的约束:这些节点可以从 焦点 节点出发,沿着使用 sh:path 指定的属性或其他SHACL 属性路径到达, sh:path, 此外还包括通过对使用 sh:values 指定的节点表达式求值而生成的节点。 如果不存在这样的节点,则改为对使用 sh:defaultValue 指定的节点表达式 求值。 准确定义参见6.9.2 属性形状的值 节点。

请注意,SHACL 核心仅定义常量节点表达式(IRI 和字面量), 因此在 SHACL 核心中,sh:values 和 sh:defaultValue 只能生成常量 值。 诸如 [shacl12-node-expr] 和 [shacl12-sparql] 等扩展还定义了其他类型的 节点表达式。

请注意,格式良好属性形状和节点 形状的定义使这两组节点互不相交。

以下示例说明属性形状的一些语法变体。

4. SHACL 属性路径

属性路径可用于 sh:path,以派生属性形状的值 节点。

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 属性路径时,它们被视为等价路径。 复杂路径是指不是 IRI 的 SHACL 属性路径,即除 谓词路径之外的任何 SHACL 属性路径。

RDF 图中的一个节点是一个格式良好的 SHACL 属性 路径 p,当且仅当它恰好满足以下 小节中的一个语法规则。 如果节点 p 是 空白节点,且 p 的任何路径映射直接或传递地引用 p,则节点 p 不是 格式良好的 SHACL 属性路径。

以下示例说明了一些有效的 SHACL 属性路径,以及它们的 SPARQL 1.2 等价形式。

4.1 谓词路径

谓词路径是一个IRI。

如果 p 是一个谓词路径,则 path(p,G) 是一个 SPARQL PredicatePath,其中 p 作为 iri。

4.2 序列路径

序列 路径是一个空白节点,它是一个SHACL 列表, 具有至少两个成员,且每个成员都是格式良好的 SHACL 属性路径。

如果 p 是 G 中一个序列路径,其列表成员 为 v1、v2、...、vn, 则 path(p,G) 是一个 SPARQL SequencePath,其中 path(v1,G) 作为 elt1,并且列表节点 v2 的路径映射 结果作为 elt2。

非正式说明:这类 SHACL 列表中的节点,不应对 rdf:first 和 rdf:rest 之外的其他属性具有值。

4.3 替代路径

替代 路径是一个空白节点,它是 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)。

4.4 反向路径

反向路径 是一个空白节点,它是 G 中恰好一个 三元组的主语。 该三元组以 sh:inversePath 作为谓词,并且宾语 v 是格式良好的 SHACL 属性路径。

如果 p 是 G 中的反向路径,则 path(p,G) 是一个 SPARQL InversePath,其中 path(v,G) 作为其 elt。

4.5 零个或多个路径

零个或多个 路径是一个空白节点,它是 G 中恰好一个 三元组的主语。 该三元组以 sh:zeroOrMorePath 作为谓词,并且宾语 v 是格式良好的 SHACL 属性路径。

如果 p 是 G 中的零个或多个路径,则 path(p,G) 是一个 SPARQL ZeroOrMorePath,其中 path(v,G) 作为其 elt。

4.6 一个或多个路径

一个或多个 路径是一个空白节点,它是 G 中恰好一个 三元组的主语。 该三元组以 sh:oneOrMorePath 作为谓词,并且宾语 v 是格式良好的 SHACL 属性路径。

如果 p 是 G 中的一个或多个路径,则 path(p,G) 是一个 SPARQL OneOrMorePath,其中 path(v,G) 作为其 elt。

4.7 零个或一个路径

零个或一个 路径是一个空白节点,它是 G 中恰好一个 三元组的主语。 该三元组以 sh:zeroOrOnePath 作为谓词,并且宾语 v 是格式良好的 SHACL 属性路径。

如果 p 是 G 中的零个或一个路径,则 path(p,G) 是一个 SPARQL ZeroOrOnePath,其中 path(v,G) 作为其 elt。

5. 节点表达式

本节介绍节点表达式的概念。 SHACL 核心在以下特性中支持节点表达式:

仅对 SHACL 核心感兴趣的读者通常可以跳过本节。 鉴于 SHACL 核心仅支持常量 IRI 和字面量作为节点表达式,因此节点 表达式的用例 与 SHACL 核心的传统用法相同。

文本定义
节点表达式是一个节点,它 恰好符合一个节点 表达式函数的语法规则。 每个节点表达式函数都有一个IRI 作为其函数名。
节点表达式的求值
节点表达式的求值被定义为一个函数 ,其形式为 evalExpr(expr, focusGraph, focusNode, scope) -> outputNodes 其中 节点表达式的求值结果是一个由节点组成的列表 (可能为空,也可能包含重复项),称为输出节点。 求值也可能导致求值失败。

SHACL 核心规范仅定义了以下两个小节中的 节点表达式函数。 [shacl12-node-expr] 提供了有关 节点表达式总体设计的更多背景信息,并包含一个全面的 节点表达式函数库。 其他规范,例如 [shacl12-sparql],引入了使用 空白节点的其他函数。 因此,节点表达式充当 SHACL 的扩展点。

5.1 IRI 表达式

如果一个节点表达式是一个IRI,则 称其为IRI 表达式,其函数名为 sh:IRIExpression。

RDF 图中的一个节点是一个良构的IRI 表达式,当且仅当 它是一个IRI。

IRI 表达式的求值

一个IRI 表达式的输出节点 是一个仅包含该节点表达式自身的列表:

evalExpr(expr, focusGraph, focusNode, scope) -> [expr]

5.2 字面量表达式

一个节点表达式如果是一个字面量,则称为字面量表达式,其函数名为 sh:LiteralExpression。

一个位于 RDF 图中的节点是一个良构的字面量 表达式,如果它是一个字面量。

字面量表达式的求值

一个字面量表达式的输出 节点是一个仅包含该节点表达式 自身的列表:

evalExpr(expr, focusGraph, focusNode, scope) -> [expr]

6. 验证和图

验证 接受一个 数据图 和一个 形状图 作为输入,并 生成 一份 验证报告,其中包含验证结果。 符合性检查 是验证的简化版本, 生成一个布尔结果。 能够执行验证的系统称为 处理器, 而动词 处理 有时用于指代验证过程。

SHACL 定义了一个 RDF 验证报告词汇表,可供 将验证报告生成为 RDF 结果图的处理器使用。 本规范使用 SHACL 结果词汇表对 验证器 进行规范性定义, 这些验证器关联于 约束组件。 只有能够生成 验证报告词汇表 中所有必需属性的 SHACL 实现才 符合标准。

6.1 形状图

一个 形状图 是一个 RDF 图,其作用是提供 形状 及相关信息 给 SHACL 验证 过程,以便 数据图 可以 根据这些形状进行验证。

sh:ShapesGraph 类 可以 用作 rdf:type, 用于通常充当形状图的图的 IRI,该图的角色为 形状图。 图类型类(例如 sh:DataGraph 和 sh:ShapesGraph) 表示彼此不互斥的角色;单个图 可以 被指定为 这些类中的多个类的实例。

用于给定验证的 形状图,在该 验证 中,可能是 合并多个形状图的结果, 例如通过 owl:imports 或 sh:shapesGraph。 无论如何构建,用于验证的 形状图 都 必须 在整个 验证 过程中保持不变。 请参阅 6.6 验证 以了解 更多详细信息。

本节的其余部分为非规范性内容。

形状图可以是可重用的验证模块,可通过谓词 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 被声明为以下 IRI 的 owl:versionIRI: <http://example.com/shapes/company>。 然后,处理器使用 <http://example.com/shapes/company> 标识该图, 以继续跟随后续的 owl:imports 语句,在此例中导入 <http://example.com/shapes/base>。

生成的图构成不可变的 形状图,用于验证。

注

使用 owl:versionIRI 导入带版本的形状图时,应注意 避免导入不兼容的版本。特别是,形状图的导入闭包 不应 包含两个图,它们是同一 系列的不同版本,或者其中一个 声明与另一个 owl:incompatibleWith。这样的形状图被视为 格式不正确。请参阅 格式良好 的形状 图的定义以了解详情。

除了形状声明之外,形状图还可以包含供 SHACL 处理器使用的附加信息,例如 sh:entailment 语句。

6.2 数据图

任何 RDF 图都可以是 数据图。

sh:DataGraph 类 可以 用作 rdf:type,用于 一个图的 IRI, 该图通常用作 数据图。 图类型类(例如 sh:DataGraph 和 sh:ShapesGraph) 表示彼此不互斥的角色;单个图 可以 被指定为 这些类中的多个类的实例。 例如,一个 形状图 可以 同时充当 一个 数据 图 当需要验证形状本身时。

本节的其余部分为非规范性内容。

数据图是 SHACL 处理器进行 验证 的输入之一。 SHACL 处理器将其视为一般的 RDF 图,不对其性质作任何假设。 例如,它可以是内存中的图,也可以是来自 RDF 数据集或 SPARQL 端点的命名图。

SHACL 可以用于通过任何方式获取的 RDF 图,例如来自文件系统、HTTP 请求或 RDF 数据集。 SHACL 不对图是否包含根据该图在 任何 RDF 蕴涵机制下推导出的三元组作任何假设。

数据图预期包含与数据有关的所有本体公理,尤其是所有 rdfs:subClassOf 三元组,以便 SHACL 正确识别类目标并验证 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 本体语言映射 到 RDF 图,第 3.1.1 节 以了解详情。因此,使用以下形式的语句时, X a sh:DataGraph .,X a owl:Ontology . 也应包含在内。

6.3 结果图

一个 结果 图 是一个 RDF 图,它是一次 验证 的输出。

一个 结果图 必须 包含一份 验证报告,并且 可以 包含 其他元素,它们定义于 SHACL 1.2 概要描述的词汇表。

注

SHACL 1.2 概要描述词汇表中的所有元素 都包含在 SHACL 命名空间内,因此除了 SHACL 1.2 核心已经要求的 RDF 资源之外,其元素不需要额外的 RDF 资源。

6.4 用于 rdfs:subClassOf 三元组的图

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 处理器 应 提供参数 subClassOfInShapesGraph, 如果将其设置为 true, 则应改变 SHACL 类型 的定义,使得 rdfs:subClassOf 三元组会被 查询, 查询范围包括 形状图 以及 数据图。 rdf:type 三元组始终预期位于 数据图 中。

6.5 链接 数据图到形状图 (sh:shapesGraph)

一个 数据 图 可以包含用于向 SHACL 处理器建议一个或多个图的三元组,使用 谓词 sh:shapesGraph。 每个 值, 对于 sh:shapesGraph 而言,都是一个 IRI,表示一个图,该图 应 被包含在 形状图 中,用于验证 数据 图。 sh:shapesGraph 的值可以是 owl:versionIRI 的值, 因此,从版本 IRI 解析形状图 IRI 的相同策略,即 形状图 中描述的策略,也适用于此。

在以下示例中,SHACL 处理器 应 使用 ex:graph-shapes1 和 ex:graph-shapes2 图(以及它们的 owl:imports)的并集,作为 形状图 来验证给定的图。

6.6 验证

验证 是从某些 输入 到 验证结果 的映射,如以下段落所定义。

根据形状图验证数据图: 给定一个 数据图 和一个 形状图, 所得 验证结果 是以下 验证 的结果并集:对 数据图,根据所有 形状 进行验证,这些形状位于 该 形状图 中。

根据形状验证数据图: 给定一个 数据图 和一个 形状,该形状位于 形状图 中, 所得 验证结果 是以下 验证 的结果并集:验证所有 焦点 节点,这些节点位于 目标 中,该目标属于 形状,且位于 数据图 中。

根据形状验证焦点节点: 给定一个 焦点节点,它位于 数据图 中,以及一个 形状,它位于 形状图 中, 所得 验证结果 是以下 验证 的结果并集:对 焦点节点,根据所有 约束 进行验证,这些约束由 形状 声明,除非该 形状 已 被 停用, 在这种情况下,验证结果 为空。

根据约束验证焦点节点: 给定一个 焦点节点,它位于 数据图 中,以及一个 约束,其 种类 为 C,且位于 形状图 中, 所得 验证结果 由 验证器 定义,这些验证器属于 约束 组件 C。 这些 验证器 通常接受以下输入:焦点节点、具体的 值,它们属于 参数,这些参数属于 C, 对应于 约束,该约束位于 形状图 中,以及 值 节点,它们属于 形状,即声明该约束的形状。

在验证期间,数据图 和 形状图 必须 保持不可变,即验证结束时的两个图都 必须 与验证开始时的图完全相同。 SHACL 处理器 不得 更改它们用于构建 形状图或数据图的图, 即使这些图属于允许更改其所存储图的 RDF 存储。 SHACL 处理器 可以 存储它们创建的图,例如 包含验证结果的图, 并且此操作 可以 更改 RDF 存储中的现有图,但不得更改任何 用于构建形状图或数据图的图。 因此,SHACL 处理是幂等的。

6.6.1 失败

验证 和 符合性 检查 可能导致 失败。 例如,某个 SHACL 处理器可能允许递归形状,但会报告失败, 如果它检测到数据中存在循环。 资源耗尽也可能导致失败报告。 失败通过特定于实现的渠道发出信号。

6.6.2 处理 格式不正确的形状图

如果 形状图 包含 格式不正确 的节点, 则验证过程的结果是 未定义的。 SHACL 处理器 应 产生 失败,在这种情况下。 另请参阅 6.8.1.4 语法 检查:形状图 (sh:shapesGraphWellFormed)。

6.6.3 处理递归 形状

以下属性是所谓的 以形状为预期值的约束 参数,属于 SHACL 核心:

以下属性是所谓的 接受列表的约束参数,属于 SHACL 核心:

此外,sh:class、sh:datatype、sh:nodeKind、 sh:rootClass 和 sh:uniqueValuesFor 是接受列表的约束参数,当它们的 值 为一个 SHACL 列表 时。

RDF 图 G 中的形状 s1 引用 形状 s2, 后者位于 G 中,如果前者以 s2 作为 值,对应于某个不接受列表的、 以形状为预期值的约束组件参数,或者以 s2 作为 成员,属于 某个 值,该值对应于某个接受列表且以形状为预期值的 约束组件参数, 或者以 s2 作为 值,对应于 sh:targetWhere。 RDF 图 G 中的形状是 递归 形状(在 G 中),如果它与 自身通过 引用 关系在 G 中的传递闭包相关联。

使用 验证 来处理 递归 形状的行为 未在 SHACL 中定义,而是留给 SHACL 处理器实现决定。 例如,SHACL 处理器可以支持递归场景,或者在检测到 递归时产生失败。

本节的其余部分为非规范性内容。

选择上述递归策略是为了支持多种实现 策略。 通过不定义递归,实现可以选择不支持递归,从而 能够发出一组静态的 SPARQL 查询(针对 SPARQL 端点),而不必支持 循环。 工作组认识到,其他实现可能支持递归,并且某些形状 图可能 依赖这些特定特性。 预期未来的工作,例如 W3C 社区组中的工作,将促成定义 特定的 SHACL 方言,其中递归得到明确的定义。

6.7 符合性检查

一个 焦点节点 符合 一个 形状,当 且仅当 以下 验证 的结果集合,即对 焦点节点 根据 形状 进行验证的结果,不包含任何 验证结果,其严重程度位于 禁止级别集合中,并且没有 失败 被该验证报告。

禁止的严重程度集合由 验证 过程决定,符合性 检查是该过程的一部分, 请参阅 6.8.1.2 符合性禁止集合 (sh:conformanceDisallows)。 同一集合适用于验证本身以及在验证期间执行的所有符合性检查, 包括嵌套的检查。

注

默认情况下,禁止的严重程度集合包括 sh:Warning 和 sh:Info。 例如,一个 值节点 不符合以下属性的形状: sh:node,如果根据该形状进行验证 生成了严重程度为 sh:Warning 的验证结果。

符合性检查 生成 true,当且仅当给定的 焦点节点 符合 一个给定的 形状,否则生成 false。

请注意,所有 以形状为预期值的约束参数, 属于 SHACL 核心的这些参数, 都依赖符合性检查。 在这些情况下,验证结果,即用于确定 符合性检查结果的那些结果, 与外层验证过程的结果分开,通常不会出现在同一份 验证报告中 (可能作为 sh:detail 的值出现的情况除外)。

6.7.1 符合形状图 (sh:conformsToShapesGraph)

一个 数据图 可以 使用属性 sh:conformsToShapesGraph 表明它 符合 一个给定的 形状图。 该值是一个 IRI,用于标识 形状图。 此属性具有 rdfs:domain sh:DataGraph 和 rdfs:range sh:ShapesGraph。

注

请参阅 符合形状图 一节,该节位于 SHACL 1.2 概要描述中,其中提供了有关此属性用法的更多详细信息。

6.8 验证报告

验证报告 是 验证 过程的结果,报告 符合性 以及 所有 验证结果 的集合。 验证报告使用 SHACL 验证报告词汇表 描述,如 本节所定义。 此词汇表定义了用于表示结构信息的 RDF 属性,这些信息可以提供指导, 帮助识别或修复数据图中的违规情况。

符合 SHACL 的处理器 必须 能够返回一个 结果图,其中包含一份验证报告,具有所有必需的 验证结果, 如本规范所述。 符合 SHACL 的处理器 可以 支持可选参数,以便 限制返回结果的数量。 例如,在某些大规模数据集验证用例中,需要这种灵活性。

以下图展示了一份验证报告示例,用于验证一个 符合形状图的数据图。

以下图展示了一份验证报告示例,用于验证一个 不符合形状图的数据图。 请注意,sh:resultMessage 的具体值并非由 SHACL 强制规定,而被视为 特定于实现。

符合 SHACL 的处理器 可以 能够返回一个 结果图,其中包含一份 验证报告, 链接到附加项目,这些项目描述于 SHACL 1.2 概要描述的词汇表。

6.8.1 验证 报告 (sh:ValidationReport)

一个 验证 过程的结果是一个 RDF 图,恰好包含一个 SHACL 实例,其类型为 sh:ValidationReport。

注

请参阅 验证报告 一节,该节位于 SHACL 1.2 概要描述中,提供了有关扩展验证结果的更多详细信息,这些结果包含一个 sh:ValidationReport 实例,以及验证输入的详细信息和验证系统 的详细信息。

6.8.1.1 符合 (sh:conforms)

结果图中的每个 sh:ValidationReport SHACL 实例都恰好有一个 属性 sh:conforms 的值,该值的数据类型为 xsd:boolean。 它表示 符合性检查 的结果。

6.8.1.2 符合性禁止集合 (sh:conformanceDisallows)

每个 验证 过程都使用一组禁止的严重程度 级别,即符合性禁止集合。 默认集合由 sh:Violation、sh:Warning 和 sh:Info 组成。 验证引擎 可以 提供自定义此集合的机制。

结果图中的每个 sh:ValidationReport SHACL 实例 可以 具有一个或多个值, 对应于属性 sh:conformanceDisallows。所有 sh:conformanceDisallows 的值 必须 是 IRI。 如果验证过程使用了默认集合以外的集合,那么 sh:conformanceDisallows 的值 必须 恰好是该集合的成员。 如果 sh:conformanceDisallows 没有值,则说明默认集合已被 使用。

只要存在任何 sh:ValidationResult,其严重程度位于 禁止的严重程度集合中,就 必须 导致 sh:conforms 的值 为 false,对应于关联的 sh:ValidationReport 实例。

6.8.1.3 结果 (sh:result)

对于每个由 验证 过程生成的验证结果 (在 符合性 检查 上下文中提到的结果除外), 结果图中的 sh:ValidationReport SHACL 实例都有一个值, 对应于属性 sh:result。 sh:result 的每个值都是一个 SHACL 实例,属于类 sh:ValidationResult。

6.8.1.4 形状图的语法检查 (sh:shapesGraphWellFormed)

并不严格要求 SHACL 验证引擎检查 形状图 是否 格式良好。 确实执行此类检查的实现(例如,在形状图安装到 系统中时, 或在验证之前或期间)应 使用属性 sh:shapesGraphWellFormed 来告知 验证报告使用者这一事实。 如果结果图中的某个 sh:ValidationReport SHACL 实例以 true 作为 值, 对应于 sh:shapesGraphWellFormed,则 处理器 已确定 形状图,即用于 验证 过程的图,是 格式良好的。

6.8.1.5 使用的数据 图 (sh:usedDataGraph)

结果图中的某个 sh:ValidationReport SHACL 实例 可以 具有属性 sh:usedDataGraph 的值。 该值是一个 IRI,用于标识 数据图,该图 已由 处理器 验证以生成报告。 数据图的版本 IRI 也 可以 用作此 属性的值。

6.8.1.6 使用的 形状图 (sh:usedShapesGraph)

结果图中的某个 sh:ValidationReport SHACL 实例 可以 具有属性 sh:usedShapesGraph 的值。 该值是一个 IRI,用于标识 形状图, 该图由 处理器 在 验证 过程中使用。 形状图的版本 IRI 也 可以 用作此 属性的值。

6.8.1.7 使用的 配置 (sh:usedConfiguration)

结果图中的某个 sh:ValidationReport SHACL 实例 可以 具有属性 sh:usedConfiguration 的值。 该值是 sh:ProcessorConfiguration 的实例,描述了状态和 设置,它们属于 处理器,即生成该报告的处理器。 SHACL 处理器 不得 根据 sh:ProcessorConfiguration 实例的内容改变其验证行为。

6.8.1.8 处理器配置 (sh:ProcessorConfiguration)

sh:ProcessorConfiguration 是处理器配置的类。 此类的实例描述 SHACL 处理器 的状态和设置,对应于 它生成验证报告的时刻。 sh:ProcessorConfiguration 实例的属性不由本 规范定义。

注

实现可以自由地在此类的实例上定义它们需要的任何属性, 例如处理器名称、处理器版本、 最大递归深度或其他运行时参数。

6.8.2 验证 结果 (sh:ValidationResult)

SHACL 将 sh:ValidationResult 定义为 sh:AbstractResult 的子类,以 报告单个 SHACL 验证结果。 SHACL 实现可以使用其他 SHACL 子类,它们属于 sh:AbstractResult,例如, 用于报告成功完成的约束检查或累积的结果。

本节其余小节中描述的所有属性都可以指定在 sh:ValidationResult 中。 属性 sh:focusNode、sh:resultSeverity 和 sh:sourceConstraintComponent 是所有验证结果唯一必需的属性。

6.8.2.1 焦点节点 (sh:focusNode)

每个验证结果的属性 sh:focusNode 都恰好有一个值, 该值等于 焦点节点,即导致该结果的节点。 这是 焦点节点,即在验证结果 生成时被验证的节点。

6.8.2.2 路径 (sh:resultPath)

验证结果可以具有属性 sh:resultPath 的值,指向一个 格式良好 的 SHACL 属性路径。 对于由 属性形状 生成的结果,此 SHACL 属性路径 等价于 值,即该形状的 sh:path 的值, 除非另有说明。 如果 sh:path p 是一个 空白节点,则 sh:resultPath 是 一个 深拷贝,即 p 在结果图中的深拷贝。

6.8.2.3 值 (sh:value)

验证结果可以包含,作为一个 值,对应于属性 sh:value, 至多一个导致该结果的 RDF 项。 SHACL 核心组件的验证器的文字定义指定了这个 值的构造方式 - 它们通常是 值节点,这些节点违反了某个 约束。

6.8.2.4 来源 (sh:sourceShape)

验证结果可以包含,作为唯一的 值,对应于属性 sh:sourceShape, 一个 形状,给定的 sh:focusNode 已根据该形状 进行验证。

6.8.2.5 约束组件 (sh:sourceConstraintComponent)

验证结果恰好有一个值,对应于属性 sh:sourceConstraintComponent, 并且该值是一个 IRI, 属于 约束组件,即导致该结果的组件。 例如,由于违反基于以下属性值的约束而生成的结果, sh:minCount, 将具有来源约束组件 sh:MinCountConstraintComponent。

6.8.2.6 详细信息 (sh:detail)

属性 sh:detail 可以将一个(父)结果链接到一个或多个 SHACL 实例, 它们属于 sh:AbstractResult,并可提供有关(父)结果成因的进一步 详细信息。 根据 SHACL 处理器的能力,这可以包括例如违反 约束的情况,这些约束通过 sh:node 作为符合性检查的一部分进行求值。

6.8.2.7 消息 (sh:resultMessage)

验证结果可以具有属性 sh:resultMessage 的值, 例如用于向人们传达附加的文字详细信息。 尽管 sh:resultMessage 可以具有多个值,但不应存在两个值 具有相同的语言标签。 这些值由验证引擎根据 sh:message 的值生成,这些值属于约束, 这些约束 位于形状图中,请参阅 为形状声明消息。 使用具体化声明的消息优先于在外层 形状上声明的消息。 如果某个约束在形状图中没有任何 sh:message 的值, 在这种情况下, SHACL 处理器 可以 自动生成其他值,用于 sh:resultMessage。

6.8.2.8 严重程度 (sh:resultSeverity)

每个验证结果恰好有一个 值,对应于属性 sh:resultSeverity,并且该值是一个 IRI。 该值由以下规则(按顺序)确定:

  1. 该 值,对应于 sh:severity, 位于某个 具体化者 上,该具体化者具体化任一 三元组,该三元组包含 参数,这些参数属于 约束, 即导致该结果的约束
  2. 该 值,对应于 sh:severity, 属于 形状,该形状位于 形状 图 中,并导致了该结果
  3. 默认为 sh:Violation,如果没有指定 sh:severity, 对于该形状或约束而言。

6.8.3 不完整数据

一个 数据图 可能有意只包含部分 信息,这些信息涉及它的某些 节点, 例如,当它链接到关注领域之外的“外部”资源时, 或者链接到一些节点,这些节点的其余 三元组 尚未录入,但预期 稍后录入。 SHACL 定义了两个属性,可在 数据图 中使用,以将此类节点声明为 不完整:

  • sh:incomplete 声明 主语 是不完整的 (true) 还是完整的 (false)。 这些 值,即 sh:incomplete 的值,是 字面量,其数据类型为 xsd:boolean。
  • 值为 true 的 sh:incompleteURIStart 声明所有具有以下 IRI 的节点,即以主语的 IRI 开头的节点,都是不完整的(主语本身除外),除非通过以下方式另有声明: sh:incomplete false。 这些 值,对应于 sh:incompleteURIStart,是 字面量,其数据类型为 xsd:boolean。 这些 主语,属于 三元组,其谓词为 sh:incompleteURIStart,是 IRI。

不完整性值,对于一个 节点 n 而言,是以下 值,对应于 sh:incomplete, 针对 n,在 数据图 中,并加上 值节点,它们针对 n 作为 焦点节点,属于每个 属性形状 p, 位于 形状图 中,该形状以 sh:incomplete 作为其 值, 对应于 sh:path, 其中 n 位于 形状的目标 中,该形状为 p,或者位于 形状的目标 中,该 形状 以 p 作为一个 值,对应于 sh:property。 这使得可以将 节点 声明为不完整,在 形状图 中, 使用 sh:values 或 sh:defaultValue (请参阅 6.9.2 值 节点:属性形状)。

一个 节点 n 是 不完整的,如果 false 不在 以下 不完整性值 中,即 n 的这些值,并且至少 满足以下条件之一:

  1. true 位于 不完整性值 中,这些值属于 n。
  2. n 是一个 IRI, 它以以下 IRI 开头,但不等于它, 该 IRI 属于任意 主语,该主语以 true 作为其唯一值, 对应于 sh:incompleteURIStart,位于 数据图 中。

特别是,一个 节点,如果同时具有 true 和 false 在其 不完整性值 中,则 不是 不完整的。

字面量 永远不会是 不完整的。

存在 不完整 节点 不会 改变验证 结果, 包括 sh:conforms 的值,该值位于 验证 报告 中。

本节的其余部分为非规范性内容。

基于 SHACL 的工具 可以 使用不完整数据三元组来改变 呈现方式,针对 由不完整数据导致的验证结果。 特别是,工具 可以:

上述列表并非穷尽。 其他示例包括 sh:node 和 sh:qualifiedMinCount。

在以下示例中,ex:Bob 被声明为 不完整,使用 sh:incomplete, 因为他的电子邮件地址尚未录入。 ex:Bob 和 ex:Carla 都违反了 sh:minCount 约束, 但工具可以选择隐藏 ex:Bob 的违规情况, 而正常呈现 ex:Carla 的违规情况。

在以下示例中,数据图 链接到一些公司,这些公司描述于另一个 图中。 它使用 sh:incompleteURIStart 将所有 IRI, 即这些公司的 IRI,声明为 不完整, 以便缺失的 rdf:type 三元组 不一定被显示为 sh:class 违规情况, 呈现给最终用户。 因此,ex:Alice 的违规情况可以被隐藏。 ex:Bob 的违规情况正常显示,因为他的雇主已被声明 为完整,使用 sh:incomplete false。 ex:Carla 符合要求,因为她的雇主被声明为一个 ex:Company。

注

sh:incompleteURIStart 的主语本身 不 包含在 不完整 IRI 的集合中。

注

IRI 按字符串进行比较,因此,例如主语 <http://example.org/comp> 也将适用于 <http://example.org/company/X>。 因此,建议使用以分隔符结尾的主语,例如 / 或 #,类似命名空间。

在以下示例中,形状图 将所有具有以下状态的人 ex:WorkInProgress 声明为 不完整。 该 属性形状 具有 sh:path sh:incomplete, 没有约束,但其 sh:values 生成 值节点 true, 针对每个 焦点节点,它们属于 ex:WorkInProgressShape,这 使 true 成为其 不完整性值 之一。 ex:Dave 和 ex:Erin 都违反了 sh:minCount 约束, 但工具可以选择隐藏 ex:Dave 的违规情况。

注

使用 sh:values 时,显式的 sh:incomplete false,如果位于 数据图 中,仍然优先, 因为此时 false 也位于 不完整性值 中。 改用 sh:defaultValue true 则只会为以下 焦点节点 添加 true,这些节点没有 sh:incomplete 的值,在 数据图 中。 在 形状图 中声明不完整性,要求 SHACL 处理器支持 sh:values 和 sh:defaultValue。

6.9 值节点

这些 验证器,即大多数约束组件的验证器,使用 值节点 的概念,由以下两个小节定义。

6.9.1 节点形状的值节点

对于 节点形状,其 值节点 是单个 焦点节点,形成恰好包含一个成员的集合。

6.9.2 值节点: 属性形状

对于 属性形状,它具有一个 值, 对应于 sh:path,即 p,其 值节点 集合通过以下步骤生成:

  1. 添加所有 节点,它们位于 数据图 中,并且 可以从 焦点节点 通过 路径映射 到达,该映射属于 p。
  2. 如果 e 是 值,对应于 sh:values,位于 属性形状 上, 则添加 输出节点,来自 evalExpr(e, 数据图, 焦点节点, {})。
  3. 如果集合仍为空,并且 d 是 值,对应于 sh:defaultValue,位于 该 属性形状 上, 则添加 输出节点,来自 evalExpr(d, 数据图, 焦点节点, {})。

7. 核心约束组件

本节定义了所有 SHACL 核心处理器都必须支持的内置 SHACL 核心约束组件。 每个约束组件的定义都包含其 IRI 以及一个列出其参数的表格。 除非另有说明,否则所有这些参数都是必需参数。 违反这些参数表中列出的任何语法规则的形状都是非良构的。

每个约束组件还包含一个文本定义,用于描述与该组件关联的验证器。 这些文本定义使用形如 $paramName 的变量来引用约束中参数的值, 其中 paramName 是参数的IRI 中 sh: 命名空间之后的部分。 例如,sh:ClassConstraintComponent 的文本定义使用变量 $class 来引用 sh:class 的值。 在 SHACL 核心中,术语参数值是指参数的值, 即形状图中一个三元组的对象,该三元组的主语 是形状, 而谓词是参数(例如 sh:class)。

问题 1

在撰写本文时,工作组计划在 SHACL 核心之外定义一种 SHACL 方言, 其中术语 参数值也允许使用节点表达式。 请注意,并非所有约束组件都使用术语参数值,有些组件使用的是 术语值。 例如,sh:node 的值永远不能是节点表达式, 因为这会使 空白节点的处理变得复杂。 SHACL 核心中的常量 IRI 和字面量之外的节点表达式在 [shacl12-node-expr] 中定义。

请注意,这些验证器定义了由该组件生成的 唯一 验证结果, 即该组件的全部验证结果。 此外,验证器始终生成 新的 结果节点,即当文字定义 声明 “……存在一个验证结果……”时,这指的是一个不同的新节点,位于 结果图 中。

本节其余部分为非规范性内容。

SHACL 核心中包含哪些约束组件,是根据 [shacl-ucr] 文档收集的需求决定的。 特别注意在尽可能覆盖更多常见用例 与保持核心语言的规模可控之间取得平衡。 并非所有用例都能仅通过核心语言表达。 为此,SHACL-SPARQL [shacl12-sparql] 提供了一种扩展 机制。 预计第三方将维护更多可复用的约束组件 库。

除非另有说明,否则核心约束组件既可用于属性形状,也可用于节点 形状。 某些约束参数附带的语法规则会使使用这些参数的节点形状成为 非良构的。 例如,sh:minCount 仅支持用于属性形状。

7.1 值类型约束 组件

本节中的约束组件有一个共同点,即它们可用于限制 值节点的类型。 请注意,可以使用sh:or表示多个值类型的备选项。

7.1.1 sh:class

sh:class 指定的条件是每个值节点都是给定类型的SHACL 实例。

约束组件 IRI: sh:ClassConstraintComponent

参数:
属性 摘要和语法规则
sh:class 所有值节点的类型。 形状中的 sh:class 值要么是IRI, 要么是作为良构SHACL 列表的空白节点,其中所有成员都是IRI。
文本定义
设 $class 为 sh:class 的一个参数值。 设 classes 为一个IRI 集合, 使得 当 $class 是一个IRI 时,该集合恰好只包含该 IRI; 而当 $class 是一个作为SHACL 列表的空白节点时, 该集合恰好包含 该列表的所有成员。

对于每个属于字面量,或者不是 数据图中任何 classes 的SHACL 实例的非字面量值节点, 都存在一个验证结果,其 sh:value 为该值节点。

本节其余部分为非规范性内容。

请注意,sh:class 的多个值被解释为合取, 即值必须是所有这些类的 SHACL 实例。 使用列表可以表达并集语义。

以下示例演示了 sh:class 基于列表的语法, 表示属性 ex:pet 的值必须是猫或狗。

7.1.2 sh:datatype

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 为该值节点。

字面量的数据类型按照 SPARQL 1.2 的datatype 函数确定。 如果一个字面量的数据类型具有相同的IRI, 并且对于 SPARQL 1.2 支持的数据类型,该字面量不是类型不正确的字面量,则它与该数据类型匹配。

本节其余部分为非规范性内容。

sh:datatype 的值通常是数据类型,例如 xsd:string。

以下示例演示了基于列表的语法,表示 rdfs:label 的所有值必须是 xsd:string 或 rdf:langString。

7.1.3 sh:nodeKind

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 或空白节点。

7.2 基数约束 组件

以下约束组件表示对给定焦点节点的 值节点数量的限制。

7.2.1 sh:minCount

sh:minCount 指定满足条件的值节点的最小数量。 如果最小基数值为 0,则始终满足此约束,因此可以 省略。

约束组件 IRI: sh:MinCountConstraintComponent

参数:
属性 摘要和语法规则
sh:minCount 最小基数。 节点形状不能具有任何 sh:minCount 值。 一个属性形状最多只能有一个 sh:minCount 值。 属性形状中 sh:minCount 的值是数据类型为 xsd:integer 的字面量。
文本定义
设 $minCount 为 sh:minCount 的一个参数值。 如果值节点的数量小于 $minCount, 则存在一个验证结果。

本节其余部分为非规范性内容。

7.2.2 sh:maxCount

sh:maxCount 指定满足条件的值节点的最大数量。

约束组件 IRI: sh:MaxCountConstraintComponent

参数:
属性 摘要和语法规则
sh:maxCount 最大基数。 节点形状不能具有任何 sh:maxCount 值。 一个属性形状最多只能有一个 sh:maxCount 值。 属性形状中 sh:maxCount 的值是数据类型为 xsd:integer 的字面量。
文本定义
设 $maxCount 为 sh:maxCount 的一个参数值。 如果值节点的数量大于 $maxCount, 则存在一个验证结果。

本节其余部分为非规范性内容。

7.3 值范围约束 组件

以下约束组件指定了值节点必须满足的值范围条件,这些值节点 可以通过 <、<=、> 和 >= 等运算符进行比较。 以下示例演示了这些约束组件的典型用例。

7.3.1 sh:minExclusive

sh:minExclusive 指定每个值节点必须大于的最小排他值。

约束组件 IRI: sh:MinExclusiveConstraintComponent

参数:
属性 摘要和语法规则
sh:minExclusive 最小排他值。 形状中 sh:minExclusive 的值 是字面量。 一个 形状最多只能有一个 sh:minExclusive 值。
文本定义
设 $minExclusive 为 sh:minExclusive 的一个参数值。 对于每个值节点 v, 如果 SPARQL 表达式 $minExclusive < v 不返回 true, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

如果值节点无法与指定范围进行比较,则会产生一个验证结果, 例如,将字符串与整数进行比较时。

7.3.2 sh:minInclusive

sh:minInclusive 指定每个值节点必须大于或等于的最小包含值。

约束组件 IRI: sh:MinInclusiveConstraintComponent

参数:
属性 摘要和语法规则
sh:minInclusive 最小包含值。 形状中 sh:minInclusive 的值 是字面量。 一个 形状最多只能有一个 sh:minInclusive 值。
文本定义
设 $minInclusive 为 sh:minInclusive 的一个参数值。 对于每个值节点 v, 如果 SPARQL 表达式 $minInclusive <= v 不返回 true, 则存在一个验证结果,其中 v 作为 sh:value。

7.3.3 sh:maxExclusive

sh:maxExclusive 指定每个值节点必须小于的最大排他值。

约束组件 IRI: sh:MaxExclusiveConstraintComponent

参数:
属性 摘要和语法规则
sh:maxExclusive 最大排他值。 形状中 sh:maxExclusive 的值 是字面量。 一个 形状最多只能有一个 sh:maxExclusive 值。
文本定义
设 $maxExclusive 为 sh:maxExclusive 的一个参数值。 对于每个值节点 v, 如果 SPARQL 表达式 $maxExclusive > v 不返回 true, 则存在一个验证结果,其中 v 作为 sh:value。

7.3.4 sh:maxInclusive

sh:maxInclusive 指定每个值节点必须小于或等于的最大包含值。

约束组件 IRI: sh:MaxInclusiveConstraintComponent

参数:
属性 摘要和语法规则
sh:maxInclusive 最大包含值。 形状中 sh:maxInclusive 的值 是字面量。 一个 形状最多只能有一个 sh:maxInclusive 值。
文本定义
设 $maxInclusive 为 sh:maxInclusive 的一个参数值。 对于每个值节点 v, 如果 SPARQL 表达式 $maxInclusive >= v 不返回 true, 则存在一个验证结果,其中 v 作为 sh:value。

7.4 基于字符串的约束 组件

本节中的约束组件有一个共同点,即它们指定了 值节点的字符串表示必须满足的条件。

7.4.1 sh:minLength

sh:minLength 指定每个值节点满足 条件所需的最小字符串长度。 此约束可应用于任何字面量和IRI, 但不适用于空白节点。

约束组件 IRI: sh:MinLengthConstraintComponent

参数:
属性 摘要和语法规则
sh:minLength 最小长度。 形状中 sh:minLength 的值是数据类型为 xsd:integer 的字面量。 一个形状 最多只能有一个 sh:minLength 值。
文本定义
设 $minLength 为 sh:minLength 的一个参数值。 对于每个值节点 v, 如果其字符串表示的长度(由SPARQL STRLEN 函数定义) (字符串表示由SPARQL str 函数定义) 小于 $minLength,或者 v 是一个空白节点, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

请注意,如果 sh:minLength 的值为 0,则不对 字符串长度施加限制,但如果值节点是空白节点,仍会违反该约束。

7.4.2 sh:maxLength

sh:maxLength 指定每个值节点满足 条件所需的最大字符串长度。 此约束可应用于任何字面量和IRI, 但不适用于空白节点。

约束组件 IRI: sh:MaxLengthConstraintComponent

参数:
属性 摘要和语法规则
sh:maxLength 最大长度。 形状中 sh:maxLength 的值是数据类型为 xsd:integer 的字面量。 一个形状 最多只能有一个 sh:maxLength 值。
文本定义
设 $maxLength 为 sh:maxLength 的一个参数值。 对于每个值节点 v, 如果其字符串表示的长度(由SPARQL STRLEN 函数定义) (字符串表示由SPARQL str 函数定义) 大于 $maxLength,或者 v 是一个空白节点, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

7.4.3 sh:pattern

sh:pattern 指定每个值节点必须匹配的正则表达式, 以满足条件。

约束组件 IRI: sh:PatternConstraintComponent

参数:
属性 摘要和语法规则
sh:pattern 所有值节点都必须匹配的正则表达式。 形状中 sh:pattern 的值是数据类型为 xsd:string 的字面量。 形状中 sh:pattern 的值是SPARQL REGEX 函数的有效模式参数。
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 作为 第三个参数。

本节其余部分为非规范性内容。

7.4.4 sh:singleLine

问题 2

此特性目前“存在风险”,有待工作组就此特性及类似的便利特性作出决议。 工作组尚未确定应如何划分应纳入核心的特性 与应放入其他文档的特性。 最初在问题 177中讨论。

当设置为 true 时,sh:singleLine 指定 值节点不得包含换行符。 除了约束验证之外,用户界面构建器还可以利用此信息 在(单行)文本字段和(多行)文本区域之间进行选择。

约束组件 IRI: sh:SingleLineConstraintComponent

参数:
属性 摘要和语法规则
sh:singleLine 设置为 true 可启用此约束。 形状中 sh:singleLine 的值是数据类型为 xsd:boolean 的字面量。 一个 形状最多只能有一个 sh:singleLine 值。
文本定义
设 $singleLine 为 sh:singleLine 的一个参数值。 如果 $singleLine 为 true,则对于每个值节点, 如果它是一个词法形式包含 U+000A(换行符)、U+000B(垂直制表符)、U+000C(换页符)或 U+000D (回车符)中任何字符的字面量, 则存在一个验证结果。

本节其余部分为非规范性内容。

7.4.5 sh:languageIn

sh:languageIn 指定的条件是每个 值节点允许使用的语言标签受到给定语言标签列表的限制。

约束组件 IRI: sh:LanguageInConstraintComponent

参数:
属性 摘要和语法规则
sh:languageIn 按照 [BCP47] 定义的基本语言范围列表。 形状中 sh:languageIn 的每个值都是一个SHACL 列表。 此类列表的每个成员 都是数据类型为 xsd:string 的字面量。 一个 形状最多只能有一个 sh:languageIn 值。
文本定义
设 $languageIn 为 sh:languageIn 的一个值。 对于每个值节点, 如果它不是字面量,或者没有能够 匹配作为 $languageIn 的成员的任何基本语言范围的语言标签, 其中匹配遵循 SPARQL langMatches 函数定义的过滤方案, 则存在一个验证结果,其中该值节点作为 sh:value。

本节其余部分为非规范性内容。

以下示例形状规定 ex:prefLabel 的所有值 可以使用英语或毛利语。

7.4.6 sh:uniqueLang

将属性 sh:uniqueLang 设置为 true,可指定任意两个 值节点不得使用相同的语言标签, 如果存在文本方向,也需要将其考虑在内。

约束组件 IRI: sh:UniqueLangConstraintComponent

参数:
属性 摘要和语法规则
sh:uniqueLang 设置为 true 可启用此约束。 形状中 sh:uniqueLang 的值是数据类型为 xsd:boolean 的字面量。 一个 属性形状最多只能有一个 sh:uniqueLang 值。 节点形状不能具有任何 sh:uniqueLang 值。
文本定义
设 $uniqueLang 为 sh:uniqueLang 的一个参数值。 如果 $uniqueLang 为 true, 则对于至少两个值节点使用的每个非空语言标签, 都存在一个验证结果。 对于值节点的数据类型为 rdf:dirLangString 的情况, 基本方向也纳入唯一性 条件的考量, 例如,"1"@ar--rtl 和 "1"@ar--ltr 是不同的, "1"@ar--rtl 和 "1"@ar 也是如此。

本节其余部分为非规范性内容。

7.5 列表约束组件

本节中的约束组件适用于作为SHACL 列表的值节点。 它们指定 SHACL 列表的结构、长度和成员必须满足的条件。

7.5.1 sh:memberShape

sh:memberShape 指定作为SHACL 列表的值节点的所有成员都必须符合给定的节点形状。

约束组件 IRI: sh:MemberShapeConstraintComponent

参数:
属性 摘要和语法规则
sh:memberShape SHACL 列表的所有成员都必须 符合的形状。 sh:memberShape 的值必须是良构的节点 形状。
文本定义
设 $memberShape 为 sh:memberShape 的一个参数值。 每个值节点 v 都必须是一个SHACL 列表——如果 v 不是 SHACL 列表,则 存在一个验证结果,其中 v 作为 sh:value。 如果 SHACL 列表 v 的任何成员 m 不符合 $memberShape,则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

值节点 v 中每个不符合 $memberShape 的成员 m,都应作为 v 的验证结果中的一个独立 sh:detail 报告。 如果 v 不是有效的SHACL 列表,则应将其 报告为一个顶层验证结果,并且不应尝试验证 各个成员。

有关如何在验证结果中生成 sh:detail 的示例,可参见 SHACL 测试套件中 sh:memberShape 的测试用例:memberShape-001.ttl。

在以下示例中,属性 ex:speakerOrder 的所有值都必须是 成员为 IRI 的 SHACL 列表。

7.5.2 sh:minListLength

sh:minListLength 指定作为SHACL 列表的值节点必须具有的最少成员数。

约束组件 IRI: sh:MinListLengthConstraintComponent

参数:
属性 摘要和语法规则
sh:minListLength SHACL 列表中的最少成员数。 形状中 sh:minListLength 的值是数据类型为 xsd:integer 的字面量。 形状中 sh:minListLength 的值是大于或等于 0 的整数。 一个形状最多只能有一个 sh:minListLength 值。
文本定义
设 $minListLength 为 sh:minListLength 的一个参数值。 每个值节点 v 都必须是一个SHACL 列表——如果 v 不是 SHACL 列表,则 存在一个验证结果,其中 v 作为 sh:value。 如果列表 v 的成员数小于 $minListLength, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

在以下示例中,属性 ex:skills 的所有值都必须是 至少包含 1 个成员的 SHACL 列表。 有关 sh:minListLength 的其他测试用例,可参见 SHACL 测试套件:minListLength-001.ttl。

7.5.3 sh:maxListLength

sh:maxListLength 指定作为SHACL 列表的值节点最多可以具有的成员数。

约束组件 IRI: sh:MaxListLengthConstraintComponent

参数:
属性 摘要和语法规则
sh:maxListLength SHACL 列表中的最多成员数。 形状中 sh:maxListLength 的值是数据类型为 xsd:integer 的字面量。 形状中 sh:maxListLength 的值是大于或等于 0 的整数。 一个形状最多只能有一个 sh:maxListLength 值。
文本定义
设 $maxListLength 为 sh:maxListLength 的一个参数值。 每个值节点 v 都必须是一个SHACL 列表——如果 v 不是 SHACL 列表,则 存在一个验证结果,其中 v 作为 sh:value。 如果列表 v 的成员数大于 $maxListLength, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

在以下示例中,属性 ex:hobbies 的所有值都必须是 最多包含 2 个成员的 SHACL 列表。 有关 sh:maxListLength 的其他测试用例,可参见 SHACL 测试套件:maxListLength-001.ttl。

7.5.4 sh:uniqueMembers

sh:uniqueMembers 指定作为SHACL 列表的值节点是否必须具有互不重复的成员。

约束组件 IRI: sh:UniqueMembersConstraintComponent

参数:
属性 摘要和语法规则
sh:uniqueMembers 一个布尔值,指定SHACL 列表的成员是否必须互不重复。 形状中 sh:uniqueMembers 的值是数据类型为 xsd:boolean 的字面量。 一个形状最多只能有一个 sh:uniqueMembers 值。
文本定义
设 $uniqueMembers 为 sh:uniqueMembers 的一个参数值。 每个值节点 v 都必须是一个SHACL 列表——如果 v 不是 SHACL 列表,则 存在一个验证结果,其中 v 作为 sh:value。 如果 $uniqueMembers 为 true,且列表 v 包含重复 成员, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

列表 v 中的每个重复成员 m 都应作为 v 的验证结果中的一个独立 sh:detail 报告。 如果列表 v 不是有效的SHACL 列表,则 应将其报告为一个顶层验证结果,并且不应尝试验证 成员的唯一性。

有关如何在验证结果中生成 sh:detail 的示例,可参见 SHACL 测试套件中 sh:uniqueMembers 的测试用例:uniqueMembers-001.ttl。

在以下示例中,属性 ex:preferences 的所有值都必须是 SHACL 列表, 且每个 SHACL 列表中的成员值必须互不重复。

7.6 属性对约束 组件

本节中的约束组件指定了值节点集合与 其他属性或属性路径相关的条件。 sh:lessThan 和 sh:lessThanOrEquals 只能用于属性形状。

7.6.1 sh:equals

sh:equals 指定所有值节点的集合必须等于 可以从节点集合, 该集合中的节点可从焦点节点出发,通过使用 sh:equals 指定的SHACL 属性 路径到达。

约束组件 IRI: sh:EqualsConstraintComponent

参数:
属性 摘要和语法规则
sh:equals 用于比较的属性路径。 形状中 sh:equals 的值是良构的SHACL 属性路径。
文本定义
设 $equals 为 sh:equals 的一个值,$path 为在形状图中由 $equals 表示的SHACL 属性路径。 设 $otherNodes 为可以从节点构成的集合,这些节点可从焦点节点出发,通过 $path 到达。 对于每个值节点, 如果它不在 $otherNodes 中, 则存在一个验证结果,其中该值节点作为 sh:value。 对于 $otherNodes 中的每个节点, 如果它不是值节点之一, 则存在一个验证结果,其中该节点作为 sh:value。

本节其余部分为非规范性内容。

以下示例演示如何在形状中使用 sh:equals 来指定 某些焦点节点的 ex:firstName 和 ex:givenName 必须具有相同的值集合。

以下示例表明,SHACL 属性路径既可用作 sh:path 的值, 也可用作 sh:equals 的值。

7.6.2 sh:disjoint

sh:disjoint 指定值节点的集合 必须与从节点构成的集合不相交,这些节点可从焦点节点出发, 通过作为 sh:disjoint 的SHACL 属性路径的值 所表示的路径到达。

约束组件 IRI: sh:DisjointConstraintComponent

参数:
属性 摘要和语法规则
sh:disjoint 用于比较值的属性路径。 形状中 sh:disjoint 的值是良构的SHACL 属性路径。
文本定义
设 $disjoint 为 sh:disjoint 的一个参数值,$path 为在形状图中由 $disjoint 表示的SHACL 属性路径。 设 $otherNodes 为可以从节点构成的集合,这些节点可从焦点节点出发,通过 $path 到达。 对于每个同时属于 $otherNodes 的值节点, 都存在一个验证结果,其中该值节点作为 sh:value。

本节其余部分为非规范性内容。

以下示例演示如何在形状中使用 sh:disjoint 来指定 某些焦点节点的 ex:prefLabel 和 ex:altLabel 不能共享任何值。

7.6.3 sh:subsetOf

sh:subsetOf 指定所有值节点都必须 也能够 从焦点节点出发,通过使用 sh:subsetOf 指定的SHACL 属性 路径到达。

约束组件 IRI: sh:SubsetOfConstraintComponent

参数:
属性 摘要和语法规则
sh:subsetOf 用于比较的属性路径。 形状中 sh:subsetOf 的值是良构的SHACL 属性路径。
文本定义
设 $subsetOf 为 sh:subsetOf 的一个值,$path 为在形状图中由 $subsetOf 表示的SHACL 属性路径。 设 $otherNodes 为可以从节点构成的集合,这些节点可从焦点节点出发,通过 $path 到达。 对于每个不在 $otherNodes 中的值节点, 都存在一个验证结果,其中该值节点作为 sh:value。

本节其余部分为非规范性内容。

以下示例演示如何在形状中使用 sh:subsetOf 来指定 一个人最喜欢的孩子必须是其实际子女之一。

7.6.4 sh:lessThan

sh:lessThan 指定每个值节点都必须 小于所有 可以从节点构成的集合,这些节点可从焦点节点出发,通过 作为 sh:lessThan 的SHACL 属性路径 的值所表示的路径到达。

约束组件 IRI: sh:LessThanConstraintComponent

参数:
属性 摘要和语法规则
sh:lessThan 用于比较值的属性路径。 形状中 sh:lessThan 的值是良构的SHACL 属性路径。 节点形状不能具有任何 sh:lessThan 值。
文本定义
设 $lessThan 为 sh:lessThan 的一个值,$path 为在形状图中由 $lessThan 表示的SHACL 属性路径。 设 $otherNodes 为可以从节点构成的集合,这些节点可从焦点节点出发,通过 $path 到达。 对于每一对由值节点和 $otherNodes 中的一个成员组成的节点, 如果第一个值不小于第二个值(根据 SPARQL 的 < 运算符), 或者这两个值无法比较, 则存在一个验证结果,其中该值节点作为 sh:value。

本节其余部分为非规范性内容。

以下示例演示如何在形状中使用 sh:lessThan 来指定 ex:startDate 的所有值都必须“早于” ex:endDate 的值。

7.6.5 sh:lessThanOrEquals

sh:lessThanOrEquals 指定每个值节点都必须 小于或等于 所有可以从节点构成的集合,这些节点可从焦点节点出发,通过 作为 sh:lessThanOrEquals 的SHACL 属性路径 的值所表示的路径到达。

约束组件 IRI: sh:LessThanOrEqualsConstraintComponent

参数:
属性 摘要和语法规则
sh:lessThanOrEquals 用于比较值的属性路径。 形状中 sh:lessThanOrEquals 的值是良构的SHACL 属性路径。 节点 形状不能具有任何 sh:lessThanOrEquals 值。
文本定义
设 $lessThanOrEquals 为 sh:lessThanOrEquals 的一个值,$path 为在形状图中由 $lessThanOrEquals 表示的SHACL 属性路径。 设 $otherNodes 为可以从节点构成的集合,这些节点可从焦点节点出发,通过 $path 到达。 对于每一对由值节点和 $otherNodes 中的一个成员组成的节点, 如果第一个值不小于或等于第二个值(根据 SPARQL 的 <= 运算符), 或者这两个值无法比较, 则存在一个验证结果,其中该值节点作为 sh:value。

本节其余部分为非规范性内容。

以下示例演示如何在形状中使用 sh:lessThanOrEquals 来指定 ex:startDate 的值不得晚于 ex:endDate 的值。 与 sh:lessThan 不同,项目可以在开始当天结束。

7.7 逻辑约束组件

本节中的约束组件实现了常见的逻辑运算符 与、或和非,以及异或的一种变体。

7.7.1 sh:not

sh:not 指定每个值节点都不能符合给定的形状。 这相当于否定和逻辑“非”运算符。

约束组件 IRI: sh:NotConstraintComponent

参数:
属性 摘要和语法规则
sh:not 要否定的形状。 形状中 sh:not 的值必须是良构的形状。
文本定义
设 $not 为 sh:not 的一个值。 对于每个值节点 v: 如果根据形状 $not 对 v 进行符合性检查时产生失败, 则必须产生一个失败。 否则,如果 v 符合形状 $not, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

以下示例演示如何在形状中使用 sh:not 来指定 某些焦点节点不能具有任何 ex:property 值。

7.7.2 sh:and

sh:and 指定每个值节点都必须符合所有给定的 形状。 这相当于合取和逻辑“与”运算符。

约束组件 IRI: sh:AndConstraintComponent

参数:
属性 摘要和语法规则
sh:and 一个由用于验证值节点的形状组成的SHACL 列表。 形状中 sh:and 的每个值都是一个SHACL 列表。 此类列表的每个成员都必须是一个良构的形状。
文本定义
设 $and 为 sh:and 的一个值。 对于每个值节点 v: 如果根据 $and 的任何成员对 v 进行符合性检查时产生一个失败, 则必须产生一个失败。 否则,如果 v 并不符合 $and 的每个成员, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

请注意,虽然 sh:and 的值是一个由形状组成的SHACL 列表, 但这些形状的顺序不会影响验证结果。 对于使用短路求值语义的实现,顺序可能影响 验证效率。 建议将更容易求值或更 可能失败的约束放在列表前面。

以下示例演示如何在形状中使用 sh:and 来指定 某些焦点节点恰好具有一个 ex:property 值。 这是通过将一个单独的命名形状(ex:SuperShape)与一个属性形状进行合取实现的,前者 指定 最小数量,后者另外指定最大数量。 如此处所示,sh:and 可用于实现形状之间的特化 机制。

7.7.3 sh:or

sh:or 指定每个值节点都必须符合至少一个 给定的形状。 这相当于析取和逻辑“或”运算符。

约束组件 IRI:sh:OrConstraintComponent

参数:
属性 摘要和语法规则
sh:or 一个由用于验证值节点的形状组成的SHACL 列表。 形状中 sh:or 的每个值都是一个SHACL 列表。 此类列表的每个成员都必须是一个良构的形状。
文本定义
设 $or 为 sh:or 的一个值。 对于每个值节点 v: 如果根据 $or 的任何成员对 v 进行符合性检查时产生一个失败, 则必须产生一个失败。 否则,如果 v 不符合 $or 的任何成员, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

请注意,虽然 sh:or 的值是一个由形状组成的SHACL 列表, 但这些形状的顺序不会影响验证结果。 对于使用短路求值语义的实现,顺序可能影响 验证效率。 建议将更容易求值或更 可能成功的约束放在列表前面。

以下示例演示如何在形状中使用 sh:or 来指定 某些焦点节点至少具有一个 ex:firstName 值, 或者至少具有一个 ex:givenName 值。

下一个示例展示如何在属性形状中使用 sh:or, 以规定 给定属性 ex:address 的值可以是数据类型为 xsd:string 的字面量, 也可以是类 ex:Address 的SHACL 实例。

请注意,SHACL 中的所有约束在执行时都以逻辑与组合。请考虑以下示例:

正确的解释是(shapeA 或 shapeB)且(shapeC 或 shapeD)。 目标节点必须符合 shapeA 或 shapeB,同时还必须符合 shapeC 或 shapeD。

7.7.4 sh:xone

sh:xone 指定每个值节点都必须恰好符合 一个给定的形状。

约束组件 IRI: sh:XoneConstraintComponent

参数:
属性 摘要和语法规则
sh:xone 一个由用于验证值节点的形状组成的SHACL 列表。 形状中 sh:xone 的每个值都是一个SHACL 列表。 此类列表的每个成员都必须是一个良构的形状。 每个 此类列表应当至少包含一个 成员。
文本定义
设 $xone 为 sh:xone 的一个值。 对于每个值节点 v, 设 N 为 $xone 中作为成员的形状的数量, 其中 v 符合相应形状。 如果根据任何成员对 v 进行符合性检查时产生一个失败, 则必须产生一个失败。 否则,如果 N 不恰好等于 1, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

请注意,虽然 sh:xone 的值是一个由形状组成的SHACL 列表, 但这些形状的顺序不会影响验证结果。

以下示例演示如何在形状中使用 sh:xone 来指定 条件, 即某些焦点节点必须具有 ex:fullName 的值,或者具有 ex:firstName 和 ex:lastName 的值,但不能同时具有两者。

7.8 基于形状的约束 组件

本节中的约束组件可通过根据特定形状验证值节点 来指定复杂条件。

7.8.1 sh:node

sh:node 指定每个值节点都必须符合给定的节点形状。

约束组件 IRI: sh:NodeConstraintComponent

参数:
属性 摘要和语法规则
sh:node 所有值节点都必须符合的节点形状。 形状中 sh:node 的值必须是良构的节点 形状。
文本定义
设 $node 为 sh:node 的一个值。 对于每个值节点 v: 如果根据 $node 对 v 进行符合性检查时 产生一个失败,则必须产生一个失败。 否则,如果 v 不符合 $node, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

以下示例演示了在属性形状中使用 sh:node 的方式。 属性 ex:address 的所有值都必须满足 形状 ex:AddressShape 所表达的约束。

以下示例演示了在节点形状中使用 sh:node 的方式。

有关 SHACL 中递归形状的处理,请参见6.6.3 递归 形状的处理。

7.8.2 sh:property

sh:property 可用于指定每个值节点都具有 给定的属性形状。

约束组件 IRI: sh:PropertyConstraintComponent

参数:
属性 摘要和语法规则
sh:property 所有值节点都需要具有的属性形状。 形状中 sh:property 的每个值都必须是一个良构的属性形状。
文本定义
设 $property 为 sh:property 的一个值。 对于每个值节点 v: 如果将 v 作为焦点节点,根据属性 形状 $property 进行验证时产生一个失败, 则必须产生一个失败。 否则,验证结果就是根据该属性形状验证 作为焦点节点的 v 所得到的结果, 该属性形状为 $property。

本节其余部分为非规范性内容。

请注意,sh:property 与 sh:node 之间存在一个重要区别: 如果值节点违反了约束,则对于该值节点, sh:node 只会产生一个验证结果, 其 sh:sourceConstraintComponent 为 sh:NodeConstraintComponent。 另一方面,sh:property 可以产生任意数量的验证结果, 而这些 结果会将属性形状中各个约束的 约束组件作为其 sh:sourceConstraintComponent 的值。

与所有其他验证结果一样,每当通过 sh:property 到达一个属性形状 时, 验证引擎都必须产生全新的验证结果节点。 这也包括对同一个焦点节点根据同一个 属性形状进行验证的情况, 即使在形状图中是通过不同路径到达该属性形状的。

7.8.3 sh:someValue

sh:someValue 指定至少有一个值节点符合 给定的形状。

约束组件 IRI: sh:SomeValueConstraintComponent

参数:
属性 摘要和语法规则
sh:someValue 至少有一个值节点需要符合的形状。 形状中 sh:someValue 的值必须是良构的形状。
文本定义
设 $someValue 为 sh:someValue 的一个值。 如果根据 $someValue 对任何值节点进行符合性检查时 产生一个失败,则必须产生一个失败,除非至少有一个值节点符合 $someValue。 否则,如果没有任何值节点符合 $someValue, 则存在一个验证结果。

本节其余部分为非规范性内容。

请注意,一旦某个值节点符合要求,实现就可以停止处理其他值节点。 由于值节点集合中节点的顺序未定义,因此无法保证任何 会导致失败的节点 一定会被访问。 因此,为了使处理过程可预测,除非所有值节点都已 被访问且没有一个符合要求,否则失败会被静默忽略。

在以下示例中,任何符合 ex:DuckFarmerShape 的节点都需要至少 具有一个 ex:tendsAnimal 值,该值是 ex:Duck 的SHACL 实例。

sh:someValue 可以视为 sh:qualifiedValueShape 和 sh:qualifiedMinCount 1 组合的语法糖。

另请注意,sh:someValue 主要适合用于属性形状。 在节点形状中,使用 sh:someValue 等同于使用 sh:node 或 sh:property。

7.8.4 sh:qualifiedValueShape, sh:qualifiedMinCount, sh:qualifiedMaxCount

sh:qualifiedValueShape 指定必须有指定数量的值节点符合给定形状这一条件。 每个 sh:qualifiedValueShape 可以在同一个主语上具有一个 sh:qualifiedMinCount 值、 一个 sh:qualifiedMaxCount 值,或者两者各有一个值。

约束组件 IRI: sh:QualifiedMinCountConstraintComponent、 sh:QualifiedMaxCountConstraintComponent

参数:
属性 摘要和语法规则
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 为形状图 G 中 声明了限定基数约束的一个形状 (即具有 sh:qualifiedValueShape 的值,以及 sh:qualifiedMinCount 或 sh:qualifiedMaxCount 中至少一个的值)。 设 ps 为 G 中将 Q 作为 sh:property 的一个值的形状集合。 如果 Q 将 true 作为 sh:qualifiedValueShapesDisjoint 的一个值, 则 Q 的同级形状集合定义为 ps 中任意形状的 SPARQL 属性路径 sh:property/sh:qualifiedValueShape 的所有值组成的集合, 再减去 Q 自身的 sh:qualifiedValueShape 的值。 否则,同级形状集合为空。
sh:qualifiedMinCount 的文本定义
设 $qualifiedValueShape 为 sh:qualifiedValueShape 的一个值。 设 $qualifiedMinCount 为 sh:qualifiedMinCount 的一个参数值。 设 C 为满足以下条件的值节点 v 的数量: v 符合 $qualifiedValueShape, 且 v 不符合当前形状的任何同级形状, 即根据其验证 v、且将 $qualifiedValueShape 作为其 sh:qualifiedValueShape 值的形状。 如果上述任何符合性检查产生一个失败, 则必须产生一个失败。 否则,如果 C 小于 $qualifiedMinCount,则存在一个验证结果。 sh:qualifiedMinCount 的约束组件是 sh:QualifiedMinCountConstraintComponent。
sh:qualifiedMaxCount 的文本定义
设 $qualifiedMaxCount 为 sh:qualifiedMaxCount 的一个参数值。 设 C 的定义与上述 sh:qualifiedMinCount 中相同。 如果上述任何符合性检查产生一个失败, 则必须产生一个失败。 否则,如果 C 大于 $qualifiedMaxCount,则存在一个验证结果。 sh:qualifiedMaxCount 的约束组件是 sh:QualifiedMaxCountConstraintComponent。

本节其余部分为非规范性内容。

以下示例形状可用于指定属性 ex:parent 恰好具有两个值, 且其中至少一个为女性。

以下示例演示了如何使用 sh:qualifiedValueShapesDisjoint 表示一只手最多只能具有 5 个 ex:digit 值(通过 sh:maxCount 表达), 并且其中恰好一个必须是 ex:Thumb 的实例,另有恰好 4 个必须 是 ex:Finger 的实例, 但拇指与其他手指必须互不相交。 换言之,一只手上的其他手指都不能同时计为拇指。

7.8.5 sh:reifierShape, sh:reificationRequired

sh:reifierShape 可用于将一个属性形状与一个或多个节点形状关联起来。 任何具体化节点都必须符合这些节点形状。

约束组件 IRI: sh:ReifierShapeConstraintComponent

参数:
属性 摘要和语法规则
sh:reifierShape 此三元组的具体化节点必须符合的节点形状。 sh:reifierShape 的值必须是良构的节点 形状。 如果提供了 sh:reifierShape 的值,则 sh:path 的值 被限制为 IRI。
sh:reificationRequired 这是 sh:ReifierShapeConstraintComponent 的可选参数。 如果设置为 true,则数据图中的焦点 节点与路径组合必须至少具有一个具体化值。 形状中 sh:reificationRequired 的值是数据类型为 xsd:boolean 的字面量。
文本定义
设 $reifierShape 为 sh:reifierShape 的一个值, 设 $reificationRequired 为 sh:reificationRequired 的值(如果存在), 并设 $path 为属性形状的 sh:path 的值。 对于每个值节点 v,设 t 为三元组术语(焦点节点, $path,v), 并设 t 的具体化节点为满足以下条件的节点 r: 数据图包含 三元组 r rdf:reifies t。

对于 t 的每个具体化节点 r,如果将 r 作为焦点节点根据节点形状 $reifierShape 进行验证时产生一个失败, 则必须产生一个失败。 否则,对于 t 的每个不符合 $reifierShape 的具体化节点 r, 都存在一个验证结果,其中 v 作为 sh:value。

如果 $reificationRequired 为 true,且 t 没有具体化节点, 则存在一个验证结果,其中 v 作为 sh:value。

本节其余部分为非规范性内容。

7.9 其他约束组件

本节列出了不属于其他类别的核心约束组件。

7.9.1 sh:closed, sh:ignoredProperties

RDF 数据模型提供了极大的灵活性。 原则上,任何节点都可以具有任何属性的值。 然而,在某些情况下,有必要指定哪些属性可以应用于 节点的条件。 SHACL 核心语言包含一个名为 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)
    添加所有可以从 S 出发通过 SPARQL 路径到达的 IRI 属性
            sh:property/sh:path
    如果 S 是形状图中 rdfs:Class 的 SHACL 实例 {
        对于形状图中每个匹配 (S rdfs:subClassOf ?o) 的三元组
            collectProperties(?o)
        对于形状图中每个匹配 (?s sh:targetClass S) 的三元组
            collectProperties(?s)
    }
    如果 S 是形状图中 sh:NodeShape 的 SHACL 实例
        对于形状图中每个匹配 (S sh:node ?o) 的三元组
            collectProperties(?o)

对于数据图中值节点的每个 rdf:type T
    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。

7.9.2 sh:hasValue

sh:hasValue 指定至少有一个值节点等于 给定的 RDF 术语这一条件。

约束组件 IRI: sh:HasValueConstraintComponent

参数:
属性 摘要和语法规则
sh:hasValue 一个明确要求的值。
文本定义
设 $hasValue 为 sh:hasValue 的一个参数值。 如果 RDF 术语 $hasValue 不属于值节点集合, 则存在一个验证结果。

本节其余部分为非规范性内容。

7.9.3 sh:in

sh:in 指定每个值节点都是给定SHACL 列表的一个成员这一条件。

约束组件 IRI:sh:InConstraintComponent

参数:
属性 摘要和语法规则
sh:in 一个以允许的值作为成员的SHACL 列表。 形状中 sh:in 的每个值都是一个SHACL 列表。 一个形状最多只能 有一个 sh:in 值。 每个此类 列表应当至少包含一个成员。
文本定义
设 $in 为 sh:in 的一个值。 对于每个值节点, 如果它不是 $in 的成员, 则存在一个验证结果,其中该值节点作为 sh:value。

本节其余部分为非规范性内容。

请注意,字面量的匹配必须精确,例如 "04"^^xsd:byte 不匹配 "4"^^xsd:integer。

7.9.4 sh:rootClass

sh:rootClass 指定的条件是每个值节点都是 给定的类或该类的(传递)子类。

约束组件 IRI: sh:RootClassConstraintComponent

参数:
属性 摘要和语法规则
sh:rootClass 所有值节点必须属于的类层次结构的根类。 形状中 sh:rootClass 的值要么是IRI, 要么是作为良构SHACL 列表的空白节点,其中所有成员都是IRI。
文本定义
设 $rootClass 为 sh:rootClass 的一个参数值。 设 classes 为一个IRI 集合, 使得 当 $rootClass 是一个IRI 时,该集合恰好只包含该 IRI; 而当 $rootClass 是一个作为SHACL 列表的空白节点时, 该集合恰好包含 该列表的所有成员。

对于每个值节点, 如果它不是一个IRI, 或者它是一个IRI,但既不等于 classes 中的任何类, 也不是这些类在数据图中的SHACL 子类, 则存在一个验证结果,其中该值节点作为 sh:value。

本节其余部分为非规范性内容。

sh:rootClass 约束通常用于值可以为类的属性形状 (例如通过 sh:class rdfs:Class), 以限制值节点允许的子类层次结构。 给定的类作为允许的类层次结构的上界。

7.9.5 sh:uniqueValuesFor

sh:uniqueValuesFor 指定一个值节点的一个或多个指定 属性的值, 在当前形状的所有目标节点中必须唯一。

约束组件 IRI: sh:UniqueValuesForConstraintComponent

参数:
属性 摘要和语法规则
sh:uniqueValuesFor 一个 属性的IRI,或者 一个SHACL 列表,其中每个成员 都是一个属性的IRI。
文本定义
设 $uniqueValuesFor 为形状 S 中 sh:uniqueValuesFor 的一个值。 设 $properties 为按以下方式定义的集合: 如果 $uniqueValuesFor 是一个 IRI,则 $properties = { $uniqueValuesFor }。 如果 $uniqueValuesFor 是一个SHACL 列表,则 $properties 是该列表的成员集合。 设 $targetNodes 为 S 的目标节点。 即使已经直接提供了焦点节点, 这些节点仍根据 S 的目标确定, 例如,因为 S 是 sh:node 的一个值。
对于每个值节点 V,如果在 $targetNodes 中存在另一个 节点, 它在 $properties 中所有属性上的值都与 V 完全相同, 则存在一个验证结果。 如果 V 对于 $properties 中的任何属性都没有值, 则不产生结果。

本节其余部分为非规范性内容。

请注意,字面量的匹配必须精确,例如 "04"^^xsd:byte 不匹配 "4"^^xsd:integer。 另请注意,sh:uniqueValuesFor 并不要求这些值必须存在,因此 通常会 与 sh:minCount 1 约束结合使用。

请注意,目标节点的计算仅取决于形状的定义,例如 同时包含 sh:uniqueValuesFor 约束的形状上的 sh:targetClass 声明。

8. 非验证性形状 特征

本节为非规范性内容。

前面的章节介绍了表示验证条件的属性, 本节则介绍 SHACL 处理器会忽略的属性。 这些所谓的非验证性 属性 完全是可选的,不受正式解释约定的约束。 它们可用于表单构建、代码生成或以可预测的方式打印 RDF 文件等用途。

8.1 sh:name 和 sh:description

形状可以具有一个或多个 sh:name 的值, 以便为形状的定义性特征提供人类可读的名称, 即对于属性形状,指属性路径, 而对于节点形状,指其所针对的资源种类:

注

sh:name 与其他标签属性(rdfs:label、 skos:prefLabel 等)是互补的。 其他标签属性用于命名形状资源本身。 sh:name 并非用于命名形状资源,而是用于命名 上述形状的定义性特征。

sh:name 的值 是字面量,其数据类型 为 xsd:string、rdf:dirLangString 或 rdf:langString。

同样,形状也可以具有 sh:description 的值, 以便为相同的定义性特征提供人类可读的描述:

sh:description 并非用于描述形状资源,而是用于描述 形状的定义性特征。 sh:description 的值 是字面量,其数据类型 为 xsd:string、rdf:dirLangString、rdf:langString 或 rdf:HTML。

sh:name 和 sh:description 都可以具有 多个值,但每个语言标签应当只有一个值。

8.2 sh:intent

形状可以具有 sh:intent 的值,这些值应当是字面量, 其数据类型为 xsd:string、rdf:langString 或 rdf:dirLangString。

属性 sh:intent 提供与形状关联的一个或多个预期 规则、假设或约束的人类可读描述。

与可能包含一般文档或编辑性文字的 rdfs:comment 不同, 也与描述属性值含义的 sh:description 不同, sh:intent 专门用于记录表达 形状预期语义的各条类似规则的陈述。

可以提供多个 sh:intent 值,以表示不同的预期规则。 其中一些规则可能与已使用 SHACL 约束组件正式表达的约束重叠。 当某个 sh:intent 值表示的语义也已在 同一个 形状图中正式表达时,可以使用属性值 sh:formalized true 对该 sh:intent 陈述的三元组进行具体化。 然而,与所有非验证性属性一样, sh:intent 的存在与否及其内容都不会影响 SHACL 验证或符合性。

8.3 sh:agentInstruction

形状可以具有 sh:agentInstruction 的值,这些值应当 是字面量, 其数据类型为 xsd:string、 rdf:langString 或 rdf:dirLangString。

此属性可用于表示能够发送给理解自然语言的软件智能体的文本指令。

注

此属性可以与来自 rdfs:comment、 sh:description、rdfs:label、sh:name、sh:intent 以及 sh:message 的类似文本描述结合使用, 以指导软件智能体理解形状的语义。

8.4 sh:codeIdentifier

形状可以具有一个 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 生成器。

8.5 sh:codeType

形状可以具有一个 sh:codeType 的值, 以建议在 API、查询 语言 及类似程序化访问方式中表示该形状时值节点的类型。 sh:codeType 的值是一个IRI,表示一种数据类型, 例如 [rdf12-concepts] 中列出的某种 XML Schema 数据类型。

形状的约束,例如 sh:datatype、 sh:nodeKind 和 sh:class, 描述数据图中的术语, 而 sh:codeType 描述处理这些术语的代码应接收的类型。 sh:codeType 的值不需要与这些约束一致。 例如,一个属性形状可以同时声明 sh:nodeKind sh:IRI 和 sh:codeType xsd:string。 原本会根据约束推导类型的工具,如果存在 sh:codeType,就应使用其值。 sh:codeType 分别应用于每个值节点,并不指示 预期接收单个值还是值集合。

注

当约束无法表达代码所期望的类型时,需要使用 sh:codeType。 例如,保存文件位置的属性可以同时接受IRI 和 字面量, 通过 sh:nodeKind sh:IRIOrLiteral 声明,而代码在两种情况下都期望接收字符串。 声明 sh:datatype xsd:string 会使每个 IRI 值都产生验证结果, 而 sh:codeType xsd:string 不会影响验证,并指示代码接收 字符串。 sh:codeType 独立于任何特定编程语言。 给定数据类型对应哪种原生类型,以及如何将值节点转换为该类型, 由实现决定。

8.6 sh:unit

形状可以具有属性 sh:unit 的值,用于指示与值节点有关的计量单位、 货币或类似信息。 sh:unit 的值可以是字面量,其数据类型为 xsd:string、 rdf:langString 或 rdf:dirLangString,也可以是IRI。 SHACL 1.2 没有规定 sh:unit 的具体值,因为在撰写本文时 (2026 年), 尚无正式的 W3C 标准用于统一表示这些单位, 而 W3C 之外存在多种相关标准。

对于 SHACL 1.2,给出以下建议:

虽然这些语法规则有意保持灵活,但特定应用可以实施更 具体的规则; 例如,通过为 sh:unit 属性声明 sh:class qudt:Unit 约束。

基于 SHACL 的用户界面工具可以使用 sh:unit 的值来呈现数据值。 根据用户的区域设置,这些工具甚至可以自动进行单位转换, 或者允许用户使用不同于实际存储单位的单位输入数据。

注

虽然 SHACL 核心没有规定 sh:unit 的具体语义,但某些 基于 SHACL 的扩展可能将单位用于其他用途,包括验证。 例如,可以定义一个形状,对属性声明了 sh:unit "K" 的 任何字面量施加 sh:minInclusive 0 约束。

以下是上述示例的一种变体,它使用节点形状来封装 “以欧元表示的价格”的可复用定义,其中不仅包含单位,还包含 最小值等约束。

8.7 sh:order

属性形状可以具有一个属性 sh:order 的值, 以指示该属性形状在表单构建等用途中的相对顺序。 sh:order 的值是字面量,其数据类型为 xsd:decimal 或 xsd:integer。 sh:order 不用于验证。 如果属性形状具有 sh:order,建议在用户界面中按升序 排列属性形状,例如,使顺序值较小的属性 位于顺序值较大的属性 上方或前方(在从左到右书写的语言中为左侧)。

注

sh:order 提供了一种通用机制,用于指定列表中元素的相对 顺序。 虽然 sh:order 不影响 SHACL 验证,但它可以用于任何类型的 主语,并且在其他规范中可能具有更强的语义。

8.8 sh:group

属性形状可以使用属性 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。 建议使用语言标签,并在适当情况下使用方向标记,以支持 国际化并正确处理双向文本。

附录

A. SHACL 语法规则摘要

本节列举了 SHACL 的所有规范性语法规则。 本节根据本规范的其他部分自动生成,并提供了返回正文的超链接, 以便在规则的上下文不明确时查阅。 违反这些规则的节点,如果位于 形状图 中,则是 格式不正确的。 少数规则,例如有关 sh:shapesGraph 和 sh:shape 的规则,则适用于 数据 图 中的三元组。 使用 应 表述的规则是建议: 仅违反此类规则的节点并非 格式不正确,但处理器可以报告警告。 少数规则,例如有关 sh:incomplete 和 sh:incompleteURIStart 的规则,则适用于 位于 数据图 中的三元组。

语法规则标识符 语法规则文本
SHACL-list 一个 SHACL 列表,在 RDF 图 G 中,是一个 IRI 或一个 空白节点, 它要么是 rdf:nil(前提是 rdf:nil 没有 值, 对于 rdf:first 和 rdf:rest 均如此),要么恰好有一个 值, 对应于 G 中的属性 rdf:first,并且恰好有一个 值, 对应于 G 中的属性 rdf:rest,该值也是一个 SHACL 列表,位于 G 中, 并且该列表不能以自身作为属性路径 rdf:rest+ 的值,在 G 中。
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 是一个 SHACL 实例,属于 sh:NodeShape 或 sh:PropertyShape, 位于 RDF 图 G 中,并且 s 也是一个 SHACL 实例, 属于 G 中的 rdfs:Class,且 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 为以下 三元组 的集合,它们表示一个 约束,位于一个 形状 中。 一个 形状图 至多可以指定一个 值,对应于属性 sh:severity, 位于 具体化者 中,这些具体化者对应于 三元组,它们位于 T 中。
message-datatype sh:message 的值是 字面量,其 数据类型 为 xsd:string、rdf:dirLangString、rdf:langString 或 rdf:HTML。
message-reifier-maxCount 令 T 为以下 三元组 的集合,它们表示一个 约束,位于一个 形状 中。 一个 形状图 至多可以指定一个 值,对应于属性 sh:message, 位于 具体化者 中,这些具体化者对应于 三元组,它们位于 T 中。
deactivated-maxCount 形状的属性 sh:deactivated 至多可以有一个值。
deactivated-datatype sh:deactivated 的值是一个 节点表达式, 它必须以 true 或 false 作为(唯一的)输出节点。
deactivated-reifier-maxCount 一个 三元组,如果以一个 形状 作为 主语, 以一个 参数(例如 sh:minCount)作为 谓词,则至多可以有一个 具体化者 具有一个 值,对应于属性 sh:deactivated。
NodeShape-path-maxCount SHACL 实例,如果属于 sh:NodeShape,则不能具有 任何 值, 对应于属性 sh:path。
PropertyShape 一个 属性形状 是一个 形状,位于 形状图 中, 它是 主语,属于一个 三元组,该三元组以 sh:path 作为其 谓词。
path-maxCount 一个形状至多有一个 值,对应于 sh:path。
path-node 该 值,即属性形状中的 sh:path 的值,是一个 格式良好的 SHACL 属性路径。
PropertyShape-path-minCount SHACL 实例,如果属于 sh:PropertyShape,则具有一个 值, 对应于属性 sh:path。
path-values 一个 属性形状 至多有一个 值,对应于属性 sh:values,且此 值 是一个 格式良好的 节点表达式。
path-defaultValue 一个 属性形状 至多有一个 值,对应于属性 sh:defaultValue,且此 值 是一个 格式良好的 节点表达式。
path-values-iri 一个 属性形状 只有在以下条件下才能具有 值,对应于 sh:values 和/或 sh:defaultValue:它的 值,对应于 sh:path,是一个 谓词路径。
path-metarule RDF 图中的一个节点是 格式良好的 SHACL 属性 路径 p,如果它恰好满足以下 小节中的一条语法规则。
path-non-recursive 节点 p 不是一个 格式良好的 SHACL 属性路径,如果 p 是空白 节点,并且 p 的任何路径映射直接或传递性地引用 p。
path-predicate 一个 谓词路径 是一个 IRI。
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-nodeKind 每个 值,即 sh:shapesGraph 的值,都是一个 IRI
incomplete-datatype 这些 值,即 sh:incomplete 的值,都是 字面量,其数据类型为 xsd:boolean。
incompleteURIStart-datatype 这些 值,即 sh:incompleteURIStart 的值,都是 字面量,其数据类型为 xsd:boolean。
incompleteURIStart-subject 这些 主语,属于 三元组,其谓词为 sh:incompleteURIStart,都是 IRI。
class-nodeKind 形状中的 sh:class 的值要么是 IRI, 要么是 空白节点,它们是 格式良好的 SHACL 列表,其中所有 成员 都是 IRI。
datatype-maxCount 一个形状的 sh:datatype 至多有一个值。
datatype-nodeKind 形状中的 sh:datatype 的值要么是一个 IRI, 要么是一个 空白节点,它是一个 格式良好的 SHACL 列表,其中所有 成员 都是 IRI。
nodeKind-maxCount 一个形状的 sh:nodeKind 至多有一个值。
nodeKind-nodeKind 形状中的 sh:nodeKind 的值要么是一个 IRI,要么是一个 空白节点,它是一个 格式良好的 SHACL 列表,其中所有 成员 都是 IRI。
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 函数。
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 的整数。
minListLength-maxCount 一个形状的 sh:minListLength 至多有一个值。
maxListLength-datatype 形状中的 sh:maxListLength 的值是字面量,其数据类型为 xsd:integer。
maxListLength-minInclusive 形状中的 sh:maxListLength 的值是大于或等于 0 的整数。
maxListLength-maxCount 一个形状的 sh:maxListLength 至多有一个值。
uniqueMembers-datatype 形状中的 sh:uniqueMembers 的值是字面量,其数据类型为 xsd:boolean。
uniqueMembers-maxCount 一个形状的 sh:uniqueMembers 至多有一个值。
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 每个 成员,在这样的列表中,都必须是一个 格式良好的 形状。
xone-minListLength 每个这样的列表 应 至少有一个 成员。
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 每个这样的列表 应 至少有一个 成员。
rootClass-nodeKind 形状中的 sh:rootClass 的值要么是 IRI, 要么是 空白节点,它们是 格式良好的 SHACL 列表,其中所有 成员 都是 IRI。
uniqueValuesFor-node 一个 IRI,用于标识属性,或者 一个 SHACL 列表,其中每个 成员 都是一个 IRI,用于标识属性。

B. 用于验证 形状图的 SHACL 形状

本节为非规范性内容。

SHACL 1.2 概述中的SHACL-SHACL 附录 [shacl12-overview] 描述了可用于验证其他 SHACL 形状图的 SHACL 图,因此可以强制执行许多 与旨在符合各种 SHACL 规范的 RDF 数据相关的 语法约束。

SHACL-SHACL 形状图按规范分别提供,同时也以捆绑的“并集”形式提供,地址为 http://www.w3.org/ns/shacl-shacl,如 概述的附录所述。

C. SHACL 核心验证器摘要

本节列出了 SHACL 核心的所有规范性验证器。 本节由本规范的其他部分自动生成,并提供指向 正文的超链接,以便在验证器的上下文不明确时进行查阅。

按约束组件分类的验证器
sh:ClassConstraintComponent: 令 $class 为 sh:class 的一个参数值。 令 classes 为一个由 IRI 组成的集合, 使得 当 $class 是一个 IRI 时, 该集合恰好只包含该 IRI, 而当 $class 是一个空白节点形式的 SHACL 列表时, 该集合 恰好由该列表的成员组成。

对于每个值节点, 如果它是一个字面量,或者是一个非字面量且不是 SHACL 实例,即在 数据图中不属于 classes 中任何类的实例, 则存在一个验证结果,其中该值节点作为 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 有值,则匹配必须遵循 SPARQL REGEX 函数的三参数变体的定义,并将 $flags 用作 第三个参数。
sh:SingleLineConstraintComponent: 令 $singleLine 为 sh:singleLine 的一个参数值。 如果 $singleLine 为 true,那么对于每个值节点, 如果它是词法形式包含 U+000A(换行符)、U+000B(垂直制表符)、U+000C(换页符)或 U+000D (回车符)中任一字符的字面量, 则存在一个验证结果。
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 列表,则存在一个 验证结果,其中 v 作为 sh:value。 如果 SHACL 列表 v 的任何成员 m 不符合 $memberShape,则存在一个验证结果,其中 v 作为 sh:value。
sh:MinListLengthConstraintComponent: 令 $minListLength 为 sh:minListLength 的一个参数值。 每个值节点 v 都必须是一个 SHACL 列表——如果 v 不是 SHACL 列表,则存在一个 验证结果,其中 v 作为 sh:value。 如果列表 v 中的成员数量小于 $minListLength, 则存在一个验证结果,其中 v 作为 sh:value。
sh:MaxListLengthConstraintComponent: 令 $maxListLength 为 sh:maxListLength 的一个参数值。 每个值节点 v 都必须是一个 SHACL 列表——如果 v 不是 SHACL 列表,则存在一个 验证结果,其中 v 作为 sh:value。 如果列表 v 中的成员数量大于 $maxListLength, 则存在一个验证结果,其中 v 作为 sh:value。
sh:UniqueMembersConstraintComponent: 令 $uniqueMembers 为 sh:uniqueMembers 的一个参数值。 每个值节点 v 都必须是一个 SHACL 列表——如果 v 不是 SHACL 列表,则存在一个 验证结果,其中 v 作为 sh:value。 如果 $uniqueMembers 为 true,并且列表 v 存在重复 成员, 则存在一个验证结果,其中 v 作为 sh:value。
sh:EqualsConstraintComponent: 令 $equals 为 sh:equals 的一个值,令 $path 为在形状图中由 $equals 表示的SHACL 属性路径。 令 $otherNodes 为可从焦点节点经由 $path 到达的节点的集合。 对于每个值节点, 如果它不在 $otherNodes 中, 则存在一个验证结果,其中该值节点作为 sh:value。 对于 $otherNodes 中的每个节点, 如果它不属于值节点之一, 则存在一个验证结果,其中该节点作为 sh:value。
sh:DisjointConstraintComponent: 令 $disjoint 为 sh:disjoint 的一个参数值,令 $path 为在形状图中由 $disjoint 表示的SHACL 属性路径。 令 $otherNodes 为可从焦点节点经由 $path 到达的节点的集合。 对于每个同时位于 $otherNodes 中的值节点, 都存在一个验证结果,其中该值节点作为 sh:value。
sh:SubsetOfConstraintComponent: 令 $subsetOf 为 sh:subsetOf 的一个值,令 $path 为在形状图中由 $subsetOf 表示的SHACL 属性路径。 令 $otherNodes 为可从焦点节点经由 $path 到达的节点的集合。 对于每个不在 $otherNodes 中的值节点, 都存在一个验证结果,其中该值节点作为 sh:value。
sh:LessThanConstraintComponent: 令 $lessThan 为 sh:lessThan 的一个值,令 $path 为在形状图中由 $lessThan 表示的SHACL 属性路径。 令 $otherNodes 为可从焦点节点经由 $path 到达的节点的集合。 对于每一对由一个值节点和 $otherNodes 的一个成员组成的节点, 如果第一个值不小于第二个值(根据 SPARQL 的 < 运算符), 或者这两个值无法比较, 则存在一个验证结果,其中该值节点作为 sh:value。
sh:LessThanOrEqualsConstraintComponent: 令 $lessThanOrEquals 为 sh:lessThanOrEquals 的一个值, 令 $path 为在形状图中由 $lessThanOrEquals 表示的SHACL 属性路径。 令 $otherNodes 为可从焦点节点经由 $path 到达的节点的集合。 对于每一对由一个值节点和 $otherNodes 的一个成员组成的节点, 如果第一个值不小于或等于第二个值 (根据 SPARQL 的 <= 运算符), 或者这两个值无法比较, 则存在一个验证结果,其中该值节点作为 sh:value。
sh:NotConstraintComponent: 令 $not 为 sh:not 的一个值。 对于每个值节点 v: 如果对 v 进行针对形状 $not 的符合性检查产生失败, 则必须产生一个失败。 否则,如果 v 符合形状 $not, 则存在一个验证结果,其中 v 作为 sh:value。
sh:AndConstraintComponent: 令 $and 为 sh:and 的一个值。 对于每个值节点 v: 如果对 v 进行针对 $and 的任何成员的符合性检查产生失败, 则必须产生一个失败。 否则,如果 v 未能符合 $and 的每个成员, 则 存在一个验证结果,其中 v 作为 sh:value。
sh:OrConstraintComponent: 令 $or 为 sh:or 的一个值。 对于每个值节点 v: 如果对 v 进行针对 $or 的任何成员的符合性检查产生失败, 则必须产生一个失败。 否则,如果 v 不符合 $or 的任何成员, 则 存在一个验证结果,其中 v 作为 sh:value。
sh:XoneConstraintComponent: 令 $xone 为 sh:xone 的一个值。 对于每个值节点 v, 令 N 为 $xone 的成员中, v 符合的形状的数量。 如果对 v 进行针对任何成员的符合性检查产生失败, 则必须产生一个失败。 否则,如果 N 不恰好等于 1, 则存在一个验证结果,其中 v 作为 sh:value。
sh:NodeConstraintComponent: 令 $node 为 sh:node 的一个值。 对于每个值节点 v: 如果对 v 进行针对 $node 的符合性检查产生 一个失败, 则必须产生一个失败。 否则,如果 v 不符合 $node, 则存在一个验证结果,其中 v 作为 sh:value。
sh:PropertyConstraintComponent: 令 $property 为 sh:property 的一个值。 对于每个值节点 v: 如果将 v 作为焦点节点针对属性形状 $property 进行验证 产生一个失败, 则必须产生一个失败。 否则,验证结果是将 v 作为焦点节点针对属性形状 $property 进行验证的结果。
sh:SomeValueConstraintComponent: 令 $someValue 为 sh:someValue 的一个值。 如果对任何值节点进行针对 $someValue 的符合性检查产生一个失败,则必须产生一个失败,除非至少有一个值节点 符合 $someValue。 否则,如果没有任何值节点符合 $someValue, 则存在一个验证结果。
sh:QualifiedMinCountConstraintComponent: 令 $qualifiedValueShape 为 sh:qualifiedValueShape 的一个值。 令 $qualifiedMinCount 为 sh:qualifiedMinCount 的一个参数值。 令 C 为满足以下条件的值节点 v 的数量: v 符合 $qualifiedValueShape, 并且 v 不符合用于当前形状的任何兄弟形状, 即 v 所针对的验证形状,并且该形状以 $qualifiedValueShape 作为其 sh:qualifiedValueShape 的值。 如果上述任何符合性检查产生失败, 则必须产生一个失败。 否则,如果 C 小于 $qualifiedMinCount, 则存在一个验证结果。 sh:qualifiedMinCount 的约束组件是 sh:QualifiedMinCountConstraintComponent。
sh:QualifiedMaxCountConstraintComponent: 令 $qualifiedMaxCount 为 sh:qualifiedMaxCount 的一个参数值。 令 C 按照上文 sh:qualifiedMinCount 的定义确定。 如果上述任何符合性检查产生失败, 则必须产生一个失败。 否则,如果 C 大于 $qualifiedMaxCount, 则存在一个验证结果。 sh:qualifiedMaxCount 的约束组件是 sh:QualifiedMaxCountConstraintComponent。
sh:ReifierShapeConstraintComponent: 令 $reifierShape 为 sh:reifierShape 的一个值, 令 $reificationRequired 为 sh:reificationRequired 的值 (如果有), 并令 $path 为属性形状的 sh:path 的值。 对于每个值节点 v,令 t 为三元组项(焦点节点、 $path、v), 并令 t 的具化器为满足以下条件的节点 r:数据图 包含三元组 r rdf:reifies t。

对于 t 的每个具化器 r,如果将 r 作为焦点节点针对节点形状 $reifierShape 进行验证产生失败, 则必须产生一个失败。 否则,对于 t 的每个不符合 $reifierShape 的具化器 r, 都存在一个验证结果,其中 v 作为 sh:value。

如果 $reificationRequired 为 true,并且 t 没有具化器, 则存在一个验证结果,其中 v 作为 sh:value。
sh:ClosedConstraintComponent: 令 $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: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 中任何类,也不是这些类在 数据图中的SHACL 子类, 则存在一个验证结果,其中该值节点作为 sh:value。
sh:UniqueValuesForConstraintComponent: 令 $uniqueValuesFor 为形状 S 中 sh:uniqueValuesFor 的一个值。 令 $properties 为以下集合: 如果 $uniqueValuesFor 是一个 IRI,则 $properties = { $uniqueValuesFor }。 如果 $uniqueValuesFor 是一个 SHACL 列表,则 $properties 是该列表的成员的集合。 令 $targetNodes 为 S 的目标节点。 即使直接提供了焦点节点, 这些节点仍根据 S 的目标确定, 例如因为 S 是 sh:node 的一个值。
对于每个值节点 V,如果 $targetNodes 中存在另一个节点, 它对于 $properties 中的所有属性具有与 V 完全相同的值, 则 存在一个验证结果。 如果 V 对于 $properties 中的任何属性都没有值, 则不会产生结果。

D. 安全与隐私 注意事项

本节为非规范性内容。

与大多数基于 RDF 的技术一样,SHACL 处理器可能操作由 多个来源组合而成的图。某些应用程序可能采用开放的“关联数据”架构,并动态 汇集来自组织信任网络之外的来源的 RDF 三元组。 由于 RDF 允许任何人添加有关任何资源的陈述,三元组可能改变形状定义或数据图中节点 原本预期的语义,从而导致误导性结果。 为防范这种情况,可以仅使用可信且 经过验证的 RDF 来源,并消除通过 owl:imports 和 sh:shapesGraph 动态添加图的可能性。

E. 索引

E.1 本规范定义的 术语

E.2 通过引用定义的术语

F. 致谢

本节为非规范性内容。

最初的 SHACL 核心规范由 RDF 数据形状工作组制定。 请参见其致谢章节。

G. 原始 SHACL 核心 与 SHACL 1.2 核心之间的变更

本节为非规范性内容。

H. 参考文献

H.1 规范性参考文献

[BCP47]
用于标识语言的标签. Addison Phillips; Mark Davis. IETF. 2009年9月. 当前最佳实践. URL: https://www.rfc-editor.org/info/bcp47
[owl2-syntax]
OWL 2 Web 本体语言结构 规范与函数式语法(第二版). Boris Motik; Peter Patel-Schneider; Bijan Parsia. W3C. 2012年12月11日. W3C 推荐标准. URL: https://www.w3.org/TR/owl2-syntax/
[rdf12-concepts]
RDF 1.2 概念与抽象数据 模型. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 7日 2026年4月. W3C 候选推荐标准. URL: https://www.w3.org/TR/rdf12-concepts/
[RFC2119]
RFC 中用于表示 要求级别的关键词. S. Bradner. IETF. 1997年3月. 当前最佳实践. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 中大小写的歧义: 2119 关键词. B. Leiba. IETF. 2017年5月. 当前最佳实践. URL: https://www.rfc-editor.org/info/rfc8174/
[shacl-ucr]
SHACL 用例与需求. Simon Steyskal; Karen Coyle. W3C. 2017年7月20日. W3C 工作组说明. URL: https://www.w3.org/TR/shacl-ucr/
[shacl12-node-expr]
SHACL 1.2 节点表达式. Robert David; Holger Knublauch; Simon Steyskal. W3C. 2026年7月21日. W3C 工作草案. URL: https://www.w3.org/TR/shacl12-node-expr/
[shacl12-profiling]
SHACL 1.2 概要描述. Nicholas Car; Scott Henninger; Yousouf Taghzouti; Alexander Nelson; Matt Goldberg. W3C. 2026年7月2日. 首个公开工作草案. URL: https://www.w3.org/TR/shacl12-profiling/
[shacl12-sparql]
SHACL 1.2 SPARQL 相关特性. Holger Knublauch; Matt Goldberg; Scott Henninger; Livio Robaldo. W3C. 2026年10月11日. W3C 工作 草案. URL: https://www.w3.org/TR/shacl12-sparql/
[sparql12-entailment]
SPARQL 1.2 蕴涵机制. Peter Patel-Schneider. W3C. 2026年4月9日. W3C 工作草案. URL: https://www.w3.org/TR/sparql12-entailment/
[sparql12-query]
SPARQL 1.2 查询语言. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 10月11日 2026年. W3C 工作草案. URL: https://www.w3.org/TR/sparql12-query/

H.2 资料性参考文献

[json-ld]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Markus Lanthaler. W3C. 2020年11月3日. W3C 推荐标准. URL: https://www.w3.org/TR/json-ld/
[owl2-mapping-to-rdf]
OWL 2 Web 本体语言映射到 RDF 图(第二版). Peter Patel-Schneider; Boris Motik. W3C. 12月11日 2012年. W3C 推荐标准. URL: https://www.w3.org/TR/owl2-mapping-to-rdf/
[rdf12-turtle]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 2026年10月7日. W3C 工作草案. URL: https://www.w3.org/TR/rdf12-turtle/
[shacl12-core]
SHACL 1.2 核心. Holger Knublauch; Thomas Bergwinkl; Yousouf Taghzouti; Jesse Wright. W3C. 2026年10月13日. W3C 工作草案. URL: https://www.w3.org/TR/shacl12-core/
[shacl12-inference-rules]
SHACL 1.2 推理规则. Holger Knublauch; Simon Steyskal; Scott Henninger; Livio Robaldo; Matt Goldberg. W3C. 9月17日 2026年. 首个公开工作草案. URL: https://www.w3.org/TR/shacl12-inference-rules/
[shacl12-overview]
SHACL 1.2 概述. W3C. W3C 编辑草案. URL: https://w3c.github.io/data-shapes/shacl12-overview/
[shacl12-ui]
SHACL 1.2 用户界面. Thomas Bergwinkl; Edmond Chuc; Ieben Smessaert; Daniël Beeke. W3C. 2026年5月26日. 首个公开工作草案. URL: https://www.w3.org/TR/shacl12-ui/
[sparql12-rl]
SPARQL 1.2 RL. Robert David; David Habgood; Andy Seaborne; Simon Steyskal. W3C. 2026年10月12日. W3C 工作草案. URL: https://www.w3.org/TR/sparql12-rl/