主要翻译如下页面,https://www.w3.org/TR/turtle/,对该页面中Turtle的内容部分进行翻译,希望对使用Turtle的朋友们有所帮助。
1 简介
2 Turtle语言
2.1 简单的三元组
2.2 谓词列表
2.3 宾语列表
2.4 IRIs
2.5 RDF字面量
2.5.1 引用的字面量
2.5.2 数字
2.5.3 布尔值
2.6 RDF空节点
2.7 Turlte中的嵌套无标签空节点
2.8 集合
3 举例
4. Turtle与SPARQL的对比
5 一致性
5.1 媒体类型和内容编码
6 Turtle语法
6.1 White Space(空格)
6.2 注释
6.3 国际资源标识符参考文献(IRI References)
6.4 转义序列
6.5 语法
7 解析
7.1 解析状态
7.2 RDF术语构造器
7.3 RDF三元组构造器
7.4 解析举例
1 简介
这个文档是对Turtle的定义,Turtle是简洁的RDF三元组语言,是对RDF图数据的文本表示。下面的Turtle例子描述了Green Goblin和Spiderman之间的关系。
EXAMPLE 1
@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和相对IRIs,@prefix和前缀名,利用分号分隔的谓词列表,利用逗号分隔的宾语列表,标记a以及字面量。
针对三元组的Turtle语法是针对三元组块的SPARQL 1.1 查询语言语法的子集。两个语法在可能的情况下共享产品和终端名。
利用Turtle文件构建RDF图定义在第6章Turtle语法和第7章解析中。
2 Turtle语言
Turtle文档是以紧凑的文本形式来描述一个RDF图,这种RDF图是由主语、谓词、宾语组成的三元组构成的。
注释跟在“#”后面,直到这一行结束,其中“#”不属于另外的词汇标记(“a”就是一个词汇标记)。
2.1 简单的三元组
最简单的三元组语句是一个主谓宾的序列,每个三元组通过空格分隔主谓宾,以“.”号结束。
EXAMPLE 2
< http://example.org/#spiderman > < http://www.perceive.net/schemas/relationship/enemyOf > < http://example.org/#green-goblin > .
2.2 谓词列表
三元组有一种情况是,同一个主语,后面跟着很多谓词。谓词列表就是表示一个主语跟着一连串谓词的情况,通过";"号分隔,后面跟着宾语。它可以表示一连串的三元组,这些三元组有一个共同的主语,后面的谓词和宾语与前面的主语组成一个三元组。因此,";"号被用于有重复主语的三元组,不同仅仅在于谓词和宾语。
下面两个例子描述Spiderman的三元组是等价的。
EXAMPLE 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" .
EXAMPLE 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 宾语列表
像谓词重复使用主语一样,宾语也经常重复使用相同的主语和谓词组合。宾语列表就是指一连串的宾语,通过","分隔,跟在谓词后面。它表示一连串的三元组,这些三元组具有相同的主语和谓词,只有宾语不同,因此,","被用于重复主语和谓词,只有宾语不同的三元组中。
以下两个例子是等价的,都是用两种语言描述Spiderman的名字。
EXAMPLE 5
< http://example.org/#spiderman > < http://xmlns.com/foaf/0.1/name > "Spiderman", "Человек-паук"@ru .
EXAMPLE 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概念中,定义了三种类型的RDF术语,分别是IRIs(国际资源标识符),字面量和空节点。Turtle采用多种方式来描述它们。
2.4 IRIs
IRIs可以被写成相对的或绝对的IRIs或者前缀名。相对和绝对IRIs是由"<"和">"包围,比如 < http://example.org/#green-goblin > . , 还可能包含数字转义序列。
像<#green-gobin>一样的相对IRIs相对于当前的基准IRI解析。一个新的基准IRI使用"@base"或"BASE"指令来定义,这个操作符的标准规范定义在6.3节IRI引用中。
在三元组中谓词位置的标识符"a"代表着IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type .
前缀名称由前缀标签和本地部分组成,以":"符号分隔。一个前缀名称通过连接前缀对应的IRI和本地部分,将这个前缀名称转换为IRI。"@prefix"或者"PREFIX"指令将前缀标签和IRI相关联,后续的"@prefix"或"PREFIX"指令可以重新映射同样的前缀标签。
注意
Turtle语言的语法最开始仅允许使用包含"@"符号来书写前缀和基准指令。大写的"PREFIX"和"BASE"格式是后来增加的,用来对齐Turtle语法和SPARQL语法。建议使用"@prefix"和"@base"格式来序列化RDF,直到RDF1.1 Turtle解析器广泛部署。
下面使用前缀名称来写 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 >
上面的例子,可以对前缀声明使用原始的Turtle语法编写:
EXAMPLE 7
@prefix somePrefix: < http://www.perceive.net/schemas/relationship/ > .
< http://example.org/#green-goblin > somePrefix:enemyOf < http://example.org/#spiderman > .
或者对前缀声明使用SPARQL语法:
EXAMPLE 8
PREFIX somePrefix: < http://www.perceive.net/schemas/relationship/ >
< http://example.org/#green-goblin > somePrefix:enemyOf < http://example.org/#spiderman > .
注意
前缀名称是XML限定名的超级。它们的区别在于前缀名称的本地部分可能包含:
前导数字,例如 leg:3032571 or isbn13:9780136019701
非前导冒号,例如 og:video:height
保留字符转义序列,例如 wgs:lat\-long
下面的例子9展示了Turtle编写IRIs的所有不同方式。
EXAMPLE 9
# A triple with all absolute IRIs
< http://one.example/subject1 > < http://one.example/predicate1> < http://one.example/object1 > .
@base < http://one.example/ > .
< subject2 > < predicate2 > < object2 > . # relative IRIs, e.g. http://one.example/subject2
BASE < http://one.example/ >
< subject2 > < predicate2 > < object2 > . # relative IRIs, 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后面跟"."结尾,等价的PREFIX"和"BASE"不必在IRI后面跟"."结尾。
2.5 RDF字面量
字面量用来标识像字符串,数字,日期等类型的值。
EXAMPLE 10
@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.5.1 引用的字面量
引用的字面量(语法也称RDF字面量)具有这样的词汇格式,后面跟语言标记,数据类型标记,或什么都不跟。这种词汇格式的表现是有一个开始分界符,例如"(U+0022),一个允许的字符序列或者数字转义序列或者字符串转义序列,还有一个结束的分界符。对应的RDF词汇格式是在处理任意转义序列之后,分界符之间的字符。语言标记如果存在的话,跟在"@"(U+0040)后面,如果没有语言标记,可能会有数据类型IRI,跟在"^^"(U+005EU+005E)后面,在Turtle中的数据类型IRI可以使用一个绝对IRI,一个相对IRI或者前缀名称来编写。如果没有语言标记,也没有数据类型IRI,数据类型就是xsd:string.
"\"(U+005C)除了作为转义序列的一部分是不会出现在任何引用的字面量中。其它限制就和分界符有关了。
以单引号'(U+0027)作为字面量的分界符,不可以包含单引号',换行LF(U+000A)或回车CR(U+000D)。
以双引号"作为字面量的分界符,不可以包含双引号",换行LF(U+000A)或回车CR(U+000D)。
以三个单引号'''作为字面量的分界符,不可以包含三个单引号'''。
以三个双引号"""作为字面量的分界符,不可以包含三个双引号"""。
EXAMPLE 11
@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 '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 embedded new lines and quotes
literal with many quotes (""""")
and up to two sequential apostrophes ('').''' .
2.5.2 数字
数字能够像其它字面量一样表示,也是由词汇形式和数字类型组成(比如,"-0.5"^^xsd:decimal)。Turtle有一种简写语法来编写整型数值,任意精度的十进制数值,以及双精度浮点型数值。
数据类型 缩写 语法 描述
xsd:integer -5 "-5"^^xsd:integer 整型数据由一个正负号和一连串的数字组成,整型数据的正则表达式为"[+-]?[0-9]+"。
xsd:decimal -5.0 "-5.0"^^xsd:decimal 任意精度十进制数是由正负号,0或多个数字,一个小数点,和一个或多个数字组成。十进制数对应的正则表达式为"[+-]?[0-9]*\.[0-9]+"
xsd:double 4.2E9 "4.2E9"^^xsd:double 双精度浮点数是由可选小数点的有符号尾数,字母"e"或"E",和一个可选的有符号整型指数组成。指数的正则表达式为"[+-]?[0-9]+",尾数的正则表达式为:"[+-]?[0-9]+\.[0-9]+","[+-]?\.[0-9]+"或"[+-]?[0-9]"
EXAMPLE 12
@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.5.3 布尔值
布尔值可以用“true”或“false”(区分大小写)来编写,表示数据类型为xsd:boolean的RDF字面量。
EXAMPLE 13
@prefix : < http://example.org/stats > .
< http://somecountry.example/census2007 >
:isLandlocked false . # xsd:boolean
2.6 RDF空节点
在Turtle中RDF空节点用_:后面跟空节点标签来表示,空节点标签是一连串的名称字符。标签中的字符建立在PN_CHARS_BASE(定义在6.5节)之上,列举如下: + 字符_和数字可以出现在空节点标签的任意位置 + 字符.可以出现在除了开始和最后字符的任意位置 + 字符-,U+00B7, U+0300 到 U+036F 和 U+203F 到 U+2040 允许出现在除了第一个字符的任意位置。
为文档中每个唯一的空节点标签分配一个新的RDF空白节点。重复使用相同的空节点标签标识相同的RDF空节点。
EXAMPLE 14
@prefix foaf: < http://xmlns.com/foaf/0.1/ > .
_:alice foaf:knows _:bob .
_:bob foaf:knows _:alice .
2.7 Turlte中的嵌套无标签空节点
在Turtle中,当匹配空节点属性列表和术语ANON时,新的RDF空节点也被分配,两种情况的空节点可以出现在三元组的主语和宾语的位置,这时候,主语或宾语就是一个新的RDF空节点。匹配嵌入在空节点属性列表中的谓词宾语列表,产生的三元组主语也可以由空节点来充当。这些三元组的产生被描述为谓词列表。空节点也会分配给下面描述的集合。
EXAMPLE 15
@prefix foaf: < http://xmlns.com/foaf/0.1/ > .
# Someone knows someone else, who has the name "Bob".
[] foaf:knows [ foaf:name "Bob" ] .
Tuttle语法鱼汛空节点属性列表嵌套。在这个例子中,每一个内部的[建立一个新的主语空节点,恢复到外部的节点]结束。作为谓词宾语列表的当前主语。
在空节点属性列表中使用谓词宾语列表来表示节点的一连串属性,是一种常用的习惯。
缩写
EXAMPLE 16
@prefix foaf: < http://xmlns.com/foaf/0.1/ > .
[ foaf:name "Alice" ] foaf:knows [
foaf:name "Bob" ;
foaf:knows [
foaf:name "Eve" ] ;
foaf:mbox < bob@example.com > ] .
对应的简单三元组
EXAMPLE 17
_: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 > < bob@example.com > .
2.8 集合
RDF为节点列表提供了一种叫做集合的结构。Turtle语法中,集合有可能是由()括起来的空列表。这个集合表示一个rdf:first/rdf:rest的列表结构,列表结构中,rdf:first语句的对象的序列是()括起来的术语顺序。
(...)语法必须出现在一个三元组的主语和宾语位置,在列表头部的空节点是三元组的主语或者宾语。
EXAMPLE 18
@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 () .
3 举例
下面的例子是对RDF/XML Syntax specification(example1.ttl)中的example 7的内容(https://www.w3.org/TR/rdf-syntax-grammar/#example7),使用Turtle翻译过来,也就是对RDF的Turtle表示。
EXAMPLE 19
@prefix rdf: < http://www.w3.org/1999/02/22-rdf-syntax-ns# > .
@prefix dc: < http://purl.org/dc/elements/1.1/ > .
@prefix ex: < http://example.org/stuff/1.0/ > .
< http://www.w3.org/TR/rdf-syntax-grammar >
dc:title "RDF/XML Syntax Specification (Revised)" ;
ex:editor [
ex:fullname "Dave Beckett";
ex:homePage < http://purl.org/net/dajobe/ >
] .
一个具有两个字面量的RDF集合的举例
EXAMPLE 20
PREFIX : < http://example.org/stuff/1.0/ >
:a :b ( "apple" "banana" ) .
EXAMPLE 20是对EXAMPLE 21(example2.ttl)的简写
EXAMPLE 21
@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(LINE FEED characters,U+000A)断开的(example3.ttl)。
EXAMPLE 22
@prefex: < 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""" .
从Turtle语法可以看出,一个集合要么是主语要么是宾语。如果集合有一个或多个对象,那么对于第一个对象来说,主语或宾语将会是新增的空节点,如果集合是空集,则rdf:nil。 下面是举例
EXAMPLE 23
@prefex: < http://example.org/stuff/1.0/ > .
(1 2.0 3E1) :p "w" .
EXAMPLE 23用语法糖效果写出来,就是EXAMPLE 24的表达,需要注意的是空节点b0,b1和b2没有在RDF图的其他地方出现。
EXAMPLE 24
@prefix rdf : < http://www.w3.org/1999/02/22-rdf-syntax-ns# > .
_: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集合是能嵌套的,能够包括其他的语法形式。
EXAMPLE 25
PREFIX: < http://example.org/stuff/1.0/ >
(1 [:p :q] ( 2 ) ) :p2 :q2 .
语法糖描述如下:
EXAMPLE 26
@prefix rdf : < http://www.w3.org/1999/02/22-rdf-syntax-ns# > .
_: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.1 查询语言对于它的TriplesBlock产品也使用Turtle风格的语法,这个产品与Turtle语言有一些差别:
1. SPARQL允许RDF字面量作为RDF三元组的主语
2. SPARQL允许变量(?name 或者 $name)出现在三元组形式中的任何部分
3. Turtle允许prefix和base声明在三元组外的任何地方,SPARQL中,仅允许在SPARQL查询的开头声明。
4. 除了"a",SPARQL使用不区分大小写的关键字。Turtle的@prefix和@base声明是区分大小写的,SPARQL使用的PREFIX和BASE是不区分大小写的。
5. "true"和"false"在SPARQL中是不区分大小写的,在Turtle中是区分大小的。TrUe在Turtle中不是一个有效的布尔值。
查看Syntax for IRIs和SPARQL查询文档的SPARQL Grammar部分可以获取更多信息。
5 一致性
定义一致性标准的规范主要包括
Turtle文档
Turtle解析器
一致性的Turtle文档是一个Unicode字符串,符合定义在第6节Turlte语法中的附加约束,开始于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。在text/媒体类型树允许无数据集类型发送UTF-8之,mime type上的字符集参数是需要的。对于媒体类型注册形式参见附件B的国际媒体类型,文件扩展和Macintosh文件类型。
6 Turtle语法
Turtle文档是一个使用UTF-8编码的Unicode特征的字符串。Unicode字符仅允许在U+0000到U+10FFFF范围内(包括U+10FFFF)。
6.1 White Space(空格)
White Space(WS)用于分隔两个术语,如果不分隔就会被识别为一个术语。下面用大写字母表示的规则名称表明空白的重要位置;这些构成了对于构建Turtle解析器的终端的一种可能选择。
空格在字符串中是很重要的。
6.2 注释
Turtle中的注释需要使用字符"#",在IRIREF或者字符串之外,一直延续到行的结束(标记为U+000D或者U+000A)或者文件的结束(如果在注释标记后行没有结束的话)。注释是被看作为空格。
6.3 国际资源标识符参考文献(IRI References)
本节没有进行翻译,以下是对本节的说明。在本节列出了一些参考的文献,URI:Generic Syntax[RFC3986],IRIs[RFC3987]。里面描述了参考的一些内容,参考的章节由5.1.1,5.1.2,5.1.3,5.1.4,5.2等,着这些章节都是缺失的。
6.4 转义序列
在turtle文档中使用了三种转义形式:
数字转义序列表示Unicode字码点:
转义序列 Unicode代码点
'\u' hex hex hex hex 在U+00