W3C的Turtle文档翻译

主要翻译如下页面,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+0000到U+FFFF(含)范围内的一个Unicode字符,对应于由从最高有效位到最低有效位的4个十六进制数字编码的值
‘\U’ hex hex hex hex hex hex 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/foo-bar >的术语,就被认定为是IRI http://a.example/foo-bar,而不是IRI http://a.example/foo-bar。前缀是@prefix ex: <http://a.example/ > ,被编写为ex:%66oo-bar的术语,也认定为IRI http://a.example/foo-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的理解。

(翻译)W3C的Turtle文档相关推荐

  1. Google可翻译Word或PDF文档

    Google翻译的强大功能一直为很多人所津津乐道.殊不知,除了在线翻译某段文字或网页,Google还可以直接翻译Word或PDF文档!也就是说,当你输入 Word或PDF文档的URL地址,再点击&qu ...

  2. 怎么翻译整篇Excel文档?Excel文档翻译一招搞定

    想要翻译整篇Excel文档?不知道怎么翻译Excel文档?今天你算是赚到了,小编下面要来给大家分享几个Excel文档翻译的方法,有需要的刚好可以拿去用哦! Excel翻译工具:文档翻译器 1:打开我们 ...

  3. 有ppt文档翻译软件吗?如何翻译整篇ppt文档

    公司最近在组织案例分析会,优秀的案例大家在一起讨论学习,但是ppt文档里有一些英文的内容,对于英文不好的同事来说理解起来很费劲,想要弄懂文件的内容,可以借助ppt文档翻译软件,将文件进行翻译,这样就能 ...

  4. 如何翻译整篇PPT文档?PPT文档翻译还可以这样做

    如何翻译整篇PPT文档?办公的时候总会收到一些英文或者是其他语言的PPT文件,将内容翻译成中文可能更容易理解一点,下面小编为大家介绍一个PPT文档翻译的方法,不知道的你赶紧来看看吧! 想要翻译PPT文 ...

  5. PPT文档翻译软件怎么用?如何翻译整篇PPT文档

    PPT文档翻译软件怎么用?小编最近有一份PPT文档需要翻译,自己翻译又慢还浪费时间,好不容易找到了一个可以翻译PPT文档的软件,翻译效果还是不错的,帮助我解决了翻译的难题,下面给大家分享一下这个PPT ...

  6. 如何将计算机的名称改成英文翻译,电脑中的文档怎么进行中英文的翻译

    电脑中的文档怎么进行中英文的翻译 腾讯视频/爱奇艺/优酷/外卖 充值4折起 我们在进行文档编辑的时候,有时会遇到需要进行中英文互译的情况,今天就跟大家介绍一下电脑中的文档怎么进行中英文的翻译的具体操作 ...

  7. PPT文档英文怎么翻译成中文?文档英文翻译这一招就够了

    PPT文档英文怎么翻译成中文?PPT文档怎么翻译?我想这些问题一直围绕着大家的工作吧,想要翻译PPT文档,却不知道该怎么操作,来看这篇文章就对了,小编接下来要为大家分享文档英文翻译的方法,教你怎么把英 ...

  8. [翻译] DTCoreText 从HTML文档中创建富文本

    DTCoreText 从HTML文档中创建富文本 https://github.com/Cocoanetics/DTCoreText 注意哦亲,DTRichTextEditor 这个组件是收费的,不贵 ...

  9. linux kernel 配置(部分) 部分内容翻译自内核帮助文档

    linux kernel 2.6.13 在配置内核前,你应当对详细的了解运行内核的系统,根据自己的需要配置内核. 下面,我将解释内核的各个选项,并根据本人的机器作相应的配置. 在此之前,我把机器硬件参 ...

最新文章

  1. es6箭头函数(=)与展开特性运算符(...)的使用
  2. Roman to Integer LeetCode Java
  3. 如何开发一个npm包并发布
  4. Spring Boot定时任务-Job类对象注入
  5. 如何使用Java keytool命令行创建一个自签名证书
  6. 红外线遥控c语言程序,红外线遥控解码接收程序-c语言讲解学习.pdf
  7. python跳转下一页_Python网页浏览转到下一页
  8. 接口工具使用对比(apipost、jmeter、postman、swagger等)
  9. tensorflow学习5----GAN模型初探
  10. java 网络序_JAVA 网络程序
  11. 西南科技大学 SWUST OJ系统942: 逆置顺序表
  12. E45: ‘readonly‘ option is set (add ! to override)
  13. AVS2解码图像管理
  14. Angular2组件开发—模板的逻辑控制(一)
  15. 如何设计一枚「拟态」按钮
  16. 自定义镜像上传阿里云
  17. golang的 data race 分析
  18. Spring Cloud Finchley OpenFeign的重试配置相关的坑
  19. SAP请求本地导出导入
  20. 机械师F117夜鹰双盘双系统windows10+ubuntu14.04

热门文章

  1. 学考计算机隐藏,2018年计算机一级考试WPS辅导知识:隐藏文字和添加拼音的用法...
  2. UIGU源码分析7:Scrollbar
  3. html脚本ios调试不了,Safari 前端开发调试 iOS 完美解决方案(iPhone/iTouch 等)
  4. 在windows下安装django
  5. 给Android应用设置DeviceOwner权限遇到的问题及解决方案
  6. maven配置本地仓库位置
  7. 是广州视窗搞鬼还是广东电信无耻?
  8. EXCEL如何实现多级联动下拉菜单
  9. 创建快捷方式到桌面、任务栏、开始菜单、快速启动栏、程序组中
  10. Kaggle实战入门:泰坦尼克号生还预测(基础版)