主要翻译如下页面,https://www.w3.org/TR/turtle/,对该页面中Turtle的内容部分进行翻译,希望对使用Turtle的朋友们有所帮助。
1 简介
这个文档是对Turtle的定义,Turtle是简洁的RDF三元组语言,是对RDF图数据的文本表示。下面的Turtle例子描述了Green Goblin和Spiderman之间的关系。
EXAMPLE 1
[email protected] http://example.org/ .
[email protected] rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# .
[email protected] rdfs: http://www.w3.org/2000/01/rdf-schema# .
[email protected] foaf: http://xmlns.com/foaf/0.1/ .
[email protected] 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
[email protected] : < 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
[email protected] : < 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
[email protected] foaf: < http://xmlns.com/foaf/0.1/ > .
?? _:alice foaf:knows _:bob .
?? _:bob foaf:knows _:alice .
2.7 Turlte中的嵌套无标签空节点
在Turtle中,当匹配空节点属性列表和术语ANON时,新的RDF空节点也被分配,两种情况的空节点可以出现在三元组的主语和宾语的位置,这时候,主语或宾语就是一个新的RDF空节点。匹配嵌入在空节点属性列表中的谓词宾语列表,产生的三元组主语也可以由空节点来充当。这些三元组的产生被描述为谓词列表。空节点也会分配给下面描述的集合。
EXAMPLE 15
[email protected] foaf: < http://xmlns.com/foaf/0.1/ > .
?? # Someone knows someone else, who has the name "Bob".
?? [] foaf:knows [ foaf:name "Bob" ] .
Tuttle语法鱼汛空节点属性列表嵌套。在这个例子中,每一个内部的[建立一个新的主语空节点,恢复到外部的节点]结束。作为谓词宾语列表的当前主语。
在空节点属性列表中使用谓词宾语列表来表示节点的一连串属性,是一种常用的习惯。
缩写
EXAMPLE 16
[email protected] foaf: < http://xmlns.com/foaf/0.1/ > .
?? [ foaf:name "Alice" ] foaf:knows [
???? foaf:name "Bob" ;
?? ?? foaf:knows [
?????? foaf:name "Eve" ] ;
???? foaf:mbox < [email protected] > ] .
对应的简单三元组
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 > < [email protected] > .
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
[email protected] rdf: < http://www.w3.org/1999/02/22-rdf-syntax-ns# > .
[email protected] dc: < http://purl.org/dc/elements/1.1/ > .
[email protected] 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
[email protected] : < http://example.org/stuff/1.0/ > .
[email protected] 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
[email protected] 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
[email protected] 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
[email protected] ericFoaf: < http://www.w3.org/People/Eric/ericP-foaf.rdf# > .
[email protected] : < http://xmlns.com/foaf/0.1/ > .
?? ericFoaf:ericP :givenName "Eric" ;
???? ???? :knows < hhttp://norman.walsh.name/knows/who/dan-brickley > ,
?? ???? ???? ? [ :mbox < mailto:[email protected] > ] ,
?????? ????? < 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:[email protected] > .
- 恢复curSubject和curPredicate到它们的保存值(<...rdf#ericP >, <.../knows >).
- 组成一个RDF三元组: <...rdf#ericP > <.../knows > <http://getopenid.com/amyvdh > .
原文地址https://www.w3.org/TR/turtle/ 翻译中,难免有不太恰当的地方,欢迎有兴趣的朋友指出来,一起修改完善,加深对turtle的理解。
原文地址:https://www.cnblogs.com/coodream2009/p/10320437.html