Copyright © 2008-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
资源描述框架 (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 还增加了对
带方向的语言标记字符串的支持。
本节描述本文档在发布时的状态。 当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准与草案 索引中找到。
本文档是 RDF 1.2 文档套件的一部分。 本文档定义了 Turtle,即简洁 RDF 三元组语言, 它是 RDF [RDF12-CONCEPTS] 的一种具体语法。
本文档由 RDF & SPARQL 工作组作为 工作草案发布,并使用 推荐标准 轨道。
作为 工作草案发布并不意味着 得到 W3C 及其成员的认可。
这是一份草案文档,可能随时被其他 文档更新、替换或废弃。除作为进行中的工作外, 不应引用本文档。 未来对此即将发布的推荐标准的更新可能会纳入 新特性。
本文档由一个按照 W3C 专利 政策运作的工作组制作。 W3C 维护了一个 任何专利 披露的公开列表, 这些披露与该工作组的交付物有关;该页面还包括 披露专利的说明。实际知晓某项专利的个人,若其认为该专利包含 必要权利要求, 必须按照 W3C 专利政策第 6 节披露相关信息。
本文档受 2025 年 8 月 18 日 W3C 流程文档管辖。
本节是非规范性的。
本文档定义了 Turtle,即简洁 RDF 三元组语言,它是 RDF [RDF12-CONCEPTS] 的一种具体语法。
Turtle 文档是 RDF 图的一种文本表示。 以下 Turtle 文档描述了 Green Goblin 与 Spiderman 之间的关系。
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 图。 RDF 图由三元组组成, 三元组由主体、谓词和对象构成。
注释可以跟随一个不属于
其他词法记号的 #,并持续到行尾。
最简单的三元组语句是
(主体、
谓词
和
对象)
项的序列,
形成一个 RDF 三元组,
并以句点 (.) 结束。
空白字符
(空格、
制表符、
LF,和/或
CR)
可以围绕各项,
除非在语法中指出其具有特殊意义。
<http://example.org/#spiderman>
<http://www.perceive.net/schemas/relationship/enemyOf>
<http://example.org/#green-goblin> .
同一主体通常会被许多谓词引用。
predicateObjectList 产生式
匹配一系列位于主体之后、并由 ; 分隔的谓词和对象。
这表示一系列具有该主体的 RDF 三元组,
每个谓词
和对象被分配到一个三元组。
因此,; 用于重复那些
仅在谓词和对象 RDF
项上不同的三元组的主体。
这两个示例是书写关于 Spiderman 的三元组的等价方式。
<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enemyOf> <http://example.org/#green-goblin> ;
<http://xmlns.com/foaf/0.1/name> "Spiderman" .
<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" .
与谓词一样,相同的主体和谓词也常常会与不同对象重复出现。
objectList 产生式
匹配一系列位于
谓词之后、并由 , 分隔的对象。
这表示一系列具有相同
主体
和谓词的 RDF 三元组,
每个对象被分配到一个三元组。
因此,, 用于重复那些
仅在对象 RDF
项上不同的三元组的主体和
谓词。
这两个示例是用两种语言书写 Spiderman 名字的等价方式。
<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Spiderman", "Человек-паук"@ru .
<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 中定义了四种 RDF 项: IRI (国际化 资源标识符)、 字面量、 空白 节点,以及 三元组 项; Turtle 为每一种都提供了多种书写方式。
Turtle 语言自其起源以来一直在演进,RDF
1.2
增加了新语法。
RDF 1.2 Turtle 引入了
VERSION 和
@version 指令,
以及可选的 version 媒体类型参数。
当使用诸如
初始文本方向
或三元组
项等新特性序列化 Turtle 时,
作者可以使用这些指令声明对新语法形式的使用。
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 |} .
也可以使用旧式指令
(注意末尾有一个“.”):
@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
媒体类型参数来声明版本:
HTTP/1.1 200 OK
Content-Type: text/turtle; version=1.2
在使用 RDF 1.2 特定特性时,例如
初始文本方向,
应在文档开头使用
VERSION
或 @version
指令声明具体的 RDF 版本。
这使不支持这些特性的解析器能够尽早检测到
这些特性的存在,并有可能
通知用户,使其有机会停止作业,
或以其他方式处理部分输入数据
将无法按预期处理这一事实。
一个 Turtle 文档中可以出现多个版本指令。 该指令适用于文档中跟随该指令的部分, 直到遇到另一个指令或到达文档末尾。
在没有当前版本指令时,会考虑作为 媒体类型一部分指定的任何版本。
如果没有任何版本信息,合理的默认值是 "1.1",以最大化
与 Turtle 前一版本 [TURTLE] 的兼容性。
无论如何,版本声明只是一个提示;
解析器不要求拒绝超出所声明版本的特性
(但可以用警告报告它们)。
虽然 "1.1" 是一个可接受的版本标签,
但不鼓励在 VERSION 或 @version 指令中使用它,
因为这会不必要地导致 Turtle 1.1 解析器失败。
IRI 可以
写为
已解析
IRI、
相对 IRI 引用,
或前缀名。
相对和已解析 IRI 以 < 开始,
后跟 >,并且
可以包含数字转义序列(如下所述)。
例如,<http://example.org/#green-goblin>。
像
<#green-goblin>
这样的相对 IRI 引用
会相对于当前基 IRI 解析。
可以使用 @base 或 BASE
指令定义新的基 IRI。此操作的具体细节定义在
6.3 IRI
引用中。
在 Turtle 三元组的谓词位置中的记号 a
表示 IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type。
前缀名是一个前缀
标签和一个
局部部分,
二者由 : 分隔。
前缀名通过将与前缀关联的 IRI
和局部部分连接起来转换为 IRI。
@prefix 或 PREFIX 指令
将
一个前缀标签与一个 IRI 相关联。
后续 @prefix 或 PREFIX
指令
可以重新映射同一个前缀标签。
Turtle 语言最初只允许包含
@ 字符的语法来书写 prefix 和 base
指令。
不区分大小写的
PREFIX、
BASE 和
VERSION
形式被加入,以使 Turtle 的语法与 SPARQL 的语法保持一致。
原有指令 @prefix、@base 或 @version 也可以
使用。
使用 PREFIX、
BASE 和
VERSION
可以使声明更容易复制到 SPARQL
查询中。
使用前缀名书写 http://www.perceive.net/schemas/relationship/enemyOf:
http://www.perceive.net/schemas/relationship/
定义一个前缀标签 somePrefix
somePrefix:enemyOf,它等价于书写
<http://www.perceive.net/schemas/relationship/enemyOf>
这可以使用用于 前缀声明的 SPARQL 风格语法来书写:
PREFIX somePrefix: <http://www.perceive.net/schemas/relationship/>
<http://example.org/#green-goblin> somePrefix:enemyOf <http://example.org/#spiderman> .
或使用原始的 Turtle 前缀声明语法:
@prefix somePrefix: <http://www.perceive.net/schemas/relationship/> .
<http://example.org/#green-goblin> somePrefix:enemyOf <http://example.org/#spiderman> .
以下 Turtle 文档包含了在 Turtle 中书写 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 foaf: <http://xmlns.com/foaf/0.1/>
<http://example.org/#green-goblin> foaf:name "Green Goblin" .
<http://example.org/#spiderman> foaf:name "Spiderman" .
带引号的字面量(语法产生式
RDFLiteral)具有一个词法形式,
后跟一个语言标签
(可能包含初始文本方向)、
一个数据类型 IRI,或两者都没有。
词法形式的表示由一个初始定界符
(例如
"、
'、
""",或
''');
一串允许的字符、数字转义序列
和/或字符串转义序列;以及一个与
初始定界符匹配的最终定界符组成。
相应的 RDF 词法
形式
是定界符之间的字符,并已处理任何转义序列。
如果存在,语言标签前面会有
一个 @,
并且后面可以跟一个初始文本方向,
它与语言标签由 -- 分隔。
如果没有语言标签,则可以有一个数据类型 IRI,
前面由 ^^ 引出。
Turtle 中的数据类型 IRI 可以使用
已解析 IRI、
相对 IRI 引用
或前缀名来书写。
如果既没有数据类型 IRI 也没有语言标签,
数据类型为 xsd:string。
\
不得出现在任何带引号的字面量中,除非作为转义序列的一部分。
其他限制取决于定界符:
' 定界的字面量
不得包含未转义的
'、
LF,也不得包含
CR
字符。
" 定界的字面量
不得包含未转义的
"、
LF,也不得包含
CR
字符。
''' 定界的字面量不得包含这样的
序列。""" 定界的字面量不得包含这样的
序列。
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
数字可以像其他字面量一样以词法形式和数据类型来书写
(例如 "-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]”。 |
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
布尔值可以写作 true
或 false(区分大小写),
并表示数据类型为 xsd:boolean
的 RDF 字面量
[XMLSCHEMA11-2]。
PREFIX : <http://example.org/stats/>
<http://somecountry.example/census2007>
:isLandlocked false . # xsd:boolean
Turtle 中的 RDF 空白
节点表示为
_: 后跟一个空白节点标识符,该标识符是一串
字符。
标识符中的字符基于
PN_CHARS_BASE 构建,
并按如下方式放宽:
_ 和
数字字符 0–9
可以出现在
空白节点标识符中的任何位置。
. 可以出现在除
第一个或最后一个字符以外的任何位置。-、
·、
‿、
⁀,
以及
组合变音标记(U+0300
到 U+036F)
允许出现在除第一个字符以外的任何位置。
文档中的每个唯一空白节点标识符都会分配一个新的 RDF 空白 节点。 重复使用同一个空白节点标识符会标识同一个空白 节点。
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
_:alice foaf:knows _:bob .
_:bob foaf:knows _:alice .
在 Turtle 中,当匹配
blankNodePropertyList
产生式和终结符 ANON 时,也会分配新的 RDF 空白
节点。
这两者都可以出现在三元组的
subject
或 object 位置
(参见 Turtle 语法)。
该主体或对象是一个新的 RDF 空白
节点。
这个空白节点也充当匹配
嵌入在 blankNodePropertyList 中的 predicateObjectList 产生式所产生三元组的主体。
这些三元组的生成在
谓词列表中描述。
空白节点也会为下面描述的集合
分配。
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
是表示一个节点一系列属性的常见惯用法。
| 缩写形式: | 对应的简单三元组: |
|---|---|
|
|
RDF 提供了一种用于 RDF 节点列表的集合 [RDF12-SEMANTICS]
结构。
Turtle 中集合的语法是一个可能为空的 RDF
项列表,该列表由 () 包围。
这个集合表示一个 rdf:first/rdf:rest
列表结构,其中 rdf:first
语句的对象序列就是由 () 包围的项的顺序。
(…) 语法必须出现在三元组的
subject
或 object 位置
(参见 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 () .
三元组
项
表示为一个 tripleTerm,其中包含
ttSubject、
predicate 和
ttObject,
全部以 <<( 开头,
并全部以 )>> 结束。
注意,三元组项
可以嵌套。
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 .
在 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
后面没有立即跟随一个 iri
或 BlankNode,
则会分配一个新的 RDF 空白
节点,
如 << :subject :predicate :object >>
或 << :subject :predicate :object ~ >> 所示。
reifiedTriples 可以嵌套,
例如
<< :subject1 :predicate1 << :subject2 :predicate2 :object2 >> ~:IRIREF1 >>
或
<< :subject4 :predicate4 << :subject3 :predicate3 :object3 ~:IRIREF3 >> >>。
如果一个 reifiedTriple
没有由 IRI
或 空白
节点标识,
则会分配一个新的 RDF 空白
节点
并用它标识这种关系。
VERSION "1.2"
PREFIX : <http://www.example.org/>
:employee38 :familyName "Smith" .
<< :employee38 :jobTitle "Assistant Designer" >> :accordingTo :employee22 .
PREFIX : <http://www.example.org/>
:employee38 :familyName "Smith" .
<< :employee38 :jobTitle "Assistant Designer" ~ _:id >> :accordingTo :employee22 .
PREFIX : <http://www.example.org/>
:employee38 :familyName "Smith" .
_:id rdf:reifies <<( :employee38 :jobTitle "Assistant Designer" )>> .
_:id :accordingTo :employee22 .
注意 reifiedTriple 的语法糖
(即 << [...] >>)与常规的
tripleTerm(即
<<( [...] )>>)之间的语法差异。
在声明一个前缀以便可以缩写 IRI 之后,
此示例中的第一个三元组断言 employee38 的 familyName 为
"Smith"。
注意,该图并未断言 employee38 的 jobTitle 为
"Assistant
Designer";
它表示 employee22 使用一个
reifiedTriple 作出了该主张。
换句话说,三元组“employee38 的 jobTitle 为 'Assistant Designer'”
本身并不是该图的成员,这与上面的“employee38 的 familyName 为 'Smith'”不同;
相反,它被称为一个具体化三元组。
reifiedTriple 是一种语法糖,用
rdf:reifies 谓词将
具体化器关联到
tripleTerm。
Turtle 还定义了一种注解 语法, 用于同时具体化并断言一个三元组, 从而提供一种方便的快捷方式。 注解可用于通过显式或隐式标识符 同时断言一个三元组, 并使该三元组成为 进一步三元组的 主体或 对象。 如果显式标识,则同一个具体化器 之后可以用作 其他 三元组和/或三元组项的 主体或 对象。
与 reifiedTriple 一样,
注解语法使用一个具体化器,写作
一个 IRI
或一个
空白
节点,
前面带有一个波浪号 (~),
用于标识正在具体化的
三元组
项。
然而,虽然
reifiedTriple
最多只能包含一个具体化器,注解语法可以包含
任意数量的具体化器。每个具体化器
都会导致产生一个对应的
具体化三元组。
具体化器后面可以跟一个注解块。
如果一个具体化器后面没有跟注解块,则会
类似于没有附加注解的
reifiedTriple
来处理。
如果一个注解块前面没有立即出现具体化器,
则会分配一个新的 RDF 空白节点来充当
被具体化的
三元组
项的具体化器。
注解语法是 Turtle 中的一种语法快捷方式。 RDF 抽象语法 [RDF11-CONCEPTS] 不区分 三元组是如何写出的。
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 |} .
与以下三元组集合相同:
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 .
完全展开为使用三元组项 而不是具体化器,会得到如下内容:
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 空白节点, 作为 三元组 项的具体化器。
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 空白
节点:
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 空白节点,该节点作为其具体化器被分配。
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
空白节点:
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 .
注解语法也可以包含多个没有注解块的显式 具体化器。每个这样的具体化器 都会导致产生一个对应的具体化三元组。
VERSION "1.2"
PREFIX : <http://example.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
:alice :name "Alice" ~ :stmt1 ~ :stmt2 .
完全展开此示例会得到以下三元组:
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" )>> .
本节是非规范性的。
此示例是 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 集合示例。
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 可以是
subject 或
object。
如果该集合包含一个或多个对象,则此主体或对象将是第一个对象的新
空白节点;
如果该集合为空,则为 rdf:nil。
例如,
PREFIX : <http://example.org/stuff/1.0/>
(1 2.0 3E1) :p "w" .
是以下内容的语法糖(注意
空白
节点
b0、b1 和 b2
不会出现在该 RDF 图的其他任何地方):
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 集合可以嵌套,并且可以涉及其他 语法 形式:
PREFIX : <http://example.org/stuff/1.0/>
(1 [:p :q] ( 2 ) ) :p2 :q2 .
是以下内容的语法糖:
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 .
本节是非规范性的。
SPARQL 1.2 查询语言 (SPARQL)[SPARQL12-QUERY] 在其 TriplesBlock 产生式中使用 Turtle 风格的语法。 该产生式与 Turtle 语言的不同之处在于:
?name 或
$name)
出现在该形式三元组的任意部分。
a 除外。
Turtle 的 @prefix 和 @base 声明区分大小写,
派生自 SPARQL 的
PREFIX 和 BASE 不区分大小写。
true 和 false 在 SPARQL
中不区分大小写,而在 Turtle 中区分大小写。
TrUe 在 Turtle 中不是有效的布尔值。
更多信息请参见 SPARQL 查询文档 [SPARQL12-QUERY] 中的 IRI 语法 和 SPARQL 语法 小节。
除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。 本规范中的其他所有内容均为规范性内容。
本文档中的关键词 可以、必须、不得 和 应该 应按照 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 解析器如何处理不一致的输入文档。
Turtle 的媒体类型是 text/turtle。
Turtle 内容的内容编码始终是 UTF-8 [RFC3629]。
Turtle 文档是一个以 UTF-8 [RFC3629] 编码的 RDF 字符串。
只允许使用
Unicode 标量值,
其范围为 U+0000 至 U+D7FF
以及 U+E000 至 U+10FFFF。
这排除了
代理代码点,
即 U+D800 至 U+DFFF 范围。
空白字符(产生式 WS)用于分隔两个
否则会被(错误地)识别为一个终结符的终结符。下面以大写表示的规则名称指示
空白字符在何处具有意义;这些规则构成了用于构造 Turtle 解析器的一种可能终结符选择。
空白字符在 String 产生式中具有意义。
Turtle 中的注释以位于
IRIREF、
STRING_LITERAL_SINGLE_QUOTE、
STRING_LITERAL_QUOTE、
STRING_LITERAL_LONG_SINGLE_QUOTE
或
STRING_LITERAL_LONG_QUOTE
之外的 # 开始,
并持续到行尾(由
LF 或
CR 标记),
如果注释标记之后没有行尾,则持续到文件结尾。
注释被视为空白字符。
相对 IRI 引用按 统一资源 标识符(URI):通用语法 [RFC3986] 使用第 5.2 节中的 基本算法根据基 IRI 进行解析。 不执行基于语法的规范化,也不执行基于方案的规范化 (RFC3986 第 6.2.2 和 6.2.3 节中描述)。 IRI 引用中额外允许的字符按照 RFC3987 第 6.5 节中对 URI 引用中的非保留字符的处理方式处理,参见 国际化资源 标识符(IRI) [RFC3987]。
@base 或 BASE 指令
定义用于解析相对 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”)。
每个 @base 或 BASE 指令都会设置
一个新的
作用域内基 URI,
并相对于前一个基 URI。
Turtle 文档中使用三种形式的转义:
数字转义序列表示 一个 Unicode 代码点的值。
数字转义序列不得
产生位于 U+D800 至 U+DFFF
范围内的代码点值,
这是 Unicode 代理项的范围。
| 转义序列 | Unicode 代码点 |
|---|---|
\u hex
hex
hex
hex
|
一个位于 U+0000 至 U+D7FF
以及 U+E000 至 U+FFFF
范围内的 Unicode 代码点,
对应于由四个十六进制数字从最高有效位到最低有效位解释后编码的值。 |
\U hex
hex
hex
hex
hex
hex
hex
hex
|
一个位于 U+0000 至
U+D7FF
以及 U+E000 至 U+10FFFF
范围内的 Unicode 代码点,
对应于由八个十六进制数字
从最高有效位到最低有效位解释后编码的值。
|
其中 hex 是一个十六进制字符
HEX ::= [0-9] |
[A-F] |
[a-f]
字符串转义序列表示一个 传统上会在字符串字面量中转义的字符:
| 转义序列 | Unicode 代码点 |
|---|---|
\t |
U+0009 |
\b |
U+0008 |
\n |
U+000A |
\r |
U+000D |
\f |
U+000C |
\" |
U+0022 |
\' |
U+0027 |
\\ |
U+005C |
保留字符转义序列由一个
\
后跟这些字符之一 ~.-!$&'()*+,;=/?#@%_ 构成,
并表示 \ 右侧的字符。
| 数字 转义 |
字符串 转义 |
保留
字符 转义 |
|
|---|---|---|---|
IRI,
用作 RDF 项,
或用于 @prefix、
PREFIX、
@base
或 BASE 声明中
|
是 | 否 | 否 |
| 局部 名称 | 否 | 否 | 是 |
| 字符串 | 是 | 是 | 否 |
转义序列的处理方式是:取得与相关语法产生式匹配的 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 |
此处使用的 EBNF 定义于 XML 1.0 [EBNF-NOTATION]。
注:
@base'、
'@prefix'、
'@version'、
'a'、
'true' 和
'false')
区分大小写。
双引号中的关键字
("BASE"、
"PREFIX" 和
"VERSION")
不区分大小写。
UCHAR
和 ECHAR
区分大小写。
turtleDoc。
@prefix'、
'@base' 和
'@version'
匹配 LANG_DIR 的模式,
尽管 prefix、
base 和 version
都不是已注册的语言子标签。
本规范未定义后跟这些记号之一的带引号字面量
(例如 "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 |
::= | '\' ('_' | '~' | '.' | '-' | "!" | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%') |
此语法的文本版本可在此处获得。
本文档使用一些特定的终结符字面量字符串 [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 字符序列组成:
spaceU+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)
_:_ 后跟 :--- 字符RDF 1.2 Concepts and Abstract Syntax 规范
[RDF12-CONCEPTS] 定义了四种 RDF 项:
IRI、
字面量、
空白
节点,以及
三元组
项。
字面量由一个词法形式
和一个可选的语言标签 [BCP47] 组成
—— 可能包含一个初始文本方向 ——
或者由数据类型 IRI组成。
解析期间会使用一种额外类型 prefix,用于将字符串标识符
映射到
命名空间 IRI。
本节通过将与产生式和词法记号匹配的字符串映射到
RDF 项或其组成部分(例如语言
标签、字面量的词法
形式),把符合 6.5
语法中的语法的字符串
映射为一组三元组。
语法产生式会改变解析器状态并发出三元组。
解析 Turtle 需要包含九个项的状态:
base 产生式时,第二个规则
参数
IRIREF 是用于相对
IRI 解析的基 URI。
prefixID 产生式中
的第二个和第三个规则参数
(PNAME_NS 和 IRIREF)
为前缀
(PNAME_NS)
分配一个命名空间名称(IRIREF)。
在
prefixID 或
sparqlPrefix 产生式之外,
任何 PNAME_NS 都会被替换为
当前状态的 namespaces 映射中的命名空间。
注意,根据
PNAME_NS 产生式:
PN_PREFIX? ':',前缀可以是空字符串。
subject、
rtSubject、
ttSubject、
blankNodePropertyList、
collection 和
annotationBlock
产生式。
verb 产生式。
如果匹配的记号是 a,
curPredicate 会绑定到 IRI
http://www.w3.org/1999/02/22-rdf-syntax-ns#type。
object、
rtObject 和
ttObject 产生式。
reifier 和
annotationBlock 产生式。
xsd:string curVersion –
用于把文档解析为三元组的 RDF 版本。
如果作为媒体类型的一部分指定,则
curVersion
的默认值取自 version 参数。
curVersion 的可接受值定义在 [RDF12-CONCEPTS] 的 2.1 版本标签中。
版本声明只是一个提示;
本规范不强制要求解析器基于 curVersion 采取任何行为,
但解析器在遇到与 curVersion 的值不匹配的特性,
或遇到 curVersion 的不可接受值时,可以报告错误或警告。
项构造器可以创建这些值的栈,表示方式为 使用诸如“记录 curSubject 和 curPredicate”这样的语言。
此表将产生式和词法记号映射到 RDF 项 或 RDF 项的组成部分, 这些项列在 7. 解析中:
| 产生式 | 类型 | 过程 |
|---|---|---|
| IRIREF | IRI | 取 <
和 > 之间的字符,
对其中的数字转义序列进行反转义,
以形成 IRI。相对 IRI 引用解析
按
第 6.3 节执行。生成的 IRI 必须符合通用
IRI 语法的句法限制,并且
应该符合 [RFC3986] 的
第 3.3 节,并遵守
相应 IRI 方案规范施加的任何
更窄限制。
|
| PNAME_NS | prefix | 当用于 prefixID 或 sparqlPrefix 产生式时,
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 节格式良好。
如果存在,初始文本方向必须是
ltr 或 rtl。
|
| RDFLiteral | 字面量 | 该字面量具有第一个规则参数 String 的词法形式。如果匹配
'^^' iri
规则,则数据类型 IRI从
iri 派生,并且该
字面量没有语言标签。如果匹配 LANG_DIR 规则,则语言标签和初始文本方向取自
LANG_DIR。如果没有
初始文本方向,则
数据类型为
rdf:langString。如果存在初始文本方向,则
数据类型为
rdf:dirLangString。如果两者都未匹配,则数据类型为 xsd:string,
且该字面量没有语言标签。
|
| INTEGER | 字面量 | 该字面量具有输入字符串的词法形式,且数据类型为
xsd:integer。
|
| DECIMAL | 字面量 | 该字面量具有输入字符串的词法形式,且数据类型为
xsd:decimal。
|
| DOUBLE | 字面量 | 该字面量具有输入字符串的词法形式,且数据类型为
xsd:double。
|
| BooleanLiteral | 字面量 | 该字面量具有 true 或 false 的词法形式,取决于
哪一个匹配输入,且数据类型为 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 | 三元组项 |
三元组项
由从
ttSubject、
predicate 和
ttObject 产生式构造出的项组成。
|
| reifiedTriple | IRI | 空白 节点 |
项取自匹配的
reifier(如果有),
或取自一个新的 RDF 空白
节点。
|
| annotationBlock | IRI | 空白 节点 | 项取自先前匹配的具体化器(如果有), 或取自一个新的 RDF 空白 节点。 |
由于检测输入错误的处理器可能会产生 比输入中所描述的三元组更少的图 (包括完全没有三元组), 因此消费者在使用输出三元组时, 应考虑已报告的任何错误信息, 这些输出三元组可能不完整和/或包含 类型不正确 或形式不正确的项。
Turtle 文档定义了一个由一组 RDF 三元组组成的 RDF 图。
subject 产生式设置
curSubject。
verb 产生式设置
curPredicate。
object 和 ttObject 产生式设置
curObject。
文档中的每个 object
N
都产生一个 RDF 三元组:
curSubject
curPredicate N .
开始 reifier 产生式时,
curReifier 取自 reifier 项
构造器。
然后产出 RDF 三元组 curReifier
rdf:reifies curTripleTerm。
开始 reifiedTriple 产生式时,
会记录 curTripleTerm。
使用
rtSubject、
verb 和
rtObject 产生式创建一个新的
tripleTerm 实例
curTripleTerm。
结束 reifiedTriple 产生式时,
如果 curReifier 未设置,则为其分配一个新的 RDF 空白
节点;
接着它产出 RDF 三元组
curReifier
rdf:reifies curTripleTerm,
然后恢复记录的 curTripleTerm 值。
通过匹配 reifiedTriple
产生的节点是 curReifier。
开始 annotation 产生式时,
会记录 curSubject 和 curPredicate。
使用 curSubject、curPredicate、curObject
创建一个新的 tripleTerm 实例
curTripleTerm,
并清除 curReifier 的值。
结束 annotation 产生式时,
恢复记录的 curSubject 和 curPredicate 值。
开始 annotationBlock
产生式时,
会记录 curTripleTerm。
如果 curReifier 未设置,则为其分配一个新的 RDF 空白
节点,
并且该产生式产出 RDF 三元组
curReifier rdf:reifies curTripleTerm。
curSubject 取自 curReifier。
结束 annotationBlock
产生式时,
清除 curReifier 的值
并恢复 curTripleTerm。
如果 curReifier 已经被设置,则
具体化三元组 curReifier rdf:reifies curTripleTerm
已在 7.3.1
具体化器中发出。
开始 blankNodePropertyList
产生式时,会记录 curSubject 和 curPredicate,
并将 curSubject 设置为一个新的空白节点 B。
结束 blankNodePropertyList
产生式时,会恢复 curSubject 和 curPredicate。
通过匹配 blankNodePropertyList
产生的节点是空白节点 B。
开始 collection 产生式时,
会记录
curSubject 和 curPredicate。
collection 产生式中的每个
object 都会将
curSubject 设置
为一个新的空白节点 B,并将
curPredicate 设置为
rdf:first。
第一个之后的每个对象 objectn 都产生一个三元组:objectn-1 rdf:rest
objectn .
结束 collection 产生式时,
会创建一个
额外的三元组 curSubject rdf:rest rdf:nil . 并
恢复
curSubject 和 curPredicate。
通过匹配 collection
产生的节点,对于非空列表是第一个空白节点 B,
对于空列表是 rdf:nil。
本节是非规范性的。
以下资料性示例展示了使用 LALR(1) 解析器解析此 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> .
ericFoaf 映射到 IRI
http://www.w3.org/People/Eric/ericP-foaf.rdf#。
http://xmlns.com/foaf/0.1/。http://www.w3.org/People/Eric/ericP-foaf.rdf#ericP。
http://xmlns.com/foaf/0.1/givenName。<...rdf#ericP> <.../givenName>
"Eric"
.http://xmlns.com/foaf/0.1/knows。<...rdf#ericP> <.../knows>
<...who/dan-brickley> .<...rdf#ericP> <.../knows>
_:1 .
_:1。http://xmlns.com/foaf/0.1/mbox。_:1 <.../mbox>
<mailto:timbl@w3.org>
.<...rdf#ericP>、<.../knows>)。<...rdf#ericP> <.../knows>
<http://getopenid.com/amyvdh> .本节是非规范性的。
HTML [HTML5]
script 标签
可用于在文档中嵌入数据块。Turtle 可以通过这种方式轻松嵌入 HTML。
<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 文档编码匹配。
本节是非规范性的。
与 JavaScript 一样,为 HTML(text/html)编写的 Turtle 在 XHTML
(application/xhtml+xml)中使用时可能会出错。
解决方案与 JavaScript 所用的方案相同。
<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/html
和 application/xhtml+xml 提供的多语种文档中保持安全。
未使用 CDATA 区段或未转义 ]]> 可能
导致
XML 文档格式不良。
本节是非规范性的。
解析已嵌入的 Turtle 与解析普通 Turtle 文档之间
不存在句法或语法差异。
从 HTML DOM 解析出的 Turtle 文档将是字符数据流,
而不是 UTF-8 [RFC3629] 代码
点流。
如果 HTML 文档已经被解析为 DOM,则不需要解码。
每个 script 数据块都被视为其自身的 Turtle 文档。
Turtle 数据块中的 PREFIX 和 BASE 声明
作用域限定于该数据块,不影响其他数据块。
HTML lang 属性或 XHTML xml:lang 属性
不影响数据块的解析。
封装 HTML 文档的基 URI 根据 RFC3986 第 5.1.1 节提供
“嵌入在内容中的基 URI”。
本节是非规范性的。
Turtle 格式用于表达任意应用程序数据, 其中可能包括个人身份信息(PII) 或其他可被视为敏感的信息。 发布此类信息的作者应仔细 考虑发布此类信息的需求和用途, 以及预期消费并可能披露这些数据的地区所适用的法规 (例如 GDPR、 CCPA、 其他法规), 特别是是否需要授权措施来访问这些数据。
本节是非规范性的。
STRING_LITERAL_SINGLE_QUOTE、
STRING_LITERAL_QUOTE、
STRING_LITERAL_LONG_SINGLE_QUOTE
和
STRING_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 节。
Turtle 的互联网媒体类型(以前称为 MIME 类型)是“text/turtle”。
以下信息已提交给互联网工程指导组(IESG)审查、 批准,并由 IANA 注册。
versionversion 的可接受值定义在
[RDF12-CONCEPTS] 的
版本标签
中。
profileprofile 参数的值是由空格分隔的非空 URI 列表。
有关更多信息和背景,请参阅 [RFC6906]。
\uXXXX(U+0000 至 U+FFFF)
或 \UXXXXXXXX 语法(用于最高到 U+10FFFF 的代码点)
表达,其中 X 是十六进制数字 [0-9A-Fa-f]
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 之间转换。
本节是非规范性的。
这项工作曾在论文 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 工作组成员 为此版本作出了宝贵贡献。
通过更广泛社区的审查过程,本文档得到了改进。
本节是非规范性的。
除编辑外,以下人员也为本规范作出了贡献: 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
认可任务组成员?贡献者列表并不容易找到。
本节是非规范性的。
STRING_LITERAL_QUOTE
和 STRING_LITERAL_SINGLE_QUOTE 所含字符的资料性限制。LANGTAG 终结符产生式更改为
LANG_DIR,以包含
一个可选的初始文本方向。
@version 不匹配
LANG_DIR;
该语法的上一版本会允许这种匹配,
但会导致产生一个根据 [BCP47] 格式不良的语言标签字面量,
并形成
无效字面量。
profile 媒体类型参数,
以允许客户端和服务器为 Turtle 表示传达附加 profile 信息,
而不改变其语义。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: