Copyright © 2004-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
资源描述框架 (RDF) 是一种 用于表示 Web 中信息的通用语言。
本文档根据 XML 命名空间、 XML 信息集 [XML-INFOSET] 和 XML Base [XMLBASE],定义了一种称为 RDF/XML 的 RDF XML 语法。
RDF 1.2 XML 语法引入了三元组项, 作为第四种 RDF 项, 它可用作另一 三元组的 宾语, 从而能够对其他陈述作出陈述。 三元组项通常不会显式使用, 因为一般更倾向于使用注解构造。 RDF 1.2 XML 语法还增加了对 带方向的语言标记字符串的支持。
本节描述本文档在发布时的状态。 当前 W3C 出版物列表以及本技术报告的最新修订版本可在 W3C 标准与草案 索引中找到。
本文档是 RDF 1.2 文档套件的一部分。 本文档定义了 RDF/XML 语法, 即 RDF [RDF12-CONCEPTS] 的一种具体语法。
自 [rdf-syntax-grammar] 以来, 本文档没有实质性变更。 如有少量编辑性变更, 会在 B. RDF 1.1 与 RDF 1.2 之间的变更中详述。
本文档由 RDF & SPARQL 工作组作为 工作草案发布,并使用 推荐标准 轨道。
作为 工作草案发布并不表示 获得 W3C 及其成员的认可。
这是一份草案文档,随时可能被更新、替换或废弃。 除作为进行中的工作引用外,不宜以其他方式引用本文档。 对这一即将形成的推荐标准的未来更新可能会纳入 新特性。
本文档由一个 根据 W3C 专利 政策运作的小组制作。 W3C 维护着一份与该小组交付成果相关的 任何专利披露的公开列表; 该页面还包括 披露专利的说明。若个人实际 知晓某项专利,并认为该专利包含 必要权利要求, 则必须按照 W3C 专利政策第 6 节披露该信息。
本文档受 2025 年 8 月 18 日 W3C 流程文档约束。
本节为非规范性内容。
本文档定义了用于 RDF 图的 XML [XML11] 语法。
本文档根据 XML 信息集 [XML-INFOSET] 信息项修订了最初的 RDF/XML 语法 [RDF-SYNTAX-GRAMMAR-19990222], 从而脱离了 XML 中相当底层的细节,例如空元素的特定 形式。这使语法可以被更精确地 记录,并且从 XML 语法到 RDF 图的映射可以更清楚地展示。 到 RDF 图的映射 是通过 以 N-Triples [RDF12-N-TRIPLES] 格式发出陈述来完成的。
若要从历史 视角了解 RDF/XML 语法的更长篇介绍,请参见“RDF:理解条带化 RDF/XML 语法” [STRIPEDRDF]。
本节为非规范性内容。
本节介绍 RDF/XML 语法,描述它如何 编码 RDF 图, 并用示例加以说明。如果这种非正式描述与第 5. 语法数据模型 和第 6. RDF/XML 语法 中对语法和文法的形式化描述之间存在任何冲突, 后两节优先适用。
RDF 概念和抽象语法文档 [RDF12-CONCEPTS] 定义了 RDF 数据模型和 RDF 抽象语法。 与 RDF 语义 [RDF12-SEMANTICS] 一起,它为该抽象语法提供了形式化语义。 RDF 数据模型具有节点 和带标签的有向弧, 用来连接成对节点,并被表示为一组 RDF 三元组, 其中每个三元组包含一个 主语节点、谓词和宾语节点。 节点可以是 IRI、 字面量,或 空节点。 空节点可以被赋予一个称为 空节点标识符的文档局部标识符。 谓词是 IRI, 可以解释为两个节点之间的关系, 或解释为为某个主语节点定义一个属性值(宾语节点)。
为了在 XML 中编码图,节点和谓词必须以 XML 术语 表示——元素名、属性名、元素内容 和属性值。 RDF/XML 使用 XML QName (按 XML 命名空间 [XML-NAMES] 中的定义)来表示 IRI。 所有 QName 都有一个命名空间名称,它是一个 IRI, 以及一个简短的 本地 名称。 此外,QName 可以具有一个简短的 前缀, 也可以通过默认命名空间声明来声明并且没有前缀(但 仍具有一个 命名空间名称)
由 IRI 表示的 QName 是通过把 QName 的 本地 名称 部分附加到 QName 的 命名空间名称(IRI)部分之后来确定的。 这用于缩短所有谓词和一些节点的 IRI。 标识 主语和宾语节点的 IRI 也可以存储为 XML 属性值。 只能作为宾语节点的 RDF 字面量 会成为 XML 元素文本内容或 XML 属性值。
图可以被视为由 node, predicate arc, node, predicate arc, node, predicate arc, ... node 形式的路径组成的集合, 这些路径覆盖整个图。在 RDF/XML 中,这些路径 转换为元素内部的元素序列,并在表示节点 和谓词弧的元素之间交替。这被称为一系列 node/arc 条带。序列开头的节点会变成 最外层元素,下一个谓词弧会变成子元素, 依此类推。条带通常从 RDF/XML 文档的顶层开始,并且总是以节点开头。
以下各节给出了若干 RDF/XML 示例, 逐步构建到完整的 RDF/XML 文档。示例 7 是第一个完整的 RDF/XML 文档。
一个 RDF 图在图 1中给出, 其中节点表示为椭圆,椭圆中包含它们的 IRI(如果有的话), 所有谓词弧都用 IRI 标注, 而字符串字面量节点被写在矩形中。
如果我们沿着 图 2所示图中的一条 node, predicate arc ... , node 路径:
<https://www.w3.org/TR/rdf12-xml/>
到 <https://greggkellogg.net/> 的路径。
路径上的元素以粗体文本标记。
图 2 图的左侧对应于 node/predicate arc 条带:
https://www.w3.org/TR/rdf12-xml/ 的节点
http://example.org/terms/editor 的谓词弧
http://example.org/terms/homePage 的谓词弧
https://greggkellogg.net/ 的节点
在 RDF/XML 中,
图
2左侧由 5 个节点和谓词弧组成的序列对应于
使用五个 XML 元素,这些元素分为两类:用于图节点和
谓词弧。它们通常分别称为节点元素和
属性元素。在
示例 1所示的条带化表示中,rdf:Description 是
节点元素(用于三个节点,共使用三次),而
ex:editor 和 ex:homePage 是两个
属性元素。
<span class="hl-bold"><rdf:Description></span>
<ex:editor>
<span class="hl-bold"><rdf:Description></span>
<ex:homePage>
<rdf:Description>
</rdf:Description>
</ex:homePage>
<span class="hl-bold"></rdf:Description></span>
</ex:editor>
<span class="hl-bold"></rdf:Description></span>
图
2中的图包含一些
是 IRI
的节点(以及其他不是 IRI 的节点,称为空节点元素),可以通过在节点
元素上使用 rdf:about
属性将这些信息加入到 RDF/XML,
得到示例 2中的结果:
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
<ex:editor>
<rdf:Description>
<ex:homePage>
<rdf:Description rdf:about="https://greggkellogg.net/">
</rdf:Description>
</ex:homePage>
</rdf:Description>
</ex:editor>
</rdf:Description>
把图 1
中另外两条穿过该图的路径加入
示例 2里的 RDF/XML,
得到示例 3所示的结果
(此示例未能显示该空节点在两条路径之间
是共享的,
参见 2.11
标识空节点:rdf:nodeID):
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
<ex:editor>
<rdf:Description>
<ex:homePage>
<rdf:Description rdf:about="https://greggkellogg.net/">
</rdf:Description>
</ex:homePage>
</rdf:Description>
</ex:editor>
</rdf:Description>
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
<ex:editor>
<rdf:Description>
<ex:fullName>Gregg Kellogg</ex:fullName>
</rdf:Description>
</ex:editor>
</rdf:Description>
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
<dc:title>RDF 1.2 XML Syntax</dc:title>
</rdf:Description>
有若干缩写形式可用于使常见 用法更容易写出。特别是, RDF 图中的主语节点通常具有多个外出谓词弧。RDF/XML 在关于某个资源的节点元素具有多个属性元素时, 为相应语法提供一种缩写形式。可以通过在描述主语节点的节点 元素内部使用多个子属性元素来缩写。
以示例 3为例,有
两个节点元素可以包含多个属性元素。
具有 IRI
https://www.w3.org/TR/rdf12-xml/
的主语节点具有属性元素 ex:editor 和
dc:title,
而用于空节点的节点元素可以包含 ex:homePage
和 ex:fullName。这种缩写
得到示例 4所示的结果
(此示例确实显示只有一个空节点):
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
<ex:editor>
<rdf:Description>
<ex:homePage>
<rdf:Description rdf:about="https://greggkellogg.net/">
</rdf:Description>
</ex:homePage>
<ex:fullName>Gregg Kellogg</ex:fullName>
</rdf:Description>
</ex:editor>
<dc:title>RDF 1.2 XML Syntax</dc:title>
</rdf:Description>
当 RDF
图中的谓词弧指向一个没有
进一步谓词弧的宾语节点时,它在 RDF/XML 中表现为
一个空的节点元素
<rdf:Description rdf:about="...">
</rdf:Description>
(或 <rdf:Description rdf:about="..." />),
这种形式可以被缩短。做法是在包含它的属性元素上使用 XML 属性 rdf:resource,
其值为宾语节点的
IRI,
并使该属性元素为空。
在此示例中,属性元素 ex:homePage
包含一个空的节点元素,其 IRI
为 https://greggkellogg.net/。这可以替换为
空属性元素形式,
得到示例 5所示的结果:
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/">
<ex:editor>
<rdf:Description>
<ex:homePage rdf:resource="https://greggkellogg.net/"/>
<ex:fullName>Gregg Kellogg</ex:fullName>
</rdf:Description>
</ex:editor>
<dc:title>RDF 1.2 XML Syntax</dc:title>
</rdf:Description>
当属性元素的内容是字符串
字面量时,
可能可以将它作为 XML 属性放在包含它的
节点元素上。
只有当属性元素名称不重复
(XML 要求——XML 元素上的属性名是唯一的),
并且属性元素字符串字面量上任何作用域内的 xml:lang(如果有)都相同
(参见 2.7
语言:xml:lang)时,
才能对同一节点元素上的多个属性这样做。
这种缩写称为属性特性,
并且可应用于任何节点元素。
当属性元素是
rdf:type 且它具有一个 rdf:resource 属性时,
也可以使用这种缩写;该属性的值被解释为一个
IRI 宾语
节点。
在示例 5中:
有两个带字符串字面量内容的属性元素,
即 dc:title 和 ex:fullName
属性元素。它们可以替换为属性特性,
得到示例 6所示的结果:
<rdf:Description rdf:about="https://www.w3.org/TR/rdf12-xml/"
dc:title="RDF 1.2 XML Syntax">
<ex:editor>
<rdf:Description ex:fullName="Gregg Kellogg">
<ex:homePage rdf:resource="https://greggkellogg.net/"/>
</rdf:Description>
</ex:editor>
</rdf:Description>
为了创建完整的 RDF/XML 文档,
将图序列化为 XML 后通常包含在一个
rdf:RDF
XML 元素内部,该元素成为顶层 XML 文档
元素。
按惯例,rdf:RDF 元素
也用于声明所使用的 XML 命名空间,尽管这并非
必需。当 rdf:RDF 内部
只有一个顶层节点元素时,
可以省略
rdf:RDF,
但任何 XML 命名空间仍然必须声明。
XML 规范还允许在文档顶部使用一个 XML 声明, 其中包含 XML 版本,以及可能包含 XML 内容编码。这是可选的,但推荐使用。
可以对从 示例 4开始的任何正确 完整图示例完成 RDF/XML, 但取最小的 示例 6并添加最终组成部分, 会得到 图 1中原始图的完整 RDF/XML 表示, 如示例 7所示:
可以在上面的示例 7中省略
rdf:RDF,
因为
rdf:RDF 内部只有一个
rdf:Description,
但此处未展示这种形式。
RDF/XML 允许使用
XML 1.1 [XML11]
的
2.12 语言标识
所定义的 xml:lang
属性,以允许标识内容语言。
xml:lang 属性可用于任何节点元素或属性元素,
表示所包含的内容使用给定语言。
类型化字面量,
包括 XML 字面量,
不受此属性影响。
当前作用域内最具体的语言(如果有)
会应用于属性元素的字符串字面量内容或
属性特性值。xml:lang=""
形式
表示不存在语言标识符。
为 RDF 属性标记内容语言的一些示例如 示例 8所示:
RDF 1.2 引入了基方向的概念,
可用于指定语言标记字符串的初始文本方向,
以创建带方向的语言标记
字符串。
这是通过在任意
节点元素或属性元素上添加 its:dir 属性来指定的,
其中 its 是 ITS 命名空间
http://www.w3.org/2005/11/its 的典型前缀。
its:dir 支持的值为 "ltr" 和 "rtl",
这是带方向的语言标记
字符串所要求的。
为 RDF 属性标记基方向的一些示例如 示例 9所示:
its:dir 属性专门绑定到
[ITS20] 的
2.0 版本,如
顶层 XML 文档元素
上的 its:version="2.0" 所示。
RDF 允许将 XML 字面量 [RDF12-CONCEPTS]
作为谓词的宾语节点给出。
在 RDF/XML 中,它们写作属性元素的内容(而不是
属性特性),并通过在包含它的
属性元素上使用
rdf:parseType="Literal" 属性来指示。
写出 XML 字面量的一个示例如
示例 10所示,其中
有一个单独的 RDF 三元组,其主语节点
IRI
为 http://example.org/item01,谓词
IRI
为 http://example.org/stuff/1.0/prop(来自
ex:prop),宾语节点带有以 a:Box
开头的 XML 字面量内容。
RDF 允许将类型化字面量
作为谓词的宾语节点给出。类型化字面量由一个字面量
字符串和一个数据类型 IRI组成。
在 RDF/XML 中,它们使用
属性元素形式中的字面量字符串节点的相同语法
(而不是属性特性),但在
属性元素上额外带有
rdf:datatype="datatypeURI"
属性。
任意 IRI 都可
用作该属性值。
一个 RDF 类型化
字面量
的示例如示例 11所示,其中
有一个单独的 RDF 三元组,其主语节点
IRI
为 http://example.org/item01,谓词
IRI
为 http://example.org/stuff/1.0/size(来自
ex:size),宾语节点带有
类型化字面量
("123", http://www.w3.org/2001/XMLSchema#int),
它将被解释为
XML Schema [XMLSCHEMA11-2]
数据类型 int。
RDF 中的空节点是彼此不同的,但没有
IRI。
有时需要在 RDF/XML 的多个位置引用同一个
空节点,例如作为多个
RDF 三元组的主语和宾语。
在这种情况下,可以给空节点一个
空节点标识符,
用于在文档中标识它。
RDF/XML 中的空节点标识符的作用域限定在包含它的
XML 信息集 [XML-INFOSET]
文档信息项内。
空节点标识符
可用于节点元素以替换
rdf:about="IRI",
或用于属性元素以替换
rdf:resource="IRI",
在两种情况下都使用 rdf:nodeID="blank node identifier"。
以示例 7为例,显式地给其中的
空节点赋予一个值为 abc 的
空节点标识符,
得到示例 12所示的结果。
第二个 rdf:Description 属性元素
关涉该空节点。
空节点(而非 IRI 节点)
可以在 RDF
图中写成一种允许省略
<rdf:Description>
</rdf:Description> 对的形式。
省略是通过在包含它的属性元素上放置
rdf:parseType="Resource"
属性来完成的,
该属性会把属性元素变成一个属性兼节点元素,
它本身可以同时具有属性元素和属性
特性。
在属性兼节点元素上不允许使用属性特性和 rdf:nodeID
属性。
如果空节点
元素上的所有属性元素都具有
相同作用域内 xml:lang
值(如果存在)的字符串字面量值,并且每个此类属性元素至多出现
一次,并且至多有一个带有 IRI 宾语节点的 rdf:type 属性
元素,则这些元素可以通过移动到包含它们的属性
元素上作为属性特性来缩写,并使该属性
元素成为空元素。
取前面的示例 5,
ex:editor 属性元素包含一个
空节点元素,该元素有两个属性元素
ex:fullname 和 ex:homePage。
ex:homePage 在这里不适合,因为它
没有字符串字面量值,因此在本示例中会被
忽略。
缩写形式会移除 ex:fullName 属性元素,
并向 ex:editor 属性元素添加一个新的属性特性
ex:fullName,
其值为被删除属性元素的字符串字面量值。
空节点元素在现在为空的
ex:editor 属性元素中变为隐式。结果见
示例 14。
RDF
图中常见的是主语节点具有 rdf:type 谓词。
它们在图中通常称为类型化
节点,或在
RDF/XML 中称为类型化节点元素。RDF/XML 允许通过把
rdf:Description 节点元素名替换为
与类型关系值的
IRI
相对应的带命名空间元素,
来更简洁地表达这些三元组。当然,可以有多个 rdf:type
谓词,但只有一个可以用这种方式使用,其他谓词必须保持为
属性元素或属性
特性。
类型化节点元素在 RDF/XML 中常与
RDF
词汇表中的内建类一起使用:
rdf:Seq、rdf:Bag、rdf:Alt、
rdf:Statement、rdf:Property 和
rdf:List。
RDF/XML 允许通过两种方式在 XML
属性中进一步缩写 IRI。
XML Infoset 提供了一个基 URI 属性 xml:base,
它为解析相对 IRI 引用设置基 IRI,否则
基 IRI 就是文档的 IRI。基 IRI 适用于
所有处理 IRI 的
RDF/XML 属性,
即 rdf:about、
rdf:resource、rdf:ID
和 rdf:datatype。
节点元素上的 rdf:ID 属性
(不是在属性元素上;
在那里它有另一种含义)可以用来代替
rdf:about,并给出一个等价于
#
与 rdf:ID 属性值串联而成的相对 IRI 引用。因此,
例如如果 rdf:ID="name",它将等价于
rdf:about="#name"。rdf:ID 提供了一个额外的
检查,因为同一个 name 在
xml:base 值(或文档,如果未给出)的作用域中只能出现一次,
因此对于定义一组相对于同一 IRI 的不同、
相关术语很有用。
两种形式都要求确定一个基 IRI,可以来自作用域内的
xml:base,也可以来自 RDF/XML
文档的 URL。
示例 17展示了使用
http://example.org/here/ 的
xml:base 和
rdf:Description 节点元素上的 rdf:ID,
缩写节点 IRI
http://example.org/here/#snack。
ex:prop 谓词的宾语节点是一个
IRI,
它由 rdf:resource XML 属性值根据作用域内基 IRI
解析得到,即
IRI
http://example.org/here/fruit/apple。
RDF 有一组容器成员属性
和对应的属性元素,它们主要与
rdf:Seq、rdf:Bag 和 rdf:Alt
类的实例一起使用,这些实例可以写作类型化节点元素。列表属性是
rdf:_1、rdf:_2 等,并且可以写作
属性元素或属性
特性,如
示例 18所示。还有一个 rdf:li
特殊属性元素,它按顺序等价于
rdf:_1、rdf:_2,
详见 6.4
列表展开规则。
到容器成员属性的映射
始终按 rdf:li 特殊
属性元素在 XML 中出现的顺序完成——文档顺序
是有意义的。
与示例 18等价的 RDF/XML
若以这种形式编写,如示例 19所示。
RDF/XML 允许在
属性元素上使用
rdf:parseType="Collection"
属性,使其能够包含多个节点
元素。这些包含的节点元素给出该集合的主语
节点集合。这种语法形式对应于一组三元组,
用于连接主语节点集合;生成的具体三元组
在
6.2.20
产生式 parseTypeCollectionPropertyElt中详细描述。
集合构造始终按节点元素在 XML 文档中出现的顺序完成。
节点集合的顺序是否有意义是应用程序问题,
此处不作定义。
rdf:ID 属性可以用于属性
元素,以具象化它生成的三元组(完整细节见
6.3 具象化
规则)。
三元组的标识符应构造为一个
IRI,
它由
# 与 rdf:ID 属性值串联而成的相对 IRI 引用
针对作用域内基 IRI 解析得到。因此,例如如果
rdf:ID="triple",它将等价于由相对 IRI 引用 #triple
针对基 IRI 形成的 IRI。
每一对(rdf:ID 属性值,基 IRI)
在 RDF/XML 文档中都必须唯一,
参见constraint-id。
示例 21展示了使用 rdf:ID
来具象化由 ex:prop
属性元素生成的三元组,并给具象化三元组赋予
IRI
http://example.org/triples/#triple1。
三元组项
可以是
RDF 三元组的宾语。
三元组项在 RDF
图中可以写成一种形式,
允许一个三元组项
被写作一个资源,
用来编码单个 RDF 三元组。
这是通过在属性元素上添加
rdf:parseType="Triple" 属性来描述单个三元组项完成的,
该三元组项本身可能不会作为三元组出现在图中;参见 6.2.19
产生式 parseTypeTriplePropertyElt。
三元组项
与具象化陈述扮演类似角色,
区别在于三元组项是
RDF 1.2 抽象语法 [RDF12-CONCEPTS] 的核心部分,
而具象化陈述会发出三元组来描述
已断言图中的另一个三元组。
三元组项描述的是不一定被断言的三元组。
若要同时断言并描述一个三元组,
请参见 2.20 注解
三元组:rdf:annotation 或 rdf:annotationNodeID。
RDF 1.2 XML 语法还包括用于 注解三元组的语法, 它既通过显式标识符断言该三元组, 又使与该三元组项关联的具象化器成为 后续三元组的 主语或 宾语。 如果被显式标识,同一个具象化器随后可用作其他 三元组和/或三元组项的 主语或 宾语。
可以使用 rdf:annotation(用于 IRI 具象化器)
或 rdf:annotationNodeID(用于空节点 具象化器),
将一个具象化器作为属性
特性添加。
此具象化器也可用作其他三元组的主语,
作为一种方式,把那些三元组与由某个属性元素关联的主语、谓词和宾语组成的三元组项
相关联。
除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。除此之外,本规范中的所有内容均为规范性内容。
本文档中的关键词 MAY、MUST、REQUIRED、SHOULD 和 SHOULD NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述解释,且仅当它们以全大写形式出现时, 如此处所示。
凡未进一步限定而使用的字符串,均指 Unicode [UNICODE] 字符串; 即由 Unicode 中的码点表示的字符序列。
RDF/XML 的互联网媒体类型(以前称为 MIME 类型)是
application/rdf+xml — [RFC3870]。
建议 RDF/XML 文件在所有平台上使用 扩展名 ".rdf" (全部小写)。
RDF 1.2 中引入的特性要求在作用域内的
节点元素上使用 rdf:version 属性作出版本
声明,且该属性具有除 "1.1" 之外的已定义值。
rdf:version 的可接受值定义在
[RDF12-CONCEPTS] 的
2.1 版本标签中。
对于版本值的解析器行为除此之外未作定义,并且MAY用于
发出错误或警告信号。
application/rdf+xml 媒体类型已经在 IANA 注册为 [RFC3870]。
本节为非规范性内容。
RDF/XML 格式用于表达任意 应用数据, 其中可能包含个人身份信息(PII) 或其他可能被视为敏感的信息。 建议发布此类信息的作者仔细 考虑发布此类信息的必要性和用途, 以及数据预期被消费并可能被披露的地区所适用的法规(例如 GDPR、 CCPA、 其他法规), 尤其是访问数据是否需要授权措施。
本节为非规范性内容。
RDF 命名空间 IRI(或命名空间名称)是
http://www.w3.org/1999/02/22-rdf-syntax-ns#,
并且通常在 XML 中以 rdf 前缀使用,
尽管也可以使用其他前缀字符串。
RDF
词汇表
由此命名空间名称标识,并且仅由以下名称组成:
RDF Description ID about annotation annotationNodeID datatype li nodeID parseType resource version
Seq Bag Alt Statement Property XMLLiteral List
subject predicate object type value first rest _n
其中 n 是一个大于零且无前导零的十进制整数。
nil
任何其他名称均未定义,遇到时SHOULD生成警告, 但除此之外应正常运行。
在 RDF/XML 文档中,不允许使用 XML 命名空间, 其命名空间名称是 RDF 命名空间 IRI 与附加字符串联而成的结果。
在整个本文档中,术语 rdf:name
将用于表示 name 来自
RDF
词汇表,
并且其 IRI 是
RDF
命名空间 IRI与 name 的串联。
例如,rdf:type 具有 IRI
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
RDF 概念文档 [RDF12-CONCEPTS] 定义了四类可以充当节点 和/或谓词的 RDF 数据:
IRI 可以充当节点(主语和宾语)以及 谓词。
IRI 可以是:
rdf:ID 属性值转换而来。在 RDF/XML 中,XML QName 会被转换
为
IRI,
方法是将 XML 本地名称附加到命名空间名称(IRI)之后。
例如,如果 XML 命名空间前缀 foo 的
命名空间名称(IRI)为
http://example.org/somewhere/,那么 QName
foo:bar 将对应于 IRI
http://example.org/somewhere/bar。请注意,这会
限制可构造的
IRI,
并且同一个 IRI 可以通过多种方式给出。
rdf:ID 值会被转换为
IRI,
方法是将该属性值附加到
在作用域内基 IRI 后附加
"#" 的结果之后;该作用域内基 IRI 定义在
4.3 解析
IRI中。
字面量只能充当宾语节点。
字面量总是具有数据类型。
语言标记字符串获得
数据类型 rdf:langString。当未指定
语言标签或数据类型时,该字面量会被视为已指定数据类型
xsd:string。
空节点可以充当主语节点和宾语 节点。
空节点在 RDF 图中具有不同身份。
当图以 RDF/XML 等语法编写时,这些
空节点可能需要文档局部标识符
以及一种语法,
以保留这种区别。这些局部标识符称为
空节点标识符,
并在 RDF/XML 中用作
rdf:nodeID 属性的值,
其语法见 产生式 nodeIdAttr。
RDF/XML 中的空节点标识符的作用域限定在 XML 信息集
[XML-INFOSET]
文档信息项内。
如果未通过
rdf:nodeID 属性值显式给出空节点标识符,
则需要生成一个(使用 generated-blank-node-id,
参见 5.3.3
语法动作记法)。
这种生成的空节点标识符
MUST 不得与任何从 rdf:nodeID 属性值
得出的空节点标识符冲突。这可以通过任何能够保留图中所有
空节点不同身份的方法实现,也就是说,同一个空节点标识符
不会被赋予不同的空节点。一种可行方法是
为所有 rdf:nodeID 属性值添加一个固定前缀,
并确保任何生成的空节点标识符都不会使用该
前缀。另一种方法是将所有 rdf:nodeID 属性
值映射为新的生成空节点标识符,并在
RDF/XML 文档中对所有此类值执行该映射。
三元组项只能充当宾语节点。
三元组项描述一个三元组,该三元组可能已在图中断言,也可能未断言。
RDF/XML 支持
XML Base [XMLBASE],
后者为每个 ·root event· 和
·element event·定义了一个
·base-iri·
访问器。
相对 IRI 引用按照 [XMLBASE]
中指定的算法,
并依据 统一资源标识符(URI):通用
语法 [RFC3986] 中第 5.2 节的
基本算法,解析为
IRI。
这些规范没有指定将单独的
片段标识符(例如 #foo)或空
字符串 "" 解析为
IRI 的算法。在
RDF/XML 中,片段标识符
通过将该片段标识符附加到作用域内基 IRI 来转换为 IRI。空
字符串通过替换为作用域内基 IRI 来转换
为 IRI。
空的同文档引用 "" 会针对基 IRI 的 URI 部分进行解析;任何片段部分 都会被忽略。参见 统一资源标识符(URI)[RFC3986]。
实现说明(资料性): 当使用没有路径组件(/)的层级式基 URI 时,必须先添加路径组件,然后才能将其用作解析时的 基 IRI。
产生式 idAttr 的每一次应用 都匹配一个属性。 所匹配属性的 ·rdf-term· 访问器在单个 RDF/XML 文档中是唯一的。
名称的语法MUST匹配 rdf-id 产生式。
本文档将 RDF/XML 的语法规定为 符号字母表上的一种语法。 这些符号被称为事件, 风格类似于 XPATH 信息集映射。 事件序列通常从 XML 文档派生; 在这种情况下,它们按照下面 5.2 信息集 映射中定义的文档顺序排列。 这些事件形成的序列旨在类似于从同一个 XML 文档 通过 [SAX] XML API 产生的事件序列。 可以根据语法检查事件序列,以确定它们是否是语法上 良构的 RDF/XML。
RDF 1.2 概念与抽象语法规范
[RDF12-CONCEPTS] 定义了四类 RDF 项:
IRI、
字面量、
空
节点,以及
三元组项。
字面量由一个词法形式
和一个可选语言标签 [BCP47]
——可能包括一个基方向——
或一个数据类型 IRI组成。
在解析期间还使用额外类型 prefix,以将字符串标识符映射
到命名空间 IRI。
语法产生式可以包含在 产生式被识别时触发的动作。总体而言,这些动作定义了一种 转换,即将任何语法良构的 RDF/XML 事件 序列转换为一组三元组,方法是把匹配的产生式 映射到 RDF 项或其组成部分(例如语言 标签、字面量的词法形式)。 语法产生式会改变解析器状态并发出三元组。
这里给出的模型说明了一种从 RDF/XML 文档 创建 RDF 图 表示的方法。它不规定任何实现 方法——只要能得到同一 RDF 图的表示,任何其他方法都可以使用。
特别是:
该语法不支持非良构 XML 文档,也不支持 没有 XML 信息集 [XML-INFOSET] 的文档; 例如,不符合 XML 命名空间 [XML-NAMES] 的文档。
信息集要求支持 XML Base [XMLBASE]。 RDF/XML 使用信息项属性 [base IRI], 该属性在 4.3 解析 IRI 中讨论。
本规范要求一个 XML 信息集 [XML-INFOSET], 该信息集至少支持以下用于 RDF/XML 的信息项和 属性:
以下各项没有到数据模型事件的映射:
其他信息项和属性没有映射到 语法数据模型事件。
具有保留 XML 名称的元素信息项
(参见 可扩展标记语言(XML)
1.1(第二版) 中的 Name)
不会映射到数据模型元素事件。
这些包括所有属性 [prefix] 以 xml
开头(不区分大小写比较)的项,以及所有 [prefix] 属性
没有值且 [local name] 以
xml 开头(不区分大小写比较)的项。
所有包含在匹配 parseTypeLiteralPropertyElt 产生式的 XML 元素内部的信息项会形成 XML 字面量,并且不遵循此映射。 更多信息参见 parseTypeLiteralPropertyElt。
本节旨在满足 [XML-INFOSET] 规范中 一致性 的要求。 它规定了实现本规范所需的 信息项和属性。
以下小节中定义了九类事件。 大多数事件由信息集信息项构造(除了 IRI、 空节点、 没有显式数据类型的字面量和 类型化字面量之外)。事件 构造器的作用是创建一个具有唯一身份的新事件, 与所有其他事件不同。事件具有访问器操作, 并且大多数具有 string-value、IRI、rdf-term、literal 或 bnode 访问器,这些访问器可以是静态值 或计算值。
由 文档信息项 构造,并采用以下访问器和值。
由 元素信息项 构造,并采用以下访问器和值:
由元素信息项属性 [attributes] 的值构成, 该值是一组属性 信息项。
如果此集合包含一个属性信息项
xml:lang([namespace name] 属性的值为
"http://www.w3.org/XML/1998/namespace",
且 [local name] 属性值为 "lang"),
则它会从属性信息项集合中移除,并将
·language·
访问器设置为该属性信息项的 [normalized-value] 属性。
如果元素具有
version 访问器,
其值为 "1.2-basic"、"1.2" 或更高,
并且此集合包含一个属性信息项
its:dir([namespace name] 属性的值为
"http://www.w3.org/2005/11/its",
且 [local name] 属性值为 "dir"),
则它会从属性信息项集合中移除,并将
·direction·
访问器设置为该属性信息项的 [normalized-value] 属性,
其值MUST为 "ltr"、"rtl" 或
空字符串之一。
如果元素具有
version 访问器,
其值为 "1.2-basic"、"1.2" 或更高,
并且此集合包含一个属性信息项
its:version([namespace name] 属性的值为
"http://www.w3.org/2005/11/its",
且 [local name] 属性值为 "version"),
则它会从属性信息项集合中移除,并将
·its-version·
访问器设置为该属性信息项的 [normalized-value] 属性。
所有剩余的保留 XML 名称
(参见 可扩展
标记语言(XML)1.1(第二版) 中的 Name)
现在都会从集合中移除。
这些是集合中所有属性 [prefix]
以 xml 开头
(不区分大小写比较)的属性信息项,以及所有 [prefix]
属性没有值且 [local name] 以
xml 开头(不区分大小写比较)的属性信息项。
请注意,[base IRI] 访问器是在任何
xml:base 属性信息项被删除之前由 XML Base 计算的。
剩余的属性信息项集合随后用于 构造新的 属性事件 集合,并将其指定为此访问器的值。
"2.0"。
parseType="Triple" 属性修改。
没有访问器。标记序列中 所含元素的结束。
由 属性信息项 构造,并采用以下访问器和值:
如果存在 ·namespace-name·,
则设置为一个由
·namespace-name· 访问器
的值与
·local-name· 访问器的值
串联构造的 IRI。
否则,如果 ·local-name· 是
ID、about、
parseType、resource、type
或 version,
则设置为一个 IRI,该 IRI 由
RDF 命名空间 IRI
与 local-name 访问器的值
串联构造而成。
其他无命名空间的
·local-name· 访问器值被
禁止。
对有限集合的无命名空间名称的支持是 REQUIRED 的,旨在允许 [RDF-SYNTAX-GRAMMAR-19990222] 中规定的 RDF/XML 文档保持有效;新文档 SHOULD NOT 使用这些未限定属性,应用程序MAY 选择在文档中看到未限定形式时发出警告。
从 XML 属性构造 IRI 可能从不同的 XML 属性生成相同的
IRI。这会在匹配属性事件时导致语法歧义
(例如当 rdf:about 和 about XML 属性
同时存在时)。具有这种情况的文档是非法的。
由一个或多个连续 字符信息项的序列构造。 具有单个访问器:
用于 IRI 的事件,具有以下访问器:
这些事件通过为 ·identifier· 访问器赋值来构造。
关于 RDF 中标识符的更多信息, 请参见 4.2 标识符。
用于三元组项的事件,具有以下访问器:
这些事件通过给 rdf-term 访问器赋值来构造。
用于空节点标识符 的事件,具有以下访问器:
这些事件通过为 ·identifier· 访问器赋值来构造。
关于 RDF 中标识符的更多信息, 请参见 4.2 标识符。
RDF 1.2 中没有显式
数据类型的 RDF/XML 字面量
被视为
具有数据类型 xsd:string 的字面量的语法糖(当没有语言标签时),
或视为具有数据类型 rdf:langString 的字面量(当
存在语言标签且不存在方向时),
或视为具有数据类型 rdf:dirLangString 的字面量
(当语言标签和方向都存在时)。
本小节中定义的到 N-Triples 的映射
不受此变更影响。
用于没有显式数据类型的字面量的事件,可以具有以下访问器:
该值是一个由其他访问器按如下方式构造的 RDF 字面量。
如果 ·literal-language· 是空
字符串,
则该值是一个 RDF 字面量,其
词法形式取自
·literal-value· 访问器的值,
且数据类型 IRI 为 xsd:string。
否则,如果 ·literal-direction· 是空 字符串, 则该值是一个语言标记字符串,其 词法形式取自 ·literal-value· 访问器的值, 并且语言标签取自 ·literal-language· 访问器的值。
否则,该值是一个带方向的 语言标记字符串, 其 词法形式取自 ·literal-value· 访问器的值, 语言标签取自 ·literal-language· 访问器的值, 而基方向 取自 ·literal-direction· 访问器的值。
这些事件通过为 ·literal-value·、 ·literal-language· 和 ·literal-direction· 访问器赋值来构造。
互操作性说明(资料性): 允许以 Unicode 组合字符开头的字面量, 但它们可能导致互操作性问题。 更多信息参见 [CHARMOD]。
用于类型化字面量的事件,可以具有以下访问器:
该值是一个 RDF 字面量,其 词法形式取自 ·literal-value· 访问器的值, 且数据类型 IRI 取自 ·literal-datatype· 访问器的值。
这些事件通过为 ·literal-value· 和 ·literal-datatype· 访问器赋值来构造。
互操作性说明(资料性): 允许以 Unicode 组合字符开头的字面量, 但它们可能导致互操作性问题。 更多信息参见 [CHARMOD]。
实现说明(资料性): 在 XML Schema(第 1 部分)[XMLSCHEMA11-2] 中, 空白规范化 会在验证期间根据 whiteSpace facet 的值发生。本文档使用的语法映射发生在此之后, 因此 whiteSpace facet 在形式上不再具有进一步作用。
为了按文档顺序将信息集转换为事件序列, 每个信息项会按照上述方式转换,以生成 一棵带有访问器和值的事件树。随后每个元素事件会 按如下描述进行替换,以将事件树 转换为文档顺序中的序列。
以下记法用于描述如何匹配 5. 语法数据模型 中给出的数据模型事件序列, 以及对匹配执行的动作。 RDF/XML 语法以从这些匹配的 数据模型事件到三元组的映射来定义,使用如下形式的记法:
number event-type event-content
action...
Triple(s)
其中 event-content 是一个匹配 event-types(如 5.1 事件中定义)的表达式, 使用以下章节给出的记法。 数字用于引用目的。 语法action可能包括向图生成 新三元组。
以下章节描述所使用的通用记法,以及 事件匹配和动作的记法。
| 记法 | 含义 |
|---|---|
| event.accessor | 事件访问器的值。 |
rdf:X |
如 4.1 RDF 命名空间和词汇表中定义的 URI。 |
| "ABC" | 字符 A、B、C 按顺序组成的字符串。 |
| 记法 | 含义 |
|---|---|
| A == B | 事件访问器 A 匹配表达式 B。 |
| A != B | A 不等于 B。 |
| A | B | ... | A、B、... 项是备选项。 |
| A - B | A 中的项,但排除 B 中的所有项。 |
| anyURI. | 任意 URI。 |
| anyString. | 任意字符串。 |
| list(item1, item2, ...); list() | 有序事件列表。空列表。 |
| set(item1, item2, ...); set() | 无序事件集合。空集合。 |
| * | 前一项出现零次或多次。 |
| ? | 前一项出现零次或一次。 |
| + | 前一项出现一次或多次。 |
| root(acc1 == value1, acc2 == value2, ...) |
匹配一个带有访问器的根事件。 |
| start-element(acc1 == value1, acc2 == value2, ...) children end-element() |
匹配由一个带有访问器的 元素事件、 一个作为元素内容的可能为空的事件列表,以及一个 结束元素事件组成的序列。 |
| attribute(acc1 == value1, acc2 == value2, ...) |
匹配一个带有访问器的属性事件。 |
| text() | 匹配一个文本事件。 |
| 记法 | 含义 |
|---|---|
| A := B | 将值 B 赋给 A。 |
| concat(A, B, ..) | 按顺序串联各项而创建的字符串。 |
| resolve(e, s) | 通过将 s 解释为相对于 e 的 ·base-iri· 访问器的相对 IRI 引用而创建的 IRI, 如 4.3 解析 IRI中所定义。 |
| generated-blank-node-id() | 新的不同生成 空节点标识符 的字符串值,如 4.2 标识符中所定义。 |
| event.accessor := value | 将事件访问器设置为给定值。 |
| iri(identifier := value) | 创建新的 IRI 事件。 |
| bnodeid(identifier := value) | 创建新的空节点标识符事件。 另请参见 4.2 标识符一节。 |
| literal(literal-value := string, literal-language := language, literal-direction := direction, ...) |
创建新的无数据类型字面量事件。 |
| string(iri) | IRI 的 字符串值。 |
| typed-literal(literal-value := string, ...) | 创建新的类型化字面量事件。 |
| triple(s, p, o) | 创建新的三元组项事件, 由 s、p 和 o 组成。 |
如果 RDF/XML 是一个独立 XML 文档
(通过呈现为一个
application/rdf+xml RDF 媒体类型对象
或通过其他方式标识),那么语法可以从
产生式 doc 或
产生式 nodeElement 开始。
如果上下文已知内容是 RDF/XML, 例如当 RDF/XML 嵌入在其他 XML 内容中时, 那么语法可以从 元素事件 RDF 开始 (仅当在 XML 中该位置允许元素时), 或从产生式 nodeElementList 开始 (仅当允许元素内容时,因为这是一个元素列表)。 对于这种嵌入式 RDF/XML, 最外层元素上的 ·base-iri· 值MUST从包含它的 XML 初始化,因为没有 根事件 可用。 请注意,如果发生这种嵌入,语法可能被进入 多次,但不期望保留任何状态。
为嵌入式 RDF/XML 添加测试。
起始节点被称为顶层 XML 文档元素。
rdf:RDF |
rdf:ID | rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype |
rdf:version
来自 RDF 词汇表中语法术语的一个子集, 见 4.1 RDF 命名空间和词汇表, 它们用于 RDF/XML。
coreSyntaxTerms | rdf:Description |
rdf:li
来自 RDF 词汇表的所有语法术语, 见 4.1 RDF 命名空间和词汇表, 它们用于 RDF/XML。
rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID
这些是 RDF 词汇表中 已从语言中撤回的名称。更多信息参见 议题 rdfms-aboutEach-on-object、 议题 rdfms-abouteachprefix 以及 最后征求意见议题 timbl-01 的决议。
anyURI - ( coreSyntaxTerms | rdf:li | oldTerms )
允许在节点元素上使用的 IRI。
anyURI - ( coreSyntaxTerms | rdf:Description | oldTerms )
允许在属性元素上使用的 URI。
anyURI - ( coreSyntaxTerms | rdf:Description |
rdf:li | oldTerms )
root(document-element == RDF,
children == list(RDF))
start-element(IRI ==
rdf:RDF,
attributes == set())
nodeElementList
end-element()
ws* (nodeElement ws* )*
start-element(IRI == nodeElementIRIs
attributes == set(idAttr | nodeIdAttr | aboutAttr )?, propertyAttr*)
propertyEltList
end-element()
对于节点元素 e,某些属性的处理 必须在其他工作之前完成,例如处理子事件 或其他属性。这些属性可以按任意顺序处理:
rdf:ID,则
e.subject := iri(identifier := resolve(e, concat("#",
a.string-value)))。
rdf:nodeID,则
e.subject := bnodeid(identifier:=a.string-value)。
rdf:about,则
e.subject := iri(identifier := e.rdf-term)。
如果 e.subject 为空, 则 e.subject := bnodeid(identifier := generated-blank-node-id())。
随后可按任意顺序执行以下操作:
rdf:Description,
则将以下陈述添加到 e.parent.graph:
rdf:type,
则
u:=iri(identifier:=e.rdf-term),
并且以下三元组是 e.parent.graph:
rdf:type),
Unicode 字符串
a.string-value
SHOULD 采用规范化形式 C [NFC],
o := literal(literal-value :=
a.string-value, literal-language := e.language, literal-direction := e.direction),
并将以下陈述添加到 e.parent.graph:
ws* (propertyElt ws* ) *
如果元素 e 具有
e.IRI =
rdf:li,则对元素 e.parent 应用
6.4 列表
展开规则中的列表展开规则,
得到一个新的 IRI u,并令
e.IRI := u。
此产生式的动作MUST在任何子匹配(resourcePropertyElt ... emptyPropertyElt)的动作之前完成。 或者,结果MUST等同于好像此动作 先执行一样,例如作为所有子匹配的第一个 动作执行。
start-element(IRI == propertyElementURIs ),
attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?)
ws* nodeElement ws*
end-element()
对于元素 e 和唯一包含的 nodeElement n,首先 n MUST 使用产生式 nodeElement 进行处理。 然后将以下陈述添加到 e.parent.graph:
如果给出了 rdf:ID 属性 a,则上述
陈述会用
i := iri(identifier := resolve(e,
concat("#", a.string-value)))
进行具象化,使用
6.3 具象化
规则,
并且 e.subject := i
如果给出了 rdf:annotation 或 rdf:annotationNodeID 属性 a
之一,
则上述陈述用于创建一个三元组项 t,
并将以下陈述添加到 e.parent.graph:
start-element(IRI == propertyElementURIs ),
attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, datatypeAttr?))
text()
end-element()
请注意,空字面量情况在产生式 emptyPropertyElt 中定义。
对于元素 e 和文本事件 t。
Unicode 字符串 t.string-value SHOULD
采用规范化形式 C [NFC]。
如果给出了 rdf:datatype 属性 d,
则 o := typed-literal(literal-value
:= t.string-value, literal-datatype := d.rdf-term);
否则
o := literal(literal-value := t.string-value, literal-language := e.language, literal-direction := e.direction),
并将以下陈述添加到 e.parent.graph:
如果给出了 rdf:ID 属性 a,则上述
陈述会用
i := iri(identifier := resolve(e,
concat("#", a.string-value)))
进行具象化,使用
6.3 具象化
规则,
并且 e.subject := i。
如果给出了 rdf:annotation 或 rdf:annotationNodeID 属性 a
之一,
则上述陈述用于创建一个三元组项 t,
并将以下陈述添加到 e.parent.graph:
本节为非规范性内容。
start-element(IRI == propertyElementURIs ),
attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseLiteral))
literal
end-element()
对于元素 e 和作为 rdf:parseType="Literal"
内容的字面量 lit。
lit 不会由语法数据模型映射转换为事件
(如 5.
语法数据模型中所述),
而是保持为 XML 信息项的 XML 信息集。
lit 通过以下算法转换为 XML 字面量 在 RDF 图 x 中的词法形式(Unicode 字符串)。 这并不规定任何实现 方法——任何给出相同结果的其他方法都可以使用。
然后 o := typed-literal(literal-value :=
x, literal-datatype :=
http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral ),
并将以下陈述添加到 e.parent.graph:
如果给出了 rdf:ID 属性 a,则上述
陈述会用
i := iri(identifier := resolve(e,
concat("#", a.string-value)))
进行具象化,使用
6.3 具象化
规则,
并且 e.subject := i。
如果给出了 rdf:annotation 或 rdf:annotationNodeID 属性 a
之一,
则上述陈述用于创建一个三元组项 t,
并将以下陈述添加到 e.parent.graph:
start-element(IRI == propertyElementURIs ),
attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseResource))
propertyEltList
end-element()
对于元素 e,其元素内容 c 可能为空。
n := bnodeid(identifier := generated-blank-node-id()).
如果给出了 rdf:ID 属性 a,则
上述陈述会用
i := iri(identifier := resolve(e,
concat("#", a.string-value)))
进行具象化,使用
6.3 具象化
规则,
并且 e.subject := i。
如果给出了 rdf:annotation 或 rdf:annotationNodeID 属性 a
之一,
则上述陈述用于创建一个三元组项 t,
并将以下陈述添加到 e.parent.graph:
如果元素内容 c 非空,则使用事件 n 创建一个新的事件序列,如下所示:
start-element(IRI := rdf:Description,
subject := n,
attributes := set())
c
end-element()
然后 使用产生式 nodeElement 处理所得序列。
start-element(IRI == propertyElementURIs ),
attributes == set(parseTriple))
propertyEltList
end-element()
对于元素 e,其元素内容为 c。
创建一个新的事件序列,如下所示:
start-element(IRI := nodeElementIRIs,
attributes := set())
graph := 一个新的 RDF 图)
c
end-element()
然后使用产生式 nodeElement 处理所得序列。
处理节点序列后, e.parent.graph MUST 是一个包含单个三元组的 RDF 图。
e.subject := triple(s, p, o),其中 s、p 和 o 是 e.parent.graph 中唯一三元组的 主语、 谓词和 宾语。
start-element(IRI == propertyElementURIs ),
attributes == set(idAttr?, parseCollection))
nodeElementList
end-element()
对于元素事件 e,其 nodeElementList nel 可能为空。设置 s:=list()。
对于 nel 中的每个元素事件 f, n := bnodeid(identifier := generated-blank-node-id()),并将 n 附加到 s,以得到事件序列。
如果 s 非空,n 是 s 中第一个事件标识符,并将以下陈述添加到 e.parent.graph:
如果给出了 rdf:ID 属性 a,
则上述任一陈述会用
i := iri(identifier := resolve(e,
concat("#", a.string-value)))
进行具象化,使用
6.3 具象化
规则。
如果给出了 rdf:annotation 或 rdf:annotationNodeID 属性 a
之一,
则上述陈述用于创建一个三元组项 t,
并将以下陈述添加到 e.parent.graph:
如果 s 为空,则不执行进一步工作。
对于 s 中的每个事件 n 以及 nel 中对应的元素事件 f,将以下 陈述添加到 e.parent.graph:
对于 s 中每一对连续且重叠的事件 (n, o),将以下陈述 添加到 e.parent.graph:
如果 s 非空,n 是 s 中最后一个事件标识符,则将以下陈述添加到 e.parent.graph:
n.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
start-element(IRI == propertyElementURIs ),
attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseOther))
propertyEltList
end-element()
除字符串
"Resource"、"Literal"、"Collection" 或 "Triple"
之外的所有 rdf:parseType 属性值,
都会被视为其值为 "Literal"。
此产生式进行匹配,并按产生式
parseTypeLiteralPropertyElt
已匹配的方式执行。
对于其他 rdf:parseType 值,不会生成额外三元组。
start-element(IRI == propertyElementURIs ),
attributes == set(idAttr?, (annotationAttr | annotationNodeIDAttr)?, ( resourceAttr | nodeIdAttr | datatypeAttr )?, propertyAttr*))
end-element()
如果没有属性,或只有可选的
rdf:ID 属性 i,
或可选属性 rdf:annotation 或 rdf:annotationNodeID
a,
则 o := literal(literal-value:="",
literal-language := e.language,
literal-direction := e.direction),
并将以下陈述添加到 e.parent.graph:
然后如果给出了 i,则上述陈述会用 iri(identifier := resolve(e, concat("#", i.string-value))) 进行具象化,使用 6.3 具象化规则。
否则
rdf:resource 属性 i,则
r := iri(identifier :=
i.rdf-term)
rdf:nodeID 属性 i,则
r := bnodeid(identifier :=
i.string-value)
以下操作按任意顺序执行:
对于所有 propertyAttr 属性 a(以任意顺序)
如果 a.IRI ==
rdf:type,
则 u:=iri(identifier:=i.rdf-term),
并将以下三元组添加到 e.parent.graph:
否则 Unicode 字符串 a.string-value SHOULD 采用规范化形式 C [NFC], o := literal(literal-value := a.string-value, literal-language := e.language, literal-direction := e.direction), 并将以下陈述添加到 e.parent.graph:
将以下陈述添加到图:
然后如果给出了 rdf:ID 属性 i,则上述陈述会用
iri(identifier := resolve(e,
concat("#", i.rdf-term)))
进行具象化,使用
6.3
具象化规则。
然后如果给出了 rdf:annotation 或
rdf:annotationNodeID 属性 a 之一,
则上述陈述用于创建一个三元组项 t,
并将以下陈述添加到 e.parent.graph:
attribute(IRI == rdf:ID,
string-value == rdf-id)
约束::constraint-id
适用于 rdf:ID 属性的值
attribute(IRI == rdf:nodeID,
string-value == rdf-id)
attribute(IRI == rdf:about,
string-value ==
string(IRI))
attribute(IRI == rdf:annotation,
string-value ==
string(IRI))
除非
rdf:version
为 "1.2" 或更高,否则此产生式MAY被忽略。
除非
rdf:version
为 "1.2" 或更高,否则此产生式MAY被忽略。
attribute(IRI == propertyAttributeIRIs,
string-value == anyString)
attribute(IRI == rdf:resource,
string-value ==
string(IRI))
attribute(IRI == rdf:datatype,
string-value ==
string(IRI))
attribute(IRI == rdf:parseType,
string-value ==
"Literal")
attribute(IRI == rdf:parseType,
string-value ==
"Resource")
attribute(IRI == rdf:parseType,
string-value ==
"Triple")
attribute(IRI == rdf:parseType,
string-value ==
"Collection")
attribute(IRI == rdf:parseType,
string-value == anyString - ("Resource" | "Literal" |
"Collection") )
一个 IRI。
根据 XML 定义 Content of Elements 规则 [43] content 允许的任何 XML 元素内容。 位于 3.1 开始标签、 结束标签和空元素标签一节
所得事件的 string-value 在 6.2.17 产生式 parseTypeLiteralPropertyElt中讨论。
一个属性 ·string-value·, 匹配任意合法的 [XML-NAMES] 标记 NCName
对于给定的 IRI 事件 r 和 具有项 s、p 和 o 的陈述, 它对应于以下 N-Triples:
s p o .
将以下陈述添加到图:
r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#subject> s .
r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate> p .
r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#object> o .
r.rdf-term <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Statement> .
对于给定元素 e,创建一个新的 IRI u := concat("http://www.w3.org/1999/02/22-rdf-syntax-ns#_", e.li-counter), 将 e.li-counter 属性加 1,并返回 u。
有些 RDF 图 如 [RDF12-CONCEPTS] 中定义,不能 序列化为 RDF/XML。这些图:
实现说明(资料性): 当一个 RDF 图被序列化为 RDF/XML 并具有 XML Schema 数据类型(XSD)时,它SHOULD写成不需要 空白处理的形式。RDF 或 RDF/XML 不要求支持 XSD, 因此这是可选的。
本节为非规范性内容。
存在一种标准化方法,用于将 RDF 兼容的 元数据与 SVG 关联起来——即专为此目的显式 设计的 metadata 元素,其定义见 第 21 节 元数据 ,位于 可缩放矢量图形 (SVG) 1.0 规范 [SVG10] 和 可缩放矢量图形 (SVG) 1.1(第二版) [SVG11]。
本节为非规范性内容。
本节为非规范性内容。
本文档是 RDF Core 工作组长期审议的成果,其成员包括:Art Barstow (W3C) Dave Beckett (ILRT), Dan Brickley (W3C/ILRT), Dan Connolly (W3C), Jeremy Carroll (Hewlett Packard), Ron Daniel (Interwoven Inc), Bill dehOra (InterX), Jos De Roo (AGFA), Jan Grant (ILRT), Graham Klyne (Clearswift and Nine by Nine), Frank Manola (MITRE Corporation), Brian McBride (Hewlett Packard), Eric Miller (W3C), Stephen Petschulat (IBM), Patrick Stickler (Nokia), Aaron Swartz (HWG), Mike Dean (BBN Technologies / Verizon), R. V. Guha (Alpiri Inc), Pat Hayes (IHMC), Sergey Melnik (Stanford University), Martyn Horner (Profium Ltd)。
本规范还借鉴了早期的 RDF Model and Syntax 文档,该文档由 Ora Lassilla 和 Ralph Swick 编辑,以及由 Dan Brickley 和 R. V. Guha 编辑的 RDF Schema。 为这项早期工作作出贡献的 RDF 和 RDF Schema 工作 组成员包括: Nick Arnett (Verity), Tim Berners-Lee (W3C), Tim Bray (Textuality), Dan Brickley (ILRT / University of Bristol), Walter Chang (Adobe), Sailesh Chutani (Oracle), Dan Connolly (W3C), Ron Daniel (DATAFUSION), Charles Frankston (Microsoft), Patrick Gannon (CommerceNet), RV Guha (Epinions, previously of Netscape Communications), Tom Hill (Apple Computer), Arthur van Hoff (Marimba), Renato Iannella (DSTC), Sandeep Jain (Oracle), Kevin Jones, (InterMind), Emiko Kezuka (Digital Vision Laboratories), Joe Lapp (webMethods Inc.), Ora Lassila (Nokia Research Center), Andrew Layman (Microsoft), Ralph LeVan (OCLC), John McCarthy (Lawrence Berkeley National Laboratory), Chris McConnell (Microsoft), Murray Maloney (Grif), Michael Mealling (Network Solutions), Norbert Mikula (DataChannel), Eric Miller (OCLC), Jim Miller (W3C, emeritus), Frank Olken (Lawrence Berkeley National Laboratory), Jean Paoli (Microsoft), Sri Raghavan (Digital/Compaq), Lisa Rein (webMethods Inc.), Paul Resnick (University of Michigan), Bill Roberts (KnowledgeCite), Tsuyoshi Sakata (Digital Vision Laboratories), Bob Schloss (IBM), Leon Shklar (Pencom Web Works), David Singer (IBM), Wei (William) Song (SISU), Neel Sundaresan (IBM), Ralph Swick (W3C), Naohiko Uramoto (IBM), Charles Wicksteed (Reuters Ltd.), Misha Wolf (Reuters Ltd.), Lauren Wood (SoftQuad)。
本节为非规范性内容。
Gavin Carothers 为 产生式 parseTypeLiteralPropertyElt 提供了 RDF 1.1 更新。Ivan Herman 提供了宝贵 意见并重做了图 1 和图 2。
本规范是 RDFcore 工作组以及 RDF 和 RDF Schema 工作组成员长期审议的成果。
以下人员为本文档作出了宝贵贡献:
本节为非规范性内容。
除编辑之外,以下人员也为本规范作出了贡献: Andy Seaborne, Denis Ah-Kang, Dominik Tomaszuk, Gregory Todd Williams, John Walker, Niklas Lindström, Peter F. Patel-Schneider, Pierre-Antoine Champin, Ted Thibodeau Jr, and Thomas Tanon
RDF & SPARQL 工作组的成员
包括
James Anderson, Dörthe Arndt, Jerven Bolleman, Erich Bremer, Pierre-Antoine Champin, Souripriya Das,
Enrico Franconi, Adrian Gschwend, Olaf Hartig, Gregg Kellogg†, Ora Lassila, Niklas Lindström, Thomas
Lörtsch, Peter Patel-Schneider, Dave Raggett, Felix Sasaki, Andy Seaborne, Ruben Taelman, Thomas
Pellissier Tanon, Ted Thibodeau Jr, Dominik Tomaszuk, Gregory Williams, William Van Woensel, and Antoine
Zimmermann
† Gregg Kellogg 于 2025 年 9 月去世。谨此感谢他对 RDF
以及相关标准更广泛生态系统作出的巨大贡献。
是否鸣谢任务组成员?贡献者列表并不容易找到。
本节为非规范性内容。
rdf:HTML 数据类型不能序列化为 RDF/XML 的陈述。
its:dir 和 rdf:version。
rdf:parseType="Triple"、
6.2.19 产生式
parseTypeTriplePropertyElt 和
6.2.33 产生式 parseTriple,以
支持三元组项。
rdf:annotation 或 rdf:annotationNodeID,以及
为三元组项创建具象化器的规则,允许它们
用作其他三元组的主语或宾语。本节为非规范性内容。
本附录包含用于验证 RDF/XML 形式的 XML 模式。 这些是仅供参考的示例模式,并非 本规范的一部分。
本节为非规范性内容。
这是一个用于 RDF/XML 的 RELAX NG Compact 中的示例 模式(为便于阅读)。 应用程序也可以使用 RELAX NG XML 版本。 这些格式在 信息 技术——文档模式定义语言(DSDL)——第 2 部分:基于正则语法的 验证——RELAX NG [RELAXNG-SCHEMA] 中描述。
RNGC 模式已更新,以尝试匹配该语法,但 这尚未经过检查,也未用于验证 RDF/XML。
#
# RDF/XML 语法的 RELAX NG Compact Schema
#
# 此模式仅供参考,且为非规范性内容
#
# 它基于 James Clark 最初编写的一个模式,见
# https://lists.w3.org/Archives/Public/www-rdf-comments/2001JulSep/0248.html
# 并随后根据后续变更进行了更新。
#
namespace local = ""
namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
namespace its = "http://www.w3.org/2005/11/its"
start = doc
# 我似乎无法在 RNGC 中做到这一点,因此它们以内联方式展开
# coreSyntaxTerms = rdf:RDF | rdf:ID | rdf:annotation | rdf:annotationNodeID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype | rdf:version
# syntaxTerms = coreSyntaxTerms | rdf:Description | rdf:li
# oldTerms = rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID
# nodeElementIRIs = * - ( coreSyntaxTerms | rdf:li | oldTerms )
# propertyElementURIs = * - ( coreSyntaxTerms | rdf:Description | oldTerms )
# propertyAttributeIRIs = * - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms )
# 还需要允许所有属性元素产生式上出现 rdf:li
# 因为我们无法在 relaxng 中捕获 rdf:li 到 rdf_<n> 的重写
# 需要显式添加这些
xmllang = attribute xml:lang { text }
xmlbase = attribute xml:base { text }
# 并禁止其他所有 xml:* 属性和元素
doc =
RDF | nodeElement
RDF =
element rdf:RDF {
xmllang?, xmlbase?, nodeElementList
}
nodeElementList =
nodeElement*
# 应类似于:
# ws* , ( nodeElement , ws* )*
# 但 RELAXNG 默认会这样做,忽略分隔标签的空白。
nodeElement =
element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:li |
rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID ) {
(idAttr | nodeIdAttr | aboutAttr )?, xmllang?, xmlbase?, propertyAttr*, propertyEltList
}
# 不可能在 RELAX NG 中表达“且不是
# rdf: 命名空间中以下划线开头的项”。
ws =
" "
# 在此 RELAX NG 模式中未使用;但应是以下位置定义的任意合法 XML
# 空白:https://www.w3.org/TR/2000/REC-xml-20001006#NT-S
propertyEltList =
propertyElt*
# 应类似于:
# ws* , ( propertyElt , ws* )*
# 但 RELAXNG 默认会这样做,忽略分隔标签的空白。
propertyElt =
resourcePropertyElt |
literalPropertyElt |
parseTypeLiteralPropertyElt |
parseTypeResourcePropertyElt |
parseTypeTriplePropertyElt |
parseTypeCollectionPropertyElt |
parseTypeOtherPropertyElt |
emptyPropertyElt
resourcePropertyElt =
element * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr?, (annotationAttr | annotationNodeIDAttr)?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, nodeElement
}
literalPropertyElt =
element * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr? , (annotationAttr | annotationNodeIDAttr)?, datatypeAttr?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, text
}
parseTypeLiteralPropertyElt =
element * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseLiteral, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, literal
}
parseTypeResourcePropertyElt =
element * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseResource, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, propertyEltList
}
parseTypeTriplePropertyElt =
element * - ( local:* | rdf:RDF | rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr?, (annotationAttr | annotationNodeIDAttr)?, parseResource, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, propertyEltList
}
parseTypeCollectionPropertyElt =
element * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr?, (annotationAttr | annotationNodeIDAttr)?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, parseCollection, nodeElementList
}
parseTypeOtherPropertyElt =
element * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr?, (annotationAttr | annotationNodeIDAttr)?, xmllang?, xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, parseOther, any
}
emptyPropertyElt =
element * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
its:dir | its:version |
rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
idAttr?, (resourceAttr | nodeIdAttr | datatypeAttr )?, xmllang?,
xmlbase?, versionAttr?, dirAttr?, itsVersionAttr?, propertyAttr*
}
idAttr =
attribute rdf:ID {
IDsymbol
}
nodeIdAttr =
attribute rdf:nodeID {
IDsymbol
}
aboutAttr =
attribute rdf:about {
IRI
}
propertyAttr =
attribute * - ( local:* | rdf:RDF | rdf:ID |
rdf:annotation | rdf:annotationNodeID |
rdf:about | rdf:parseType |
rdf:resource | rdf:nodeID | rdf:datatype | rdf:version |
rdf:li | its:dir | | its:version
rdf:Description | rdf:aboutEach |
rdf:aboutEachPrefix | rdf:bagID |
xml:* ) {
string
}
resourceAttr =
attribute rdf:resource {
IRI
}
datatypeAttr =
attribute rdf:datatype {
IRI
}
parseLiteral =
attribute rdf:parseType {
"Literal"
}
parseResource =
attribute rdf:parseType {
"Resource"
}
parseTriple =
attribute rdf:parseType {
"Triple"
}
parseCollection =
attribute rdf:parseType {
"Collection"
}
parseOther =
attribute rdf:parseType {
text
}
versionAttr =
attribute rdf:version {
text
}
dirAttr =
attribute its:dir {
text
}
itsVersionAttr =
attribute its:version {
text
}
IRI =
string
literal =
any
IDsymbol =
xsd:NMTOKEN
any =
mixed { element * { attribute * { text }*, any }* }
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: