Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

(翻译)W3C的Turtle文档

cooldream2009 2019-01-25 16:43:00 阅读数:152 评论数:0 点赞数:0 收藏数:0

主要翻译如下页面,https://www.w3.org/TR/turtle/,对该页面中Turtle的内容部分进行翻译,希望对使用Turtle的朋友们有所帮助。

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+0000到U+FFFF(含)范围内的一个Unicode字符,对应于由从最高有效位到最低有效位的4个十六进制数字编码的值
'\U' hex hex hex hex hexhex hex hex 在U+0000到U+10FFFF(含)范围内的一个Unicode字符,对应于由从最高有效位到最低有效位的8个十六进制数字编码的值

此处,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
  • 保留字符转义序列由一个"\",后面跟~.-!$&'()*+,;=/?#@%_ ,代表着"\"右边的字符。

每种转义序列使用的上下文如下表所示

  数字转义 字符串转义 保留字符转义
IRIs,RDF术语,在@prefix,PREFIX,@base,BASE中
本地名称
字符串

注意 
%编码序列在IRIs的字符范围内,在本地名称中是明显允许使用的。这些%后面跟着两个16进制字符表示三个字符的相同序列。这些序列在整个过程中不会被译码。在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 语法

这里使用的扩展的巴科斯范式是定义在XML 1.0中的,产品标签是由一个编号和一个最终的s组成,比如[60s],在SPARQL 1.1 查询语言中使用该编号引用产品。 注意 
1. 在单引号中的关键字('@base', '@prefix', 'a', 'true', 'false')是区分大小写的。在双引号中的关键字("BASE", "PREFIX")是不区分大小写的。 
2. 转移序列UCHAR和ECHAR是区分大小写的 
3. 当标记输入和选择语法规则时,选择最长的匹配 
4. 当具有大写名称的规则作为终端使用时,Turtle语法是LL(1)和LALR(1) 
5. 语法的入口点是turtleDoc 
6. 对于有符号数,在符号和数值之间不允许有空格 
7. 标记[162s] ANON ::= '[' WS* ']',允许在[]s之间由任意多的空格合注释,为了语法清晰这个版本只使用一个空格 
8. 字符串'@prefix' 和 '@base'能够匹配语言标签模式,但"prefix"和"base" 都不是注册的语言标签。在Turtle语言中,规范也没有规定一个带引号的字符是否跟任意的引用(比如"A"@base)。

编号 名称 等价内容
[1] turtleDoc ::= statement*
[2] statement ::= directive | triples '.'
[3] directive ::= prefixID | base | sparqlPrefix | sparqlBase
[4] prefixID ::= '@prefix' PNAME_NS IRIREF '.'
[5] base ::= '@base' IRIREF '.'
[5s] sparqlBase ::= "BASE" IRIREF
[6s] sparqlPrefix ::= "PREFIX" PNAME_NS IRIREF
[6] triples ::= subject predicateObjectList | blankNodePropertyList predicateObjectList?
[7] predicateObjectList ::= verb objectList (';' (verb objectList)?)*
[8] objectList ::= object (',' object)*
[9] verb ::= predicate | 'a'
[10] subject ::= iri | BlankNode | collection
[11] predicate ::= iri
[12] object ::= iri | BlankNode | collection | blankNodePropertyList | literal
[13] literal ::= RDFLiteral | NumericLiteral | BooleanLiteral
[14] blankNodePropertyList ::= '[' predicateObjectList ']'
[15] collection ::= '(' object* ')'
[16] NumericLiteral ::= INTEGER | DECIMAL | DOUBLE
[128s] RDFLiteral ::= String (LANGTAG | '^^' iri)?
[133s] BooleanLiteral ::= 'true' | 'false'
[17] String ::= STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE | STRING_LITERAL_LONG_SINGLE_QUOTE | STRING_LITERAL_LONG_QUOTE
[135s] iri ::= IRIREF | PrefixedName
[136s] PrefixedName ::= PNAME_LN | PNAME_NS
[137s] BlankNode ::= BLANK_NODE_LABEL | ANON

对于终端的产品

编号 名称 等价内容
[18] IRIREF ::= '<' ([^#x00-#x20<>"{}
[139s] PNAME_NS ::= PN_PREFIX? ':'
[140s] PNAME_LN ::= PNAME_NS PN_LOCAL
[141s] BLANK_NODE_LABEL ::= '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)?
[144s] LANGTAG ::= '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)*
[19] INTEGER ::= [+-]? [0-9]+
[20] DECIMAL ::= [+-]? [0-9]* '.' [0-9]+
[21] DOUBLE ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.' [0-9]+ EXPONENT | [0-9]+ EXPONENT)
[154s] EXPONENT ::= [eE] [+-]? [0-9]+
[22] STRING_LITERAL_QUOTE ::= '"' ([^#x22#x5C#xA#xD] | ECHAR | UCHAR) '"' / #x22=" #x5C=\ #xA=new line #xD=carriage return */
[23] STRING_LITERAL_SINGLE_QUOTE ::= "'" ([^#x27#x5C#xA#xD] | ECHAR | UCHAR) "'" / #x27=' #x5C=\ #xA=new line #xD=carriage return */
[24] STRING_LITERAL_LONG_SINGLE_QUOTE ::= "'''" (("'" | "''")? ([^'] | ECHAR | UCHAR))* "'''"
[25] STRING_LITERAL_LONG_QUOTE ::= '"""' (('"' | '""')? ([^"] | ECHAR | UCHAR))* '"""'
[26] UCHAR ::= '\u' HEX HEX HEX HEX | '\U' HEX HEX HEX HEX HEX HEX HEX HEX
[159s] ECHAR ::= '\' [tbnrf"']
[161s] WS ::= #x20 | #x9 | #xD | #xA / #x20=space #x9=character tabulation #xD=carriage return #xA=new line /
[162s] ANON ::= '[' WS* ']'
[163s] PN_CHARS_BASE ::= [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF]
[164s] PN_CHARS_U ::= PN_CHARS_BASE | '_'
[166s] PN_CHARS ::= PN_CHARS_U | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]
[167s] PN_PREFIX ::= PN_CHARS_BASE ((PN_CHARS | '.')* PN_CHARS)?
[168s] PN_LOCAL ::= (PN_CHARS_U | ':' | [0-9] | PLX) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX))?
[169s] PLX ::= PERCENT | PN_LOCAL_ESC
[170s] PERCENT ::= '%' HEX HEX
[171s] HEX ::= [0-9] | [A-F] | [a-f]
[172s] PN_LOCAL_ESC ::= '\' ('_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%')

7 解析

RDF 1.1概念和抽象语法规范定义了三种类型的RDF术语:IRIs,字面量和空节点。字面量是由一个词汇形式和一个可选的语言标记或数据类型IRI组成。一个额外的类型,prefix,在解析期间用于将字符串标识符映射到命名空间IRIs。这一节中,依据6.5节的语法规范,将词汇标记匹配为RDF术语或它们的组成部分(比如语言标记,词汇形式的字符量),从而将字符串映射为一系列的字符串。语法产品改变了解析状态并且产生三元组。

7.1 解析状态

解析Turtle需要五项状态

  • IRI(基本URI)--当提到base名称时,第二个规则参数,IRIREF,是基本的URI,在解析相对IRI时使用。
  • 映射prefix-->IRI--在prefixID产品中的第二个和第三个规则参数(PNAME_NS,IRIREF)为前缀(PANME_NS)分配一个命名空间名称(IRIREF)。在prefixID产品之外,任何PNAME_NS都将替换为命名空间。注意这个前缀可以是一个空字符串,每一个PNAME_NS产品:(PN_PREFIX)?":"
  • 映射string -->空节点--一种从字符串到空节点的映射
  • RDF术语(curSubject)--curSubject是与主语产品相关联的
  • RDF术语(curPredicate)--curPredicate是与动词相关联的。如果匹配的标记是"a",curPredicate相关联的IRI是http://www.w3.org/1999/02/22-rdf-syntax-ns#type.

7.2 RDF术语构造器

下面的表格将产品和词汇标记映射到RDF术语或RDF术语的组成部分(在第7节解析中列出的)。

产品 类型 过程
IRIREF IRI 取"<"和">"之间的字符,数字转义序列未转义,形成unicode的IRI字符串,依据第6.3节进行相对IRI解析
PNAME_NS prefix 当使用前缀ID或sparql前缀时,prefix可能是一个空的unicode字符串,匹配的规则的第一个参数时命名空间映射的一个键
IRI 当使用前缀名称时,iri是命名空间映射的值,对应着规则的第一个参数
PNAME_LN IRI 一个可能为空的前缀被第一个序列PNAME_NS标识。命名空间映射必须对应命名空间namespace,IRI的uincode字符串是以第二个参数PN_LOCAL中未转义的保留字连接namespace构成的
STRING_LITERAL_SINGLE_QUOTE lexical form 在单引号之间的字符,数字和字符转义序列未转义,形成unicode字符串的词汇形式
STRING_LITERAL_QUOTE lexical form 在双引号之间的字符,数字和字符转义序列未转义,形成unicode字符串的词汇形式
STRING_LITERAL_LONG_SINGLE_QUOTE lexical form 在三个单引号之间的字符,数字和字符转义序列未转义,形成unicode字符串的词汇形式
STRING_LITERAL_LONG_QUOTE lexical form 在三个双引号之间的字符,数字和字符转义序列未转义,形成unicode字符串的词汇形式
LANGTAG language tag 跟在@之后的字符形成语言标记的unicode字符串
RDFLiteral literal 字面量有一个第一个规则参数String的词汇形式。如果iri规则匹配的是"^^",数据类型是iri并且字面量没有语言标记。如果规则匹配的是LANGTAG ,则数据类型是 rdf:langString并且语言标记是LANGTAG。如果都没有匹配,那么数据类型是xsd:string,字面量没有语言标记。
INTEGER literal 字面量有一个输入字符串的词汇形式,数据类型是xsd:integer
DECIMAL literal 字面量有一个输入字符串的词汇形式,数据类型是 xsd:decimal
DOUBLE literal 字面量有一个输入字符串的词汇形式,数据类型是xsd:double
BooleanLiteral literal 字面量有一个true 或者 false的词汇形式,依赖于匹配的输入,数据类型是xsd:boolean
BLANK_NODE_LABEL blank node 匹配第二个参数PN_LOCAL的字符串是 bnodeLabels中的一个键,如果映射中没有对应的空节点,会分配一个
ANON blank node 生成一个空节点
blankNodePropertyList blank node 生成一个空节点,在下一节中有针对blankNodePropertyList的规则的说明
collection blank node 对于非空列表,生成一个空节点。针对collection的规则在下一节中说明
IRI 对于空列表,结果IRI是rdf:nil,针对collection的规则在下一节中说明

7.3 RDF三元组构造器

Turtle文档定义了一个RDF图有多个RDF三元组构成。主语表示为curSubject,动词表示为curPredicate,宾语为N,一个RDF三元组表示为:curSubject curPredicate N。 
属性列表: 
开始blankNodePropertyList记录了curSubject 和 curPredicate,并将curSubject设置为一个新的空节点B。完成blankNodePropertyList恢复了curSubject 和 curPredicate。匹配blankNodePropertyList产生的节点是空节点B。 
集合: 
开始collection记录了curSubject 和 curPredicate,在collection中的每个宾语有一个curSubject设置为新的空节点B,有一个curPredicate设置为rdf:first。第一个宾语后面的每一个宾语objectn 生成的三元组为objectn-1 rdf:rest objectn。完成 collection会生成一个附加的三元组: curSubject rdf:rest rdf:nil。并且恢复了curSubject 和 curPredicate。通过匹配collection得到的节点对于非空列表来说是第一个空节点B,对于空列表来说是rdf:nil。

7.4 解析举例

下面的示例显示了使用LALR(1)解析器解析Turtle文档的时候执行的语义操作。

EXAMPLE 27 
@prefix ericFoaf: < http://www.w3.org/People/Eric/ericP-foaf.rdf# > . 
@prefix : < http://xmlns.com/foaf/0.1/ > . 
ericFoaf:ericP :givenName "Eric" ; 
:knows < hhttp://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#.
  • 映射空前缀到IRI http://xmlns.com/foaf/0.1/.
  • 分配curSubject到IRI http://www.w3.org/People/Eric/ericP-foaf.rdf#ericP.
  • 分配curPredicate到IRI http://xmlns.com/foaf/0.1/givenName.
  • 组成一个RDF三元组: <...rdf#ericP > <.../givenName > "Eric" .
  • 分配curPredicate到IRI http://xmlns.com/foaf/0.1/knows.
  • 组成一个RDF三元组: <...rdf#ericP > <.../knows > <...who/dan-brickley > .
  • 组成一个RDF三元组: <...rdf#ericP > <.../knows > _:1 .
  • 保存curSubject并且重新分配到空节点_:1.
  • 保存curPredicate.
  • 分配curPredicate到IRI http://xmlns.com/foaf/0.1/mbox.
  • 组成一个RDF三元组: _:1 <.../mbox > <mailto:timbl@w3.org > .
  • 恢复curSubject和curPredicate到它们的保存值(<...rdf#ericP >, <.../knows >).
  • 组成一个RDF三元组: <...rdf#ericP > <.../knows > <http://getopenid.com/amyvdh > .

原文地址https://www.w3.org/TR/turtle/ 翻译中,难免有不太恰当的地方,欢迎有兴趣的朋友指出来,一起修改完善,加深对turtle的理解。

版权声明
本文为[cooldream2009]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/coodream2009/p/10320437.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领