RDF 1.2 Turtle

简洁 RDF 三元组语言

W3C 工作草案

关于本文档的更多详细信息
本版本:
https://www.w3.org/TR/2026/WD-rdf12-turtle-20260612/
最新发布版本:
https://www.w3.org/TR/rdf12-turtle/
最新编辑草案:
https://w3c.github.io/rdf-turtle/spec/
历史:
https://www.w3.org/standards/history/rdf12-turtle/
提交历史
测试套件:
https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-turtle/
最新推荐标准:
https://www.w3.org/TR/turtle
编辑:
Gregg Kellogg(至 2025-09-06),谨此 纪念
Andy Seaborne
Dominik Tomaszuk
前编辑:
Eric Prud'hommeaux (RDF 1.1)
Gavin Carothers (RDF 1.1)
作者:
David Beckett
Tim Berners-Lee (W3C)
Eric Prud'hommeaux (W3C)
Gavin Carothers (Lex Machina, Inc)
反馈:
GitHub w3c/rdf-turtle拉取请求新建议题开放议题
public-rdf-star-wg@w3.org 主题行为 [rdf12-turtle] … 消息主题 …归档

摘要

资源描述框架 (RDF) 是一种 用于在 Web 中表示信息的通用语言。

本文档定义了一种用于 RDF 的文本语法,称为 Turtle, 它允许将一个 RDF以 紧凑且 自然的文本形式完整写出,并为常见使用模式和 数据类型提供缩写。Turtle 提供了与 N-Triples [RDF12-N-TRIPLES] 格式以及 SPARQL 1.2 查询 语言 W3C 推荐标准的三元组模式语法的兼容层级。

RDF 1.2 Turtle 引入了 三元组 项 作为第四种 RDF, 它可以用作另一个 三元组对象, 从而可以对其他语句作出陈述。 三元组 项通常不会被显式使用, 因为一般更推荐使用 reifiedTriple 构造。 RDF 1.2 Turtle 还增加了对 带方向的语言标记字符串的支持。

此外,RDF 1.2 Turtle 引入了一种 注解语法,它允许 三元组 项也被断言。

本文档状态

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

本文档是 RDF 1.2 文档套件的一部分。 本文档定义了 Turtle,即简洁 RDF 三元组语言, 它是 RDF [RDF12-CONCEPTS] 的一种具体语法。

本文档由 RDF & SPARQL 工作组作为 工作草案发布,并使用 推荐标准 轨道

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

这是一份草案文档,可能随时被其他 文档更新、替换或废弃。除作为进行中的工作外, 不应引用本文档。 未来对此即将发布的推荐标准的更新可能会纳入 新特性

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

本文档受 2025 年 8 月 18 日 W3C 流程文档管辖。

1. 引言

本节是非规范性的。

本文档定义了 Turtle,即简洁 RDF 三元组语言,它是 RDF [RDF12-CONCEPTS] 的一种具体语法。

Turtle 文档RDF的一种文本表示。 以下 Turtle 文档描述了 Green Goblin 与 Spiderman 之间的关系。

示例 1:示例 Turtle

BASE <http://example.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rel: <http://www.perceive.net/schemas/relationship/>

<#green-goblin>
  rel:enemyOf <#spiderman> ;
  a foaf:Person ;    # in the context of the Marvel universe
  foaf:name "Green Goblin" .

<#spiderman>
  rel:enemyOf <#green-goblin> ;
  a foaf:Person ;
  foaf:name "Spiderman", "Человек-паук"@ru .

此示例引入了 Turtle 语言的许多特性: BASE 和相对 IRI 引用PREFIX 和前缀名、 由 ; 分隔的谓词列表、 由 , 分隔的对象列表、 记号 a, 以及字面量

triples 的 Turtle 语法是 SPARQL 1.2 查询语言 [SPARQL12-QUERY] 中 TriplesBlock 语法的子集。 这两种语法尽可能共享产生式和终结符名称。

Turtle 文档构造 RDF的过程定义于 Turtle 语法解析

2. Turtle 语言

本节是非规范性的。

Turtle 文档允许以紧凑的文本形式写出一个 RDFRDF三元组组成, 三元组由主体、谓词和对象构成。

注释可以跟随一个不属于 其他词法记号的 #,并持续到行尾。

2.1 简单三元组

最简单的三元组语句是 (主体谓词对象) 项的序列, 形成一个 RDF 三元组, 并以句点 (.) 结束。 空白字符 (空格制表符LF,和/或 CR) 可以围绕各项, 除非在语法中指出其具有特殊意义。

示例 2: 简单 三元组

<http://example.org/#spiderman>
  <http://www.perceive.net/schemas/relationship/enemyOf>
    <http://example.org/#green-goblin> .

2.2 谓词列表

同一主体通常会被许多谓词引用。 predicateObjectList 产生式 匹配一系列位于主体之后、并由 ; 分隔的谓词和对象。 这表示一系列具有该主体的 RDF 三元组, 每个谓词 和对象被分配到一个三元组。 因此,; 用于重复那些 仅在谓词和对象 RDF上不同的三元组的主体。

这两个示例是书写关于 Spiderman 的三元组的等价方式。

示例 3: 谓词列表

<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enemyOf> <http://example.org/#green-goblin> ;
  <http://xmlns.com/foaf/0.1/name> "Spiderman" .
示例 4:谓词列表展开为简单三元组

<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enemyOf> <http://example.org/#green-goblin> .
<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Spiderman" .

2.3 对象列表

与谓词一样,相同的主体和谓词也常常会与不同对象重复出现。 objectList 产生式 匹配一系列位于 谓词之后、并由 , 分隔的对象。 这表示一系列具有相同 主体 和谓词的 RDF 三元组, 每个对象被分配到一个三元组。 因此,, 用于重复那些 仅在对象 RDF上不同的三元组的主体和 谓词。

这两个示例是用两种语言书写 Spiderman 名字的等价方式。

示例 5: 对象 列表

<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Spiderman", "Человек-паук"@ru .
示例 6: 对象列表展开为简单三元组

<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Spiderman" .
<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Человек-паук"@ru .

RDF Concepts 中定义了四种 RDFIRI (国际化 资源标识符)、 字面量空白 节点,以及 三元组 项; Turtle 为每一种都提供了多种书写方式。

2.4 版本声明

Turtle 语言自其起源以来一直在演进,RDF 1.2 增加了新语法。 RDF 1.2 Turtle 引入了 VERSION@version 指令, 以及可选的 version 媒体类型参数。 当使用诸如 初始文本方向三元组 项等新特性序列化 Turtle 时, 作者可以使用这些指令声明对新语法形式的使用。

示例 7: 版本声明

VERSION "1.2"
PREFIX : <http://example.com/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
:a :name "Alice" ~ :t {| :statedBy :bob ; :recorded "2021-07-07"^^xsd:date |} .

也可以使用旧式指令 (注意末尾有一个“.”):

示例 8: 旧式 版本声明

@version "1.2" .
@prefix : <http://example.com/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
:a :name "Alice" ~ :t {| :statedBy :bob ; :recorded "2021-07-07"^^xsd:date |} .

通过 HTTP 提供内容时,服务器可以使用可选的 version 媒体类型参数来声明版本:

示例 9: 声明 Turtle 版本 1.2 的 HTTP 响应

HTTP/1.1 200 OK
Content-Type: text/turtle; version=1.2

在使用 RDF 1.2 特定特性时,例如 初始文本方向, 应在文档开头使用 VERSION@version 指令声明具体的 RDF 版本。 这使不支持这些特性的解析器能够尽早检测到 这些特性的存在,并有可能 通知用户,使其有机会停止作业, 或以其他方式处理部分输入数据 将无法按预期处理这一事实。

一个 Turtle 文档中可以出现多个版本指令。 该指令适用于文档中跟随该指令的部分, 直到遇到另一个指令或到达文档末尾。

在没有当前版本指令时,会考虑作为 媒体类型一部分指定的任何版本。 如果没有任何版本信息,合理的默认值是 "1.1",以最大化 与 Turtle 前一版本 [TURTLE] 的兼容性。 无论如何,版本声明只是一个提示; 解析器不要求拒绝超出所声明版本的特性 (但可以用警告报告它们)。

版本标签在 RDF 1.2 Concepts and Abstract Data Model2.1 版本标签中定义。 处理器可以将无法识别的标签视为错误或警告。

虽然 "1.1" 是一个可接受的版本标签, 但不鼓励在 VERSION@version 指令中使用它, 因为这会不必要地导致 Turtle 1.1 解析器失败。

2.5 IRI

IRI 可以 写为 已解析 IRI、 相对 IRI 引用, 或前缀名。 相对和已解析 IRI 以 < 开始, 后跟 >,并且 可以包含数字转义序列(如下所述)。 例如,<http://example.org/#green-goblin>

<#green-goblin> 这样的相对 IRI 引用 会相对于当前基 IRI 解析。 可以使用 @baseBASE 指令定义新的基 IRI。此操作的具体细节定义在 6.3 IRI 引用中。

在 Turtle 三元组的谓词位置中的记号 a 表示 IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type

前缀名是一个前缀 标签和一个 局部部分, 二者由 : 分隔。 前缀名通过将与前缀关联的 IRI 和局部部分连接起来转换为 IRI。 @prefixPREFIX 指令 将 一个前缀标签与一个 IRI 相关联。 后续 @prefixPREFIX 指令 可以重新映射同一个前缀标签。

Turtle 语言最初只允许包含 @ 字符的语法来书写 prefix 和 base 指令。 不区分大小写的 PREFIXBASEVERSION 形式被加入,以使 Turtle 的语法与 SPARQL 的语法保持一致。 原有指令 @prefix@base@version 也可以 使用。 使用 PREFIXBASEVERSION 可以使声明更容易复制到 SPARQL 查询中。

使用前缀名书写 http://www.perceive.net/schemas/relationship/enemyOf

  1. 为词汇表 IRI http://www.perceive.net/schemas/relationship/ 定义一个前缀标签 somePrefix
  2. 然后写作 somePrefix:enemyOf,它等价于书写 <http://www.perceive.net/schemas/relationship/enemyOf>

这可以使用用于 前缀声明的 SPARQL 风格语法来书写:

示例 10: 前缀声明的 SPARQL 语法

PREFIX somePrefix: <http://www.perceive.net/schemas/relationship/>

<http://example.org/#green-goblin> somePrefix:enemyOf <http://example.org/#spiderman> .

或使用原始的 Turtle 前缀声明语法:

示例 11: 原始的 前缀声明语法

@prefix somePrefix: <http://www.perceive.net/schemas/relationship/> .

<http://example.org/#green-goblin> somePrefix:enemyOf <http://example.org/#spiderman> .

前缀名是 XML QName 的超集。 它们的区别在于,前缀名的局部部分可以包含:

  • 前导数字,例如 leg:3032571isbn13:9780136019701
  • 非前导冒号,例如 og:video:height
  • 保留 字符转义序列,例如 wgs:lat\-long

以下 Turtle 文档包含了在 Turtle 中书写 IRI 的所有不同方式的示例。

示例 12: 书写 IRI 的不同方式

# A triple with all resolved IRIs
<http://one.example/subject1> <http://one.example/predicate1> <http://one.example/object1> .

@base <http://one.example/> .
<subject2> <predicate2> <object2> .     # relative IRI references, e.g., http://one.example/subject2

BASE <http://one.example/>
<subject2> <predicate2> <object2> .     # relative IRI references, e.g., http://one.example/subject2

@prefix p: <http://two.example/> .
p:subject3 p:predicate3 p:object3 .     # prefixed name, e.g., http://two.example/subject3

PREFIX p: <http://two.example/>
p:subject3 p:predicate3 p:object3 .     # prefixed name, e.g., http://two.example/subject3

@prefix p: <path/> .                    # prefix p: now stands for http://one.example/path/
p:subject4 p:predicate4 p:object4 .     # prefixed name, e.g., http://one.example/path/subject4

PrEfIx : <http://another.example/>       # empty prefix
:subject5 :predicate5 :object5 .        # prefixed name, e.g., http://another.example/subject5

:subject6 a :subject7 .                 # same as :subject6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> :subject7 .

<http://伝言.example/?user=أ&channel=R%26D> a :subject8 . # a multi-script subject IRI .

虽然 @prefix@base 指令 要求在 IRI 后有一个结尾的 ., 但等价的 PREFIXBASE 在指令的 IRI 部分之后没有结尾的 .PREFIXBASE 不区分大小写, 可以写作 prefixbase, 也可以写成任何混合大小写形式。

2.6 RDF 字面量

字面量 用于标识字符串、数字、日期等值。

示例 13: Turtle 中的 字面量

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

<http://example.org/#green-goblin> foaf:name "Green Goblin" .

<http://example.org/#spiderman> foaf:name "Spiderman" .

2.6.1 带引号的字面量

带引号的字面量(语法产生式 RDFLiteral)具有一个词法形式, 后跟一个语言标签 (可能包含初始文本方向)、 一个数据类型 IRI,或两者都没有。

词法形式的表示由一个初始定界符 (例如 "'""",或 '''); 一串允许的字符、数字转义序列 和/或字符串转义序列;以及一个与 初始定界符匹配的最终定界符组成。 相应的 RDF 词法 形式 是定界符之间的字符,并已处理任何转义序列。

如果存在,语言标签前面会有 一个 @, 并且后面可以跟一个初始文本方向, 它与语言标签由 -- 分隔。

如果没有语言标签,则可以有一个数据类型 IRI, 前面由 ^^ 引出。 Turtle 中的数据类型 IRI 可以使用 已解析 IRI相对 IRI 引用前缀名来书写。

如果既没有数据类型 IRI 也没有语言标签, 数据类型为 xsd:string

\ 不得出现在任何带引号的字面量中,除非作为转义序列的一部分。 其他限制取决于定界符:

  • ' 定界的字面量 不得包含未转义的 'LF,也不得包含 CR 字符。
  • " 定界的字面量 不得包含未转义的 "LF,也不得包含 CR 字符。
  • ''' 定界的字面量不得包含这样的 序列。
  • """ 定界的字面量不得包含这样的 序列。
示例 14: 带引号的字面量

VERSION "1.2"
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX show: <http://example.org/vocab/show/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

show:218 rdfs:label "That Seventies Show"^^xsd:string .                # literal with XML Schema string datatype
show:218 rdfs:label "That Seventies Show"^^<http://www.w3.org/2001/XMLSchema#string> . # same as above
show:218 rdfs:label "That Seventies Show" .                                            # same again
show:218 show:localName "That Seventies Show"@en .                     # literal with a language tag
show:218 show:localName "HTML היא שפת סימון."@he--rtl .                # literal with a language tag and initial text direction
show:218 show:localName "That Seventies Show"@en-us--ltr .             # literal with a language tag, region subtag, and initial text direction
show:218 show:localName 'Cette Série des Années Soixante-dix'@fr .     # literal delimited by single quote
show:218 show:localName "Cette Série des Années Septante"@fr-be .      # literal with a region subtag
show:218 show:blurb '''This is a multi-line
                       literal with many quotes (""""")
                       and up to two sequential apostrophes ('').''' . # literal with embedded new lines and quotes

2.6.2 数字

数字可以像其他字面量一样以词法形式和数据类型来书写 (例如 "-5.0"^^xsd:decimal)。 Turtle 有一种简写语法,用于书写整数值、 任意精度十进制值,以及双精度浮点值。

数据类型 缩写形式 词法形式 描述
xsd:integer -5 "-5"^^xsd:integer 整数值可以写作一个可选符号和一串数字。 整数匹配正则表达式“[+-]?[0-9]+”。
xsd:decimal -5.0 "-5.0"^^xsd:decimal 任意精度十进制数可以写作一个可选符号、 零个或多个数字、 一个小数点,以及一个或多个数字。 十进制数匹配正则表达式“[+-]?[0-9]*\.[0-9]+”。
xsd:double 4.2E9 "4.2E9"^^xsd:double 双精度浮点值可以写作 一个可选带符号的尾数,带有可选小数点, 后跟字母 e 或字母 E, 以及一个可选带符号的整数指数。 指数匹配正则表达式“[+-]?[0-9]+”, 尾数匹配这些正则表达式之一: “[+-]?[0-9]+\.[0-9]+”、 “[+-]?\.[0-9]+”, 或“[+-]?[0-9]”。
示例 15: 数字 字面量

PREFIX : <http://example.org/elements/>
<http://en.wikipedia.org/wiki/Helium>
    :atomicNumber 2 ;               # xsd:integer
    :atomicMass 4.002602 ;          # xsd:decimal
    :specificGravity 1.663E-4 .     # xsd:double

2.6.3 布尔值

布尔值可以写作 truefalse(区分大小写), 并表示数据类型为 xsd:booleanRDF 字面量 [XMLSCHEMA11-2]。

示例 16: 布尔 字面量

PREFIX : <http://example.org/stats/>
<http://somecountry.example/census2007>
    :isLandlocked false .           # xsd:boolean

2.7 RDF 空白节点

Turtle 中的 RDF 空白 节点表示为 _: 后跟一个空白节点标识符,该标识符是一串 字符。 标识符中的字符基于 PN_CHARS_BASE 构建, 并按如下方式放宽:

文档中的每个唯一空白节点标识符都会分配一个新的 RDF 空白 节点。 重复使用同一个空白节点标识符会标识同一个空白 节点。

示例 17: Turtle 中的 空白节点

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

_:alice foaf:knows _:bob .
_:bob foaf:knows _:alice .

2.8 没有空白节点标识符的 空白节点 嵌套

在 Turtle 中,当匹配 blankNodePropertyList 产生式和终结符 ANON 时,也会分配新的 RDF 空白 节点。 这两者都可以出现在三元组的 subjectobject 位置 (参见 Turtle 语法)。 该主体或对象是一个新的 RDF 空白 节点。 这个空白节点也充当匹配 嵌入在 blankNodePropertyList 中的 predicateObjectList 产生式所产生三元组的主体。 这些三元组的生成在 谓词列表中描述。 空白节点也会为下面描述的集合 分配。

示例 18: 空白节点属性列表
  
  PREFIX foaf: <http://xmlns.com/foaf/0.1/>

  # Someone knows someone else, who has the name "Bob".
  [] foaf:knows [ foaf:name "Bob" ] .

Turtle 语法允许 blankNodePropertyList 嵌套。 在这种情况下,每个内部的 [ 都建立一个新的主体空白节点,该节点在 ] 处恢复为外层节点,并充当 谓词对象列表的当前 主体。

blankNodePropertyList 中使用 predicateObjectList 是表示一个节点一系列属性的常见惯用法。

缩写形式: 对应的简单三元组:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

[ foaf:name "Alice" ] foaf:knows [
    foaf:name "Bob" ;
    foaf:knows [
        foaf:name "Eve" ] ;
    foaf:mbox <mailto:bob@example.com> ] .

_:a <http://xmlns.com/foaf/0.1/name> "Alice" .
_:a <http://xmlns.com/foaf/0.1/knows> _:b .
_:b <http://xmlns.com/foaf/0.1/name> "Bob" .
_:b <http://xmlns.com/foaf/0.1/knows> _:c .
_:c <http://xmlns.com/foaf/0.1/name> "Eve" .
_:b <http://xmlns.com/foaf/0.1/mbox> <mailto:bob@example.com> .

2.9 集合

RDF 提供了一种用于 RDF 节点列表的集合 [RDF12-SEMANTICS] 结构。 Turtle 中集合的语法是一个可能为空的 RDF列表,该列表由 () 包围。 这个集合表示一个 rdf:first/rdf:rest 列表结构,其中 rdf:first 语句的对象序列就是由 () 包围的项的顺序。

(…) 语法必须出现在三元组的 subjectobject 位置 (参见 Turtle 语法)。 列表头部的空白 节点是包含它的三元组的主体或对象。

示例 21: Turtle 中的 集合

PREFIX : <http://example.org/foo/>
# the object of this triple is the RDF collection blank node
:subject :predicate ( :a :b :c ) .

# an empty collection value - rdf:nil
:subject :predicate2 () .

2.10 三元组项

三元组 项 可以是一个 RDF 三元组对象

三元组 项 表示为一个 tripleTerm,其中包含 ttSubjectpredicatettObject, 全部以 <<( 开头, 并全部以 )>> 结束。 注意,三元组项 可以嵌套。

示例 22: 三元组 项

VERSION     "1.2"
PREFIX :    <http://www.example.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

_:e38  :familyName                     "Smith" .
_:anno rdf:reifies <<( _:e38 :jobTitle "Designer" )>> .
_:anno :accordingTo                     _:e22 .

2.11 具体化三元组

RDF 中, 三元组 项很少被直接使用, 因为它们通常被限制为只能使用 rdf:reifies 谓词 作为一个三元组对象。 这样的三元组称为具体化三元组。 Turtle 提供了一种简写记法,用于通过 reifiedTriple 产生式书写具体化三元组

reifiedTriple 是表示具体化三元组的语法糖, 它定义了一个 标识符(具体化器) 与一个三元组项之间的特定关系。 该标识符成为一种间接引用 三元组项的方式,该三元组项 可能会、也可能不会在与此输入文档对应的图中被断言。

RDF 1.2 中的具体化是一个 与 最初在 RDF Semantics 中定义的 具体化词汇表不同的概念。 虽然这两个术语都描述了使用组成部分表示一个 RDF 三元组, 但 RDF 1.2 使用该术语来表示使用 rdf:reifies 谓词标识一个三元组 项

具体化三元组使用 reifiedTriple 产生式表示, 以 << 开始, 后跟一个 rtSubject、 一个 predicate 和 一个 rtObject, 后跟一个可选的 reifier, 该 reifier 由一个 ~ 以及后续可选的 iri 产生式 或 BlankNode 产生式组成, 并以 >> 结束。 例如,<< :subject :predicate :object ~ :IRIREF >>。 如果没有出现具体化器, 或者一个 reifier 后面没有立即跟随一个 iriBlankNode, 则会分配一个新的 RDF 空白 节点, 如 << :subject :predicate :object >><< :subject :predicate :object ~ >> 所示。

reifiedTriples 可以嵌套, 例如
<< :subject1 :predicate1 << :subject2 :predicate2 :object2 >> ~:IRIREF1 >>
<< :subject4 :predicate4 << :subject3 :predicate3 :object3 ~:IRIREF3 >> >>

如果一个 reifiedTriple 没有由 IRI空白 节点标识, 则会分配一个新的 RDF 空白 节点 并用它标识这种关系。

示例 23:具体化 三元组

VERSION     "1.2"
PREFIX :    <http://www.example.org/>

:employee38 :familyName "Smith" .
<< :employee38 :jobTitle "Assistant Designer" >> :accordingTo :employee22 .
示例 24:带显式具体化器的具体化三元组

PREFIX :    <http://www.example.org/>

:employee38 :familyName "Smith" .
<< :employee38 :jobTitle "Assistant Designer" ~ _:id >> :accordingTo :employee22 .
例如,上述示例的语法糖等价于:
示例 25:具体化三元组展开为三元组项

PREFIX :    <http://www.example.org/>

:employee38 :familyName "Smith" .
_:id rdf:reifies <<( :employee38 :jobTitle "Assistant Designer" )>> .
_:id :accordingTo :employee22 .

注意 reifiedTriple 的语法糖 (即 << [...] >>)与常规的 tripleTerm(即 <<( [...] )>>)之间的语法差异。

在声明一个前缀以便可以缩写 IRI 之后, 此示例中的第一个三元组断言 employee38familyName 为 "Smith"。 注意,该图并未断言 employee38jobTitle 为 "Assistant Designer"; 它表示 employee22 使用一个 reifiedTriple 作出了该主张。 换句话说,三元组“employee38jobTitle 为 'Assistant Designer'” 本身并不是该图的成员,这与上面的“employee38 的 familyName 为 'Smith'”不同; 相反,它被称为一个具体化三元组

reifiedTriple 是一种语法糖,用 rdf:reifies 谓词将 具体化器关联到 tripleTerm

2.11.1 注解语法

Turtle 还定义了一种注解 语法, 用于同时具体化并断言一个三元组, 从而提供一种方便的快捷方式。 注解可用于通过显式或隐式标识符 同时断言一个三元组, 并使该三元组成为 进一步三元组的 主体对象。 如果显式标识,则同一个具体化器 之后可以用作 其他 三元组和/或三元组项主体对象

reifiedTriple 一样, 注解语法使用一个具体化器,写作 一个 IRI 或一个 空白 节点, 前面带有一个波浪号 (~), 用于标识正在具体化的 三元组 项。 然而,虽然 reifiedTriple 最多只能包含一个具体化器,注解语法可以包含 任意数量的具体化器。每个具体化器 都会导致产生一个对应的 具体化三元组。

具体化器后面可以跟一个注解块。 如果一个具体化器后面没有跟注解块,则会 类似于没有附加注解的 reifiedTriple 来处理。 如果一个注解块前面没有立即出现具体化器, 则会分配一个新的 RDF 空白节点来充当 被具体化的 三元组 项具体化器

注解语法是 Turtle 中的一种语法快捷方式。 RDF 抽象语法 [RDF11-CONCEPTS] 不区分 三元组是如何写出的。

示例 26: 带注解的三元组

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

:alice :name "Alice" ~ :t {| :statedBy :bob ; :recorded "2021-07-07"^^xsd:date |} .

与以下三元组集合相同:

示例 27:带注解的三元组展开为具体化器

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

:alice :name "Alice" .
<< :alice :name "Alice" ~ :t >> :statedBy :bob ;
                                :recorded "2021-07-07"^^xsd:date .

完全展开为使用三元组项 而不是具体化器,会得到如下内容:

示例 28:带注解的三元组展开为三元组 项

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

:alice :name "Alice" .
:t rdf:reifies <<( :alice :name "Alice" )>> .
:t :statedBy :bob .
:t :recorded "2021-07-07"^^xsd:date .

在前一个示例中,图包含四个 三元组具体化器:t 标识。

注解块也可以在没有显式 具体化器的情况下使用。在这种情况下,会分配一个新的 RDF 空白节点, 作为 三元组 项具体化器

示例 29:带隐式具体化器的带注解三元组

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

:alice :name "Alice" {| :statedBy :bob ; :recorded "2021-07-07"^^xsd:date |} .

完全展开此示例会得到以下三元组,其中 _:b0 表示一个新的 RDF 空白 节点:

示例 30:带隐式具体化器的带注解三元组 展开

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

:alice :name "Alice" .
_:b0 rdf:reifies <<( :alice :name "Alice" )>> .
_:b0 :statedBy :bob .
_:b0 :recorded "2021-07-07"^^xsd:date .

annotation 可以包含任意数量的注解块。如果这些块前面没有 立即出现显式具体化器, 则每个块都会关联 一个新的 RDF 空白节点,该节点作为其具体化器被分配。

示例 31:带多个隐式 具体化器的带注解三元组

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

:alice :name "Alice"
  {| :statedBy :alice ; :recorded "2017-02-01"^^xsd:date |}
  {| :statedBy :bob ; :recorded "2021-07-07"^^xsd:date |} .

完全展开此示例会得到以下三元组,其中 _:b0_:b1 表示新的 RDF 空白节点:

示例 32:带多个隐式 具体化器的带注解三元组 展开

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

:alice :name "Alice" .
_:b0 rdf:reifies <<( :alice :name "Alice" )>> .
_:b0 :statedBy :alice .
_:b0 :recorded "2017-02-01"^^xsd:date .
_:b1 rdf:reifies <<( :alice :name "Alice" )>> .
_:b1 :statedBy :bob .
_:b1 :recorded "2021-07-07"^^xsd:date .

注解语法也可以包含多个没有注解块的显式 具体化器。每个这样的具体化器 都会导致产生一个对应的具体化三元组。

示例 33:带多个显式 具体化器的带注解三元组

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

:alice :name "Alice" ~ :stmt1 ~ :stmt2 .

完全展开此示例会得到以下三元组:

示例 34:带多个显式 具体化器的带注解三元组展开

VERSION     "1.2"
PREFIX :    <http://example.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

:alice :name "Alice" .
:stmt1 rdf:reifies <<( :alice :name "Alice" )>> .
:stmt2 rdf:reifies <<( :alice :name "Alice" )>> .

3. 示例

本节是非规范性的。

此示例是 RDF 1.2 XML 语法示例 7的 Turtle 翻译 (example1.ttl):

PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX ex: <http://example.org/stuff/1.0/>

<https://www.w3.org/TR/rdf12-xml/>
  dc:title "RDF 1.2 XML Syntax" ;
  ex:editor [
    ex:fullName "Gregg Kellogg" ;
    ex:homePage <https://greggkellogg.net/>
  ] .

一个包含两个字面量的 RDF 集合示例。

示例 36: 由两个字面量组成的 RDF 集合

PREFIX : <http://example.org/stuff/1.0/>
:a :b ( "apple" "banana" ) .

它是以下内容的简写(example2.ttl):

PREFIX : <http://example.org/stuff/1.0/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
:a :b
  [ rdf:first "apple";
    rdf:rest [ rdf:first "banana";
               rdf:rest rdf:nil ]
  ] .

一个包含两个相同三元组的示例,其字面量对象 包含换行符,分别以普通字面量形式和长字面量形式书写。 此示例中的换行是 LF。 (example3.ttl):

PREFIX : <http://example.org/stuff/1.0/>

:a :b "The first line\nThe second line\n  more" .

:a :b """The first line
The second line
  more""" .

如语法所示, collection 可以是 subjectobject。 如果该集合包含一个或多个对象,则此主体或对象将是第一个对象的新 空白节点; 如果该集合为空,则为 rdf:nil

例如,

示例 39: 用作主体的集合

PREFIX : <http://example.org/stuff/1.0/>
(1 2.0 3E1) :p "w" .

是以下内容的语法糖(注意 空白 节点 b0b1b2 不会出现在该 RDF 图的其他任何地方):

示例 40:用空白节点表示的集合

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <http://example.org/stuff/1.0/>
_:b0  rdf:first  1 ;
      rdf:rest   _:b1 .
_:b1  rdf:first  2.0 ;
      rdf:rest   _:b2 .
_:b2  rdf:first  3E1 ;
      rdf:rest   rdf:nil .
_:b0  :p         "w" .

RDF 集合可以嵌套,并且可以涉及其他 语法 形式:

示例 41: 嵌套 集合

PREFIX : <http://example.org/stuff/1.0/>
(1 [:p :q] ( 2 ) ) :p2 :q2 .

是以下内容的语法糖:

示例 42:用空白节点表示的嵌套集合

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <http://example.org/stuff/1.0/>
_:b0  :p2  :q2 .
_:b0  rdf:first  1 ;
      rdf:rest   _:b1 .
_:b1  rdf:first  _:b2 .
_:b2  :p         :q .
_:b1  rdf:rest   _:b3 .
_:b3  rdf:first  _:b4 .
_:b4  rdf:first  2 ;
      rdf:rest   rdf:nil .
_:b3  rdf:rest   rdf:nil .

4. Turtle 与 SPARQL 的比较

本节是非规范性的。

SPARQL 1.2 查询语言SPARQL)[SPARQL12-QUERY] 在其 TriplesBlock 产生式中使用 Turtle 风格的语法。 该产生式与 Turtle 语言的不同之处在于:

  1. SPARQL 允许将 RDF 字面量 作为三元组模式的主体。
  2. SPARQL 允许变量(?name$name) 出现在该形式三元组的任意部分。
  3. Turtle 允许前缀、基和版本声明 出现在三元组之外的任意位置。 在 SPARQL 中,它们只允许出现在 PrologueSPARQL 查询的开头)中。
  4. SPARQL 使用不区分大小写的关键字,但 a 除外。 Turtle 的 @prefix@base 声明区分大小写, 派生自 SPARQLPREFIXBASE 不区分大小写。
  5. truefalseSPARQL 中不区分大小写,而在 Turtle 中区分大小写。 TrUe 在 Turtle 中不是有效的布尔值。

更多信息请参见 SPARQL 查询文档 [SPARQL12-QUERY] 中的 IRI 语法SPARQL 语法 小节。

5. 一致性

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

本文档中的关键词 可以必须不得应该 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述解释,当且仅当它们像此处所示那样 全部以大写字母出现时。

本规范为以下内容定义一致性标准:

一致的 Turtle 文档是一个 RDF 字符串,它 符合 6. Turtle 语法中定义的语法和附加约束,并以 turtleDoc 产生式为起点。Turtle 文档序列化一个 RDF

一致的 Turtle 解析器是一个能够代表 应用程序读取 Turtle 文档的系统。 它会将序列化的 RDF 图(如 7. 解析中所定义) 提供给应用程序,通常通过某种形式的 API。

标识 Turtle 语言的 IRI 是:http://www.w3.org/ns/formats/Turtle

本规范未定义 Turtle 解析器如何处理不一致的输入文档。

5.1 媒体类型和内容 编码

Turtle 的媒体类型是 text/turtle。 Turtle 内容的内容编码始终是 UTF-8 [RFC3629]。

6. Turtle 语法

Turtle 文档是一个以 UTF-8 [RFC3629] 编码的 RDF 字符串。 只允许使用 Unicode 标量值, 其范围为 U+0000U+D7FF 以及 U+E000U+10FFFF。 这排除了 代理代码点, 即 U+D800U+DFFF 范围。

6.1 空白字符

空白字符(产生式 WS)用于分隔两个 否则会被(错误地)识别为一个终结符的终结符。下面以大写表示的规则名称指示 空白字符在何处具有意义;这些规则构成了用于构造 Turtle 解析器的一种可能终结符选择。

空白字符在 String 产生式中具有意义。

6.2 注释

Turtle 中的注释以位于 IRIREFSTRING_LITERAL_SINGLE_QUOTESTRING_LITERAL_QUOTESTRING_LITERAL_LONG_SINGLE_QUOTESTRING_LITERAL_LONG_QUOTE 之外的 # 开始, 并持续到行尾(由 LFCR 标记), 如果注释标记之后没有行尾,则持续到文件结尾。 注释被视为空白字符。

6.3 IRI 引用

相对 IRI 引用统一资源 标识符(URI):通用语法 [RFC3986] 使用第 5.2 节中的 基本算法根据基 IRI 进行解析。 不执行基于语法的规范化,也不执行基于方案的规范化 (RFC3986 第 6.2.2 和 6.2.3 节中描述)。 IRI 引用中额外允许的字符按照 RFC3987 第 6.5 节中对 URI 引用中的非保留字符的处理方式处理,参见 国际化资源 标识符(IRI) [RFC3987]。

@baseBASE 指令 定义用于解析相对 IRI 引用的基 IRI, 依据 [RFC3986] 第 5.1.1 节,“嵌入在 内容中的基 URI”第 5.1.2 节,“来自 封装实体的 基 URI” 定义了作用域内基 IRI 如何来自封装文档, 例如带有 xml:base 指令的 SOAP 信封或带有 Content-Location 标头的 MIME multipart 文档。 5.1.3,“来自检索 URI 的 基 URI”中标识的“检索 URI”, 是获取特定 Turtle 文档的 URL。 如果以上任何内容都没有指定基 URI,则使用默认 基 URI(第 5.1.4 节,“默认基 URI”)。 每个 @baseBASE 指令都会设置 一个新的 作用域内基 URI, 并相对于前一个基 URI。

6.4 转义序列

Turtle 文档中使用三种形式的转义:

每种转义序列可以使用的上下文
数字
转义
字符串
转义
保留 字符
转义
IRI, 用作 RDF, 或用于 @prefixPREFIX@baseBASE 声明中
局部 名称
字符串

转义序列的处理方式是:取得与相关语法产生式匹配的 Unicode 代码点序列, 然后应用以下步骤。

  1. 从左到右扫描 Unicode 代码点序列,以查找 第一个匹配的转义序列。
  2. 当找到转义序列时,用与该转义序列对应的代码点 替换该转义序列。
  3. 从紧随被替换转义序列之后的代码点开始, 继续扫描该 Unicode 代码点序列。
已处理转义序列的示例
输入代码点 输出代码点 代码点数量
abc\u005Cdef abc\def 7
abc\u005Ctuv abc\tuv 7
\u005CA \A 2
\\u005C \u005C 6
\u005C\u005C \\ 2
\\\u005C \\ 2
\\\\ \\ 2
\u005Cn \n 2

%-encoded 序列位于 IRI 的字符范围内, 并且在局部名称中被显式允许。 它们表现为一个 % 后跟两个十六进制字符,并表示同一 三字符序列。这些序列在处理期间不会 被解码。 在 Turtle 中写作 <http://a.example/%66oo-bar> 的项指定 IRI http://a.example/%66oo-bar, 而不是 IRI http://a.example/foo-bar。 带有前缀 PREFIX ex: <http://a.example/> 而写作 ex:%66oo-bar 的项 也指定 IRI http://a.example/%66oo-bar

6.5 语法

此处使用的 EBNF 定义于 XML 1.0 [EBNF-NOTATION]。

注:

  1. 单引号中的关键字 ('@base'、 '@prefix'、 '@version'、 'a'、 'true' 和 'false') 区分大小写。 双引号中的关键字 ("BASE"、 "PREFIX" 和 "VERSION") 不区分大小写。
  2. 转义序列 UCHARECHAR 区分大小写。
  3. 在对输入进行词法切分并选择语法规则时,会选择最长匹配。
  4. 当使用名称为大写的规则作为终结符时, Turtle 语法是 LL(1) 和 LALR(1)。
  5. 进入语法的入口点是 turtleDoc
  6. 在带符号数字中,符号和数字之间不允许有空白字符。
  7. 字符串 '@prefix'、 '@base' 和 '@version' 匹配 LANG_DIR 的模式, 尽管 prefixbaseversion 都不是已注册的语言子标签。 本规范未定义后跟这些记号之一的带引号字面量 (例如 "A"@base) 是否属于 Turtle 语言。
[1] turtleDoc ::= statement*
[2] statement ::= directive | (triples '.')
[3] directive ::= prefixID | base | version | sparqlPrefix | sparqlBase | sparqlVersion
[4] prefixID ::= '@prefix' PNAME_NS IRIREF '.'
[5] base ::= '@base' IRIREF '.'
[6] version ::= '@version' VersionSpecifier '.'
[7] sparqlPrefix ::= "PREFIX" PNAME_NS IRIREF
[8] sparqlBase ::= "BASE" IRIREF
[9] sparqlVersion ::= "VERSION" VersionSpecifier
[10] VersionSpecifier ::= STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE
[11] triples ::= (subject predicateObjectList) | (blankNodePropertyList predicateObjectList?) | (reifiedTriple predicateObjectList?)
[12] predicateObjectList ::= verb objectList (';' (verb objectList)?)*
[13] objectList ::= object annotation (',' object annotation)*
[14] verb ::= predicate | 'a'
[15] subject ::= iri | BlankNode | collection
[16] predicate ::= iri
[17] object ::= iri | BlankNode | collection | blankNodePropertyList | literal | tripleTerm | reifiedTriple
[18] literal ::= RDFLiteral | NumericLiteral | BooleanLiteral
[19] blankNodePropertyList ::= '[' predicateObjectList ']'
[20] collection ::= '(' object* ')'
[21] NumericLiteral ::= INTEGER | DECIMAL | DOUBLE
[22] RDFLiteral ::= String (LANG_DIR | ('^^' iri))?
[23] BooleanLiteral ::= 'true' | 'false'
[24] String ::= STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE | STRING_LITERAL_LONG_SINGLE_QUOTE | STRING_LITERAL_LONG_QUOTE
[25] iri ::= IRIREF | PrefixedName
[26] PrefixedName ::= PNAME_LN | PNAME_NS
[27] BlankNode ::= BLANK_NODE_LABEL | ANON
[28] reifier ::= '~' (iri | BlankNode)?
[29] reifiedTriple ::= '<<' rtSubject verb rtObject reifier? '>>'
[30] rtSubject ::= iri | BlankNode | reifiedTriple
[31] rtObject ::= iri | BlankNode | literal | tripleTerm | reifiedTriple
[32] tripleTerm ::= '<<(' ttSubject verb ttObject ')>>'
[33] ttSubject ::= iri | BlankNode
[34] ttObject ::= iri | BlankNode | literal | tripleTerm
[35] annotation ::= (reifier | annotationBlock)*
[36] annotationBlock ::= '{|' predicateObjectList '|}'

终结符产生式

[38] IRIREF ::= '<' ([^#x00-#x20<>"{}|^`\] | UCHAR)* '>'
/* #x00=NULL #x01-#x1F=control codes #x20=space */
[39] PNAME_NS ::= PN_PREFIX? ':'
[40] PNAME_LN ::= PNAME_NS PN_LOCAL
[41] BLANK_NODE_LABEL ::= '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)?
[42] LANG_DIR ::= '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)* ('--' [a-zA-Z]+)?
[43] INTEGER ::= [+-]? [0-9]+
[44] DECIMAL ::= [+-]? ([0-9]* '.' [0-9]+)
[45] DOUBLE ::= [+-]? (([0-9]+ ('.' [0-9]*)?) | ('.' [0-9]+)) EXPONENT
[46] EXPONENT ::= [eE] [+-]? [0-9]+
[47] STRING_LITERAL_QUOTE ::= '"' ([^#x22#x5C#x0A#x0D] | ECHAR | UCHAR)* '"'
[48] STRING_LITERAL_SINGLE_QUOTE ::= "'" ([^#x27#x5C#x0A#x0D] | ECHAR | UCHAR)* "'"
[49] STRING_LITERAL_LONG_SINGLE_QUOTE ::= "'''" (("'" | "''")? ([^'\] | ECHAR | UCHAR))* "'''"
[50] STRING_LITERAL_LONG_QUOTE ::= '"""' (('"' | '""')? ([^"\] | ECHAR | UCHAR))* '"""'
[51] UCHAR ::= ('\u' HEX HEX HEX HEX) | ('\U' HEX HEX HEX HEX HEX HEX HEX HEX)
[52] ECHAR ::= '\' [tbnrf\"']
[53] WS ::= #x20 | #x09 | #x0D | #x0A
[54] ANON ::= '[' WS* ']'
[55] PN_CHARS_BASE ::= [A-Z]
| [a-z]
| [#xC0-#xD6]
| [#xD8-#xF6]
| [#xF8-#x02FF]
| [#x0370-#x037D]
| [#x037F-#x1FFF]
| [#x200C-#x200D]
| [#x2070-#x218F]
| [#x2C00-#x2FEF]
| [#x3001-#xD7FF]
| [#xF900-#xFDCF]
| [#xFDF0-#xFFFD]
| [#x00010000-#x000EFFFF]
[56] PN_CHARS_U ::= PN_CHARS_BASE | '_'
[57] PN_CHARS ::= PN_CHARS_U | '-' | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[58] PN_PREFIX ::= PN_CHARS_BASE ((PN_CHARS | '.')* PN_CHARS)?
[59] PN_LOCAL ::= (PN_CHARS_U | ':' | [0-9] | PLX) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX))?
[60] PLX ::= PERCENT | PN_LOCAL_ESC
[61] PERCENT ::= '%' HEX HEX
[62] HEX ::= [0-9] | [A-F] | [a-f]
[63] PN_LOCAL_ESC ::= '\' ('_' | '~' | '.' | '-' | "!" | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%')

此语法的文本版本可在此处获得。

6.6 选定的终结符字面量 字符串

本文档使用一些特定的终结符字面量字符串 [EBNF-NOTATION]。 为了阐明这些终结符字面量字符串所使用的 Unicode 代码点, 下表描述了本文档中使用的特定字符和序列。

代码 字形 描述
U+0009 HT 水平制表符
U+000A LF 换行符
U+000D CR 回车符
U+0022 " 引号
U+0023 # 数字符号
U+0025 % 百分号
U+0027 ' 撇号
U+0028 ( 左圆括号
U+0029 ) 右圆括号
U+002C , 逗号
U+002D - 连字符
U+002E . 句点
U+0030 0 数字零
U+0039 9 数字九
U+003B : 冒号
U+003B ; 分号
U+003C < 小于号
U+003E > 大于号
U+0040 @ at 符号
U+0045 E 拉丁大写字母 E
U+005B [ 左方括号
U+005C \ 反斜杠
U+005D [ 右方括号
U+005F _ 下划线
U+0061 a 拉丁小写字母 A
U+0065 e 拉丁小写字母 E
U+007C | 竖线
U+007E ~ 波浪号
U+00B7 · 中点
U+203F 下连线
U+2040 字符连线

其他短终结符字面量字符串由特定的 Unicode 字符序列组成:

space
U+0020
"""
三个连接在一起的引号字符,每个字符的代码点为 U+0022
'''
三个连接在一起的撇号字符,每个字符的代码点为 U+0027
<<
两个连接在一起的小于号字符,每个字符的代码点为 U+003C
>>
两个连接在一起的大于号字符,每个字符的代码点为 U+003E
<<(
两个连接在一起的小于号字符,每个字符的代码点为 U+003C, 后跟一个左圆括号字符,其代码点为 U+0028
)>>
一个左圆括号字符,其代码点为 U+0029, 后跟两个连接在一起的大于号字符,每个字符的代码点为 U+003E
^^
两个连接在一起的抑扬符字符,每个字符的代码点为 U+005E
{|
{(左花括号,代码点 U+007B)后跟 |(竖线,代码点 U+007C
|}
|(竖线,代码点 U+007C) 后跟 }(右花括号,代码点 U+007D
_:
_ 后跟 :
--
两个连接在一起的 - 字符

7. 解析

RDF 1.2 Concepts and Abstract Syntax 规范 [RDF12-CONCEPTS] 定义了四种 RDFIRI字面量空白 节点,以及 三元组 项。 字面量由一个词法形式 和一个可选的语言标签 [BCP47] 组成 —— 可能包含一个初始文本方向 —— 或者由数据类型 IRI组成。 解析期间会使用一种额外类型 prefix,用于将字符串标识符 映射到 命名空间 IRI。 本节通过将与产生式和词法记号匹配的字符串映射到 RDF或其组成部分(例如语言 标签、字面量的词法 形式),把符合 6.5 语法中的语法的字符串 映射为一组三元组。 语法产生式会改变解析器状态并发出三元组。

7.1 解析器状态

解析 Turtle 需要包含九个项的状态:

项构造器可以创建这些值的栈,表示方式为 使用诸如“记录 curSubjectcurPredicate”这样的语言。

7.2 RDF 项构造器

此表将产生式和词法记号映射到 RDFRDF的组成部分, 这些项列在 7. 解析中:

产生式 类型 过程
IRIREF IRI <> 之间的字符, 对其中的数字转义序列进行反转义, 以形成 IRI。相对 IRI 引用解析 按 第 6.3 节执行。生成的 IRI 必须符合通用 IRI 语法的句法限制,并且 应该符合 [RFC3986] 的 第 3.3 节,并遵守 相应 IRI 方案规范施加的任何 更窄限制。
PNAME_NS prefix 当用于 prefixIDsparqlPrefix 产生式时, prefix 是与规则第一个 参数匹配的、可能为空的 RDF 字符串, 它作为 namespaces 映射的键,展开后的第二个 参数会存入其中以供将来查找。
IRI 当用于 PrefixedName 产生式时; namespaces 映射必须有一个对应的 namespace,它形成该 IRI 的 RDF 字符串。 生成的 IRI 必须符合通用 IRI 语法的句法限制,并且 应该遵守相应 IRI 方案规范施加的任何更窄限制。
PNAME_LN IRI 由第一个序列 PNAME_NS 标识一个可能为空的前缀namespaces 映射必须有一个对应的 namespace。该 IRI 的 RDF 字符串 通过对第二个参数 PN_LOCAL 中的 保留字符进行反转义,并将其连接到 namespace 之后形成。 生成的 IRI 必须符合通用 IRI 语法的句法限制,并且 应该遵守相应 IRI 方案规范施加的任何更窄限制。
VersionSpecifier 字面量。 curVersion 取自一个字面量,该字面量使用匹配的 RDF 字符串词法形式和 xsd:string 数据类型。
STRING_LITERAL_SINGLE_QUOTE 词法形式 取最外层 ' 之间的字符, 在将数字字符串转义 序列替换为它们所表示的字符之后, 形成一个词法形式的 RDF 字符串
STRING_LITERAL_QUOTE 词法形式 取最外层 " 之间的字符,并对其中的数字字符串转义 序列进行反转义,以形成一个词法形式的 RDF 字符串
STRING_LITERAL_LONG_SINGLE_QUOTE 词法形式 取最外层 ''' 之间的字符, 并对其中的数字字符串转义 序列进行反转义,以 形成一个词法形式的 RDF 字符串
STRING_LITERAL_LONG_QUOTE 词法形式 取最外层 """ 之间的字符,在 数字字符串 转义序列 被替换为它们所表示的字符之后,形成一个词法形式的 RDF 字符串
LANG_DIR 语言标签 @ 后面的字符构成 语言标签,并且如果匹配的字符 包含 --, 则还可选地构成 初始文本方向语言标签必须 按 [BCP47] 的 第 2.2.9 节格式良好。 如果存在,初始文本方向必须ltrrtl
RDFLiteral 字面量 该字面量具有第一个规则参数 String 的词法形式。如果匹配 '^^' iri 规则,则数据类型 IRIiri 派生,并且该 字面量没有语言标签。如果匹配 LANG_DIR 规则,则语言标签初始文本方向取自 LANG_DIR。如果没有 初始文本方向,则 数据类型为 rdf:langString。如果存在初始文本方向,则 数据类型为 rdf:dirLangString。如果两者都未匹配,则数据类型为 xsd:string, 且该字面量没有语言标签。
INTEGER 字面量 该字面量具有输入字符串的词法形式,且数据类型为 xsd:integer
DECIMAL 字面量 该字面量具有输入字符串的词法形式,且数据类型为 xsd:decimal
DOUBLE 字面量 该字面量具有输入字符串的词法形式,且数据类型为 xsd:double
BooleanLiteral 字面量 该字面量具有 truefalse 的词法形式,取决于 哪一个匹配输入,且数据类型为 xsd:boolean
BLANK_NODE_LABEL 空白节点 与第二个参数 PN_LOCAL 匹配的字符串是 bnodeLabels 中的键。如果映射中没有对应的空白 节点,则分配一个。
ANON 空白节点 生成一个空白节点。
blankNodePropertyList 空白节点 生成一个空白节点。注意下一节中关于 blankNodePropertyList 的规则。
collection 空白节点 对于非空列表,生成一个空白节点。注意下一节中关于 collection 的规则。
IRI 对于空列表,生成的 IRI 为 rdf:nil。注意下一节中关于 collection 的规则。
reifier IRI | 空白节点 curReifier 取自 ,该项取自匹配的 iri 产生式 或 BlankNode 产生式(如果有)。 如果没有匹配这样的产生式,则取自一个新的 RDF 空白 节点
tripleTerm 三元组项 三元组项 由从 ttSubjectpredicatettObject 产生式构造出的项组成。
reifiedTriple IRI | 空白 节点 取自匹配的 reifier(如果有), 或取自一个新的 RDF 空白 节点
annotationBlock IRI | 空白 节点 取自先前匹配的具体化器(如果有), 或取自一个新的 RDF 空白 节点

由于检测输入错误的处理器可能会产生 比输入中所描述的三元组更少的图 (包括完全没有三元组), 因此消费者在使用输出三元组时, 应考虑已报告的任何错误信息, 这些输出三元组可能不完整和/或包含 类型不正确 或形式不正确的项。

7.3 RDF 三元组构造器

Turtle 文档定义了一个由一组 RDF 三元组组成的 RDFsubject 产生式设置 curSubjectverb 产生式设置 curPredicateobjectttObject 产生式设置 curObject。 文档中的每个 object N 都产生一个 RDF 三元组: curSubject curPredicate N .

7.3.1 具体化器

开始 reifier 产生式时, curReifier 取自 reifier 项 构造器。 然后产出 RDF 三元组 curReifier rdf:reifies curTripleTerm

7.3.2 具体化 三元组

开始 reifiedTriple 产生式时, 会记录 curTripleTerm。 使用 rtSubjectverbrtObject 产生式创建一个新的 tripleTerm 实例 curTripleTerm。 结束 reifiedTriple 产生式时, 如果 curReifier 未设置,则为其分配一个新的 RDF 空白 节点; 接着它产出 RDF 三元组 curReifier rdf:reifies curTripleTerm, 然后恢复记录的 curTripleTerm 值。 通过匹配 reifiedTriple 产生的节点是 curReifier

7.3.3 注解

开始 annotation 产生式时, 会记录 curSubjectcurPredicate。 使用 curSubjectcurPredicatecurObject 创建一个新的 tripleTerm 实例 curTripleTerm, 并清除 curReifier 的值。 结束 annotation 产生式时, 恢复记录的 curSubjectcurPredicate 值。

7.3.4 注解块

开始 annotationBlock 产生式时, 会记录 curTripleTerm。 如果 curReifier 未设置,则为其分配一个新的 RDF 空白 节点, 并且该产生式产出 RDF 三元组 curReifier rdf:reifies curTripleTermcurSubject 取自 curReifier。 结束 annotationBlock 产生式时, 清除 curReifier 的值 并恢复 curTripleTerm

如果 curReifier 已经被设置,则 具体化三元组 curReifier rdf:reifies curTripleTerm 已在 7.3.1 具体化器中发出。

7.3.5 属性 列表

开始 blankNodePropertyList 产生式时,会记录 curSubjectcurPredicate, 并将 curSubject 设置为一个新的空白节点 B。 结束 blankNodePropertyList 产生式时,会恢复 curSubjectcurPredicate。 通过匹配 blankNodePropertyList 产生的节点是空白节点 B

7.3.6 集合

开始 collection 产生式时, 会记录 curSubjectcurPredicatecollection 产生式中的每个 object 都会将 curSubject 设置 为一个新的空白节点 B,并将 curPredicate 设置为 rdf:first。 第一个之后的每个对象 objectn 都产生一个三元组:objectn-1 rdf:rest objectn . 结束 collection 产生式时, 会创建一个 额外的三元组 curSubject rdf:rest rdf:nil . 并 恢复 curSubjectcurPredicate。 通过匹配 collection 产生的节点,对于非空列表是第一个空白节点 B, 对于空列表是 rdf:nil

7.4 解析示例

本节是非规范性的。

以下资料性示例展示了使用 LALR(1) 解析器解析此 Turtle 文档时 执行的语义动作:

示例 43: 解析 Turtle 的 示例

  PREFIX ericFoaf: <http://www.w3.org/People/Eric/ericP-foaf.rdf#>
  PREFIX : <http://xmlns.com/foaf/0.1/>
  ericFoaf:ericP :givenName "Eric" ;
    :knows <http://norman.walsh.name/knows/who/dan-brickley> ,
            [ :mbox <mailto:timbl@w3.org> ] ,
            <http://getopenid.com/amyvdh> .

A. 在 HTML 文档中嵌入 Turtle

本节是非规范性的。

HTML [HTML5] script 标签 可用于在文档中嵌入数据块。Turtle 可以通过这种方式轻松嵌入 HTML。

示例 44: 在 HTML 中嵌入 Turtle

<script type="text/turtle">
  PREFIX dc: <http://purl.org/dc/terms/>
  PREFIX frbr: <http://purl.org/vocab/frbr/core#>

  <http://books.example.com/works/45U8QJGZSQKDH8N> a frbr:Work ;
    dc:creator "Wil Wheaton"@en ;
    dc:title "Just a Geek"@en ;
    frbr:realization <http://books.example.com/products/9780596007683.BOOK>,
      <http://books.example.com/products/9780596802189.EBOOK> .

  <http://books.example.com/products/9780596007683.BOOK> a frbr:Expression ;
    dc:type <http://books.example.com/product-types/BOOK> .

  <http://books.example.com/products/9780596802189.EBOOK> a frbr:Expression ;
    dc:type <http://books.example.com/product-types/EBOOK> .
</script>

Turtle 内容应该放在 script 标签中,并将 type 属性设置为 text/turtle<> 符号 不需要在 script 标签内部进行转义。嵌入的 Turtle 的字符编码 将与 HTML 文档编码匹配。

A.1 XHTML

本节是非规范性的。

与 JavaScript 一样,为 HTML(text/html)编写的 Turtle 在 XHTML (application/xhtml+xml)中使用时可能会出错。 解决方案与 JavaScript 所用的方案相同。

示例 45: 在 XHTML 中嵌入 Turtle

<script type="text/turtle">
  <span class="hl-bold"># <![CDATA[</span>
  PREFIX frbr: <http://purl.org/vocab/frbr/core#>

  <http://books.example.com/works/45U8QJGZSQKDH8N> a frbr:Work .
  <span class="hl-bold"># ]]></span>
</script>

嵌入 XHTML 时,Turtle 数据块必须包在 CDATA 区段中。这些 CDATA 标记必须位于 Turtle 注释中。如果字符序列 ]]> 出现在文档中,则必须使用 字符串转义(\u005D\u005D\u003E)进行转义。这也会使 Turtle 在同时作为 text/htmlapplication/xhtml+xml 提供的多语种文档中保持安全。 未使用 CDATA 区段或未转义 ]]> 可能 导致 XML 文档格式不良。

A.2 解析 HTML 中的 Turtle

本节是非规范性的。

解析已嵌入的 Turtle 与解析普通 Turtle 文档之间 不存在句法或语法差异。 从 HTML DOM 解析出的 Turtle 文档将是字符数据流, 而不是 UTF-8 [RFC3629] 代码 点流。 如果 HTML 文档已经被解析为 DOM,则不需要解码。 每个 script 数据块都被视为其自身的 Turtle 文档。 Turtle 数据块中的 PREFIXBASE 声明 作用域限定于该数据块,不影响其他数据块。 HTML lang 属性或 XHTML xml:lang 属性 不影响数据块的解析。 封装 HTML 文档的基 URI 根据 RFC3986 第 5.1.1 节提供 “嵌入在内容中的基 URI”。

B. 隐私考量

本节是非规范性的。

Turtle 格式用于表达任意应用程序数据, 其中可能包括个人身份信息(PII) 或其他可被视为敏感的信息。 发布此类信息的作者应仔细 考虑发布此类信息的需求和用途, 以及预期消费并可能披露这些数据的地区所适用的法规 (例如 GDPRCCPA其他法规), 特别是是否需要授权措施来访问这些数据。

C. 安全考量

本节是非规范性的。

STRING_LITERAL_SINGLE_QUOTESTRING_LITERAL_QUOTESTRING_LITERAL_LONG_SINGLE_QUOTESTRING_LITERAL_LONG_QUOTE 产生式允许使用未转义的控制字符。 虽然本规范不会直接向最终用户暴露此内容, 但它可能通过用户代理呈现,而这类字符的呈现可能会导致 所显示的文本被混淆。

Turtle 是一种通用断言语言; 应用程序可以评估给定数据以推断更多断言,或解引用 IRI, 从而触发该 IRI 所用方案的安全考量。 特别注意,[RFC3023] 第 10 节中 关于 HTTP IRI 的隐私问题。 从不准确或恶意数据源获得的数据可能导致不准确或误导性的结论, 以及解引用非预期的 IRI。 必须注意使所咨询资源的可信度与 数据预期用途的敏感性相一致; 例如,潜在医疗治疗的推断所需的信任程度, 可能不同于旅行规划方面的推断。

Turtle 语言用于表达任意应用程序数据; 安全考量会因使用领域而异。 适用于文本的安全工具和协议 (例如 PGP 加密、校验和验证、受密码保护的压缩) 也可以用于 Turtle 文档。 必须施加反映嵌入信息敏感性的安全/隐私协议。

Turtle 可以表达会呈现给用户的数据,例如 RDF Schema 标签。 渲染从不受信任的 Turtle 文档获取的字符串、 或使用未转义字符的应用程序, 应该使用警告和其他适当手段,限制 恶意字符串可能被用来误导读者的可能性。 XML 媒体类型注册中的安全考量([RFC3023] 第 10 节) 就任意数据和标记的表达提供了额外指导。

Turtle 使用 IRI 作为 项标识符。 解释以 Turtle 表达的数据的应用程序应该处理 国际化 资源标识符(IRI) [RFC3987] 第 8 节以及 统一资源 标识符(URI):通用语法 [RFC3986] 第 7 节中的安全问题。

多个 IRI 可能 具有相同的外观。 不同文字系统中的字符可能看起来相似(例如, 西里尔字母“о”(代码点 U+043E)可能看起来类似于拉丁字母“o” (代码点 U+006F))。 一个字符后跟组合字符,可能与另一个字符具有相同的视觉表示 (例如,拉丁小写字母“E”(代码点 U+0065) 后跟组合尖音符(代码点 U+0301), 与带尖音的拉丁小写字母“E” (U+00E9)具有相同的视觉表示)。 任何书写或解释 Turtle 数据的人或应用程序 都必须小心使用与预期语义匹配的 IRI, 并避免使用可能看起来相似的 IRI。 关于匹配视觉相似字符的更多信息,可参见 Unicode 安全考量 [UNICODE-SECURITY] 和 国际化 资源标识符(IRI) [RFC3987] 第 8 节。

D. 互联网媒体类型和文件 扩展名

Turtle 的互联网媒体类型(以前称为 MIME 类型)是“text/turtle”。

以下信息已提交给互联网工程指导组(IESG)审查、 批准,并由 IANA 注册。

类型名称:
text
子类型名称:
turtle
必需参数:
可选参数:
version
此参数是可选的。 如果存在,version 的可接受值定义在 [RDF12-CONCEPTS] 的 版本标签 中。
profile
此参数是可选的,用于包含附加信息。 在不了解 profile 的情况下处理时,它不会改变资源表示的语义。 profile 参数的值是由空格分隔的非空 URI 列表。 有关更多信息和背景,请参阅 [RFC6906]。
编码考量:
Turtle 的语法以 Unicode [UNICODE] 中的代码点来表达。 编码始终为 UTF-8 [UTF-8]。
Unicode 代码点也可以 使用 \uXXXXU+0000U+FFFF) 或 \UXXXXXXXX 语法(用于最高到 U+10FFFF 的代码点) 表达,其中 X 是十六进制数字 [0-9A-Fa-f]
安全考量:
参见C. 安全 考量
互操作性考量:
没有已知的互操作性问题。
已发布规范:
本规范。
使用此媒体类型的应用程序:
Turtle 被广泛用于表示 RDF 数据。 大多数常见编程语言中都有可用实现。
附加信息:
魔数:
Turtle 文档开头附近可能有字符串“@prefix”或“@base”(区分大小写), 或字符串“PREFIX”或 “BASE”(不区分大小写)。
文件扩展名:
.ttl
基 URI:
Turtle 的“@base <IRIref>”或“BASE <IRIref>”项可以更改查询语言中 稍后在文档中按顺序使用的相对 IRI 引用的当前基 URI。
进一步信息的联系人和电子邮件地址:
RDF & SPARQL 工作组 <public-rdf-star-wg@w3.org>
预期用途:
通用
使用限制:
作者:
Turtle 规范是 RDF & SPARQL WG 的产物。W3C 保留对此规范的变更控制权。

profile 参数可由客户端用于在内容协商过程中表达其偏好, 也可由服务器用于指示 关于响应的附加信息。

如果客户端给出 profile 参数,则服务器应该 返回一个尊重该列表中服务器所识别的所有 profile 的文档。 服务器不应该仅基于 profile 值而以错误响应。

如果服务器给出 profile 参数,则客户端可以选择忽略它。

建议 profile URI 可被解引用, 并在该 URI 处提供有用的文档。

当作为 媒体类型参数 [RFC4288] 用于 HTTP Content-Type 标头HTTP Accept 标头 [RFC7231] 中时,如果 profile 参数的值包含特殊字符,例如空白字符,包括 用于分隔多个 profile URI 的任何空格, 则该值需要用引号(ASCII ")括起来。

重要的是要注意,profile 参数的值 包含一个或多个 URI,而不是 IRI。因此可能需要 按 [RFC3987] 的 第 3 节 IRI 与 URI 之间的关系 中的规定,在 IRI 和 URI 之间转换。

E. 致谢

E.1 RDF 1.1 致谢

本节是非规范性的。

这项工作曾在论文 RDF 的新语法 中描述,该论文讨论了其他 RDF 语法以及 Turtle 的背景 (提交给 WWW2004,在那里称为 N-Triples Plus)。

这项工作始于 语义 Web 高级开发欧洲(SWAD-Europe) 项目,该项目由欧盟 IST-7 计划 IST-2001-34732(2002-2004)资助, 后续开发由英国(2002 年至 2005 年 9 月) 布里斯托大学学习与研究技术研究所支持。

Gregg Kellogg、Andy Seaborne、Sandro Hawke 以及 RDF 工作组成员 为此版本作出了宝贵贡献。

通过更广泛社区的审查过程,本文档得到了改进。

E.2 RDF 1.2 致谢

本节是非规范性的。

除编辑外,以下人员也为本规范作出了贡献: Andrew Louis, Denis Ah-Kang, John Walker, Mirek Kratochvil, Niklas Lindström, Peter F. Patel-Schneider, Pierre-Antoine Champin, Ted Thibodeau Jr, Thomas Tanon, and William Van Woensel

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 以及相关标准更广泛生态系统的巨大贡献, 在此深表感谢。
编辑注

认可任务组成员?贡献者列表并不容易找到。

F. RDF 1.1 与 RDF 1.2 之间的变更

本节是非规范性的。

G. 索引

G.1 由本规范定义的术语

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

H. 参考文献

H.1 规范性参考文献

[BCP47]
用于识别语言的标签. A. Phillips, Ed.; M. Davis, Ed. IETF. 2009 年 9 月。最佳现行实践。URL:https://www.rfc-editor.org/rfc/rfc5646
[EBNF-NOTATION]
EBNF 表示法. Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau et al. W3C. W3C 推荐标准。URL:https://www.w3.org/TR/xml/#sec-notation
[I18N-GLOSSARY]
国际化术语表. Richard Ishida; Addison Phillips. W3C. 2024 年 10 月 17 日。W3C 工作组说明。URL:https://www.w3.org/TR/i18n-glossary/
[RDF12-CONCEPTS]
RDF 1.2 概念与抽象数据 模型. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 2026 年 4 月 7 日。W3C 候选 推荐标准。URL:https://www.w3.org/TR/rdf12-concepts/
[RFC2119]
用于在 RFC 中指示要求 级别的 关键词. S. Bradner. IETF. 1997 年 3 月。最佳现行实践。URL:https://www.rfc-editor.org/rfc/rfc2119
[RFC3629]
UTF-8,ISO 10646 的一种转换格式. F. Yergeau. IETF. 2003 年 11 月。互联网标准。URL:https://www.rfc-editor.org/rfc/rfc3629
[RFC3986]
统一资源标识符(URI):通用 语法. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005 年 1 月。互联网 标准。URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
国际化资源标识符 (IRI). M. Duerst; M. Suignard. IETF. 2005 年 1 月。拟议标准。URL:https://www.rfc-editor.org/rfc/rfc3987
[RFC6906]
“profile”链接关系类型. E. Wilde. IETF. 2013 年 3 月。资料性。URL:https://www.rfc-editor.org/rfc/rfc6906
[RFC8174]
RFC 2119 关键词中大小写的歧义. B. Leiba. IETF. 2017 年 5 月。最佳现行实践。URL:https://www.rfc-editor.org/rfc/rfc8174
[UNICODE]
Unicode 标准. Unicode Consortium. URL:https://www.unicode.org/versions/latest/

H.2 资料性参考文献

[HTML5]
HTML5. Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Theresa O'Connor; Silvia Pfeiffer. W3C. 2018 年 3 月 27 日。W3C 推荐标准。URL:https://www.w3.org/TR/html5/
[LANG-SUBTAG-REGISTRY]
语言 子标签注册表. IANA. URL:http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
[RDF-MT]
RDF 语义. Patrick Hayes. W3C. 2004 年 2 月 10 日。 W3C 推荐标准。URL:https://www.w3.org/TR/rdf-mt/
[RDF11-CONCEPTS]
RDF 1.1 概念与抽象 语法. Richard Cyganiak; David Wood; Markus Lanthaler. W3C. 2014 年 2 月 25 日。W3C 推荐标准。URL:https://www.w3.org/TR/rdf11-concepts/
[RDF12-INTEROP]
RDF 1.2 互操作性. Pierre-Antoine Champin. W3C. W3C 编辑草案。URL:https://w3c.github.io/rdf-interop/spec/
[RDF12-N-QUADS]
RDF 1.2 N-Quads. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-n-quads/
[RDF12-N-TRIPLES]
RDF 1.2 N-Triples. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 15 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-n-triples/
[RDF12-NEW]
RDF 1.2 的新变化. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL:https://w3c.github.io/rdf-new/spec/
[RDF12-PRIMER]
RDF 1.2 入门. Pierre-Antoine Champin; Niklas Lindström. W3C. 2026 年 4 月 16 日。DNOTE。URL:https://www.w3.org/TR/rdf12-primer/
[RDF12-SCHEMA]
RDF 1.2 Schema. Dominik Tomaszuk. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-schema/
[RDF12-SEMANTICS]
RDF 1.2 语义. Peter Patel-Schneider; Enrico Franconi; Dörthe Arndt. W3C. 2026 年 4 月 7 日。W3C 候选推荐标准。URL:https://www.w3.org/TR/rdf12-semantics/
[RDF12-TRIG]
RDF 1.2 TriG. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-trig/
[RDF12-XML]
RDF 1.2 XML 语法. Gregg Kellogg; Jerven Bolleman. W3C. 2026 年 4 月 9 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-xml/
[RFC3023]
XML 媒体类型. M. Murata; S. St. Laurent; D. Kohn. IETF. 2001 年 1 月。拟议标准。URL:https://www.rfc-editor.org/rfc/rfc3023
[RFC4288]
媒体类型规范和注册 程序. N. Freed; J. Klensin. IETF. 2005 年 12 月。最佳现行实践。 URL:https://www.rfc-editor.org/rfc/rfc4288
[RFC7231]
超文本传输协议(HTTP/1.1): 语义和 内容. R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014 年 6 月。拟议标准。 URL:https://httpwg.org/specs/rfc7231.html
[SPARQL12-CONCEPTS]
SPARQL 1.2 概念. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL:https://w3c.github.io/sparql-concepts/spec/
[SPARQL12-ENTAILMENT]
SPARQL 1.2 蕴涵制度. Peter Patel-Schneider. W3C. 2026 年 4 月 9 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-entailment/
[SPARQL12-FEDERATED-QUERY]
SPARQL 1.2 联邦 查询. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-federated-query/
[SPARQL12-GRAPH-STORE-PROTOCOL]
SPARQL 1.2 图存储 协议. Andy Seaborne; Thomas Pellissier Tanon. W3C. 2024 年 12 月 19 日。W3C 工作草案。 URL:https://www.w3.org/TR/sparql12-graph-store-protocol/
[SPARQL12-NEW]
SPARQL 1.2 的新变化. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL:https://w3c.github.io/sparql-new/spec/
[SPARQL12-PROTOCOL]
SPARQL 1.2 协议. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 4 月 26 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-protocol/
[SPARQL12-QUERY]
SPARQL 1.2 查询语言. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 5 月 28 日。W3C 工作 草案。URL: https://www.w3.org/TR/sparql12-query/
[SPARQL12-RESULTS-CSV-TSV]
SPARQL 1.2 查询结果 CSV 和 TSV 格式. Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-results-csv-tsv/
[SPARQL12-RESULTS-JSON]
SPARQL 1.2 查询结果 JSON 格式. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。W3C 工作 草案。URL:https://www.w3.org/TR/sparql12-results-json/
[SPARQL12-RESULTS-XML]
SPARQL 1.2 查询结果 XML 格式. Ruben Taelman; Dominik Tomaszuk; Thomas Pellissier Tanon. W3C. 2024 年 12 月 27 日。W3C 工作草案。 URL:https://www.w3.org/TR/sparql12-results-xml/
[SPARQL12-SERVICE-DESCRIPTION]
SPARQL 1.2 服务 描述. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-service-description/
[SPARQL12-UPDATE]
SPARQL 1.2 更新. Ruben Taelman; Andy Seaborne; Thomas Pellissier Tanon. W3C. 2026 年 4 月 23 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-update/
[TURTLE]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 2014 年 2 月 25 日。W3C 推荐标准。URL:https://www.w3.org/TR/turtle/
[UNICODE-SECURITY]
Unicode 安全 考量. Mark Davis; Michel Suignard. Unicode Consortium. 2014 年 9 月 19 日。Unicode 技术报告 #36。 URL:https://www.unicode.org/reports/tr36/tr36-15.html
[XML-NAMES]
XML 1.0 中的命名空间(第三版). Tim Bray; Dave Hollander; Andrew Layman; Richard Tobin; Henry Thompson et al. W3C. 2009 年 12 月 8 日。W3C 推荐标准。 URL:https://www.w3.org/TR/xml-names/
[XMLSCHEMA11-2]
W3C XML Schema 定义语言(XSD)1.1 第 2 部分: 数据类型. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 2012 年 4 月 5 日。W3C 推荐标准。URL:https://www.w3.org/TR/xmlschema11-2/