【注意】 このドキュメントは、W3CのRDF 1.1 Turtle, Terse RDF Triple Language W3C Recommendation 25 February 2014の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2014年9月19日 | Last Update: 2021年4月6日
公開以後に報告されたエラーや問題がないか正誤表を確認してください。
この仕様の英語版が唯一の規範のバージョンです。非規範の翻訳版も入手可能かもしれません。
Copyright © 2008-2014 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and document use rules apply.
RDF(Resource Description Framework)は、ウェブで情報を表現するための汎用言語です。
このドキュメントは、共通の使用パターンとデータ型の省略形を用いて、RDFグラフをコンパクトで自然なテキスト形式で完全に記述できるTurtleと呼ばれるRDF用のテキスト形式の構文を定義しています。Turtleは、SPARQL W3C勧告のトリプル・パターン構文やN-Triple[N-TRIPLES]形式と様々なレベルで互換性があります。
この項は、このドキュメントの公開時のステータスについて記述しています。他のドキュメントがこのドキュメントに取って代わることがありえます。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、http://www.w3.org/TR/のW3C技術報告インデックスにあります。
このドキュメントは、RDF 1.1ドキュメント群の一部です。このドキュメントでは、RDFの具象構文[RDF11-CONCEPTS]であるTurtle(Terse RDF Triple Language)を定義しています。
このドキュメントは、RDFワーキンググループによって勧告として公開されました。このドキュメントに関してコメントを行いたい場合には、public-rdf-comments@w3.org(購読、アーカイブ)にお送りください。どのようなコメントでも歓迎します。
ワーキンググループの実装報告書を参照してください。
このドキュメントは、W3Cメンバー、ソフトウェア開発者、他のW3Cグループ、および他の利害関係者によりレビューされ、W3C勧告として管理者の協賛を得ました。これは確定済みドキュメントであり、参考資料として用いたり、別のドキュメントで引用することができます。勧告の作成におけるW3Cの役割は、仕様に注意を引き付け、広範囲な開発を促進することです。これによってウェブの機能性および相互運用性が増強されます。
このドキュメントは、2004年2月5日のW3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。
この項は非規範的です。
このドキュメントでは、RDFの具象構文[RDF11-CONCEPTS]であるTurtle(Terse RDF Triple Language)を定義しています。
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 ; # マーベル・ユニバースのコンテキストで
foaf:name "Green Goblin" .
<#spiderman>
rel:enemyOf <#green-goblin> ;
a foaf:Person ;
foaf:name "Spiderman", "Человек-паук"@ru .
この例は、@baseと相対IRI、@prefixと接頭辞名、「;
」で区切られた述語リスト、「,
」で区切られた目的語リスト、a
というトークン、リテラルといった、Turtle言語の特徴の多くを取り入れています。
triples
に対するTurtle文法は、TriplesBlock
に対するSPARQL 1.1クエリ言語[SPARQL11-QUERY]の文法のサブセットです。可能である場合には、この2つの文法は、生成規則と終端記号の名前を共有しています。
この項は非規範的です。
Turtleドキュメントにより、RDFグラフをコンパクトなテキスト形式で記述できるようになります。RDFグラフは、主語、述語、目的語から成るトリプルで構成されます。
コメントは、「#
」の後に記述でき、別の字句トークンの一部ではなく、行末まで続きます。
最もシンプルなトリプル・ステートメントは、用語(主語、述語、目的語)のシーケンスで、余白で区切られ、各トリプルの後に「.
」を置いて終了します。
<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enemyOf> <http://example.org/#green-goblin> .
複数の述語が同じ主語を参照することがよくあります。predicateObjectList生成規則は、一連の述語および目的語とマッチし、「;」で区切って主語の後に置きます。これは、その主語を持つ一連のRDFトリプルがあり、述語と目的語がそれぞれ1つのトリプルに割り当てられられている状況を表します。したがって、「;
」という記号は、述語と目的語のRDF用語のみが異なるトリプルの主語を繰り返すために用いられます。
次の2つの例は、スパイダーマンに関するトリプルを記述する同等な方法です。
<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トリプルがあり、目的語がそれぞれ1つのトリプルに割り当てられている状況を表します。したがって、「,
」という記号は、目的語のRDF用語のみが異なるトリプルの主語と述語を繰り返すために用いられます。
次の2つの例は、2つの言語でスパイダーマンの名前を記述する同等な方法です。
<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概念で定義されているRDF用語には、IRI(Internationalized Resource Identifiers)、リテラル、空白ノードの3種類があります。Turtleは、それぞれを記述する多くの方法を提供します。
IRIは、相対IRIまたは絶対IRI、もしくは接頭辞名として記述できます。相対IRIと絶対IRIは、「<」と「>」で囲まれ、数値エスケープ・シーケンス(以下で述べる)を含むことができます。例えば、<http://example.org/#green-goblin>
。
<#green-goblin>
のような相対IRIは、現在の基底IRI対して解決されます。新しい基底IRIは「@base
」か「BASE
」指示子で定義できます。このオペレーションの詳細は、6.3項 IRI参照 で定義しています。
Turtleトリプルの述語の位置にある「a
」というトークンは、http://www.w3.org/1999/02/22-rdf-syntax-ns#type
というIRIを表します。
接頭辞名は、接頭辞ラベルとローカル部分(local part)で、コロン「":"」で区切られています。接頭辞名は、接頭辞に関連付けられているIRIとローカル部分とを連結することによりIRIになります。「@prefix
」や「PREFIX
」指示子は、接頭辞ラベルをIRIに関連付けます。その後の「@prefix
」や「PREFIX
」指示子は、同じ接頭辞ラベルを再マッピングできます。
Turtle言語は当初、接頭辞と基底の指示子の記述に「@
」という文字が含まれている構文のみを認めていました。大文字・小文字を区別しない「PREFIX
」と「BASE
」の形式は、Turtle構文をSPARQL構文と揃えるために追加されました。RDF 1.1 Turtleパーサが広く利用されるようになるまでは、「@prefix
」と「@base
」の形式でRDFをシリアル化するのが望ましいです。
接頭辞名を用いてhttp://www.perceive.net/schemas/relationship/enemyOf
を記述するためには、
http://www.perceive.net/schemas/relationship/
という語彙のIRIの接頭辞ラベルをsomePrefix
と定義します。somePrefix:enemyOf
と記述します。これは、<http://www.perceive.net/schemas/relationship/enemyOf>
と記述するのと同等です。これは、元のTurtle構文を接頭辞宣言に用いるか、
@prefix somePrefix: <http://www.perceive.net/schemas/relationship/> .
<http://example.org/#green-goblin> somePrefix:enemyOf <http://example.org/#spiderman> .
SPARQLの構文を接頭辞宣言に用いるかのどちらかで記述できます。
PREFIX somePrefix: <http://www.perceive.net/schemas/relationship/>
<http://example.org/#green-goblin> somePrefix:enemyOf <http://example.org/#spiderman> .
接頭辞名は、XML QNamesの上位集合です。これらは接頭辞名のローカル部分に次のものを含むことができるという点に違いがあります。
leg:3032571
やisbn13:9780136019701
og:video:height
wgs:lat\-long
次のTurtleドキュメントには、TurtleでIRIを記述するあらゆる方法の例が含まれています。
# すべてが絶対IRIのトリプル
<http://one.example/subject1> <http://one.example/predicate1> <http://one.example/object1> .
@base <http://one.example/> .
<subject2> <predicate2> <object2> . # 相対IRI。例:http://one.example/subject2
BASE <http://one.example/>
<subject2> <predicate2> <object2> . # 相対IRI。例:http://one.example/subject2
@prefix p: <http://two.example/> .
p:subject3 p:predicate3 p:object3 . # 接頭辞名。例:http://two.example/subject3
PREFIX p: <http://two.example/>
p:subject3 p:predicate3 p:object3 . # 接頭辞名。例:http://two.example/subject3
@prefix p: <path/> . # 接頭辞 p: 現在 http://one.example/path/ を表す。
p:subject4 p:predicate4 p:object4 . # 接頭辞名。例:http://one.example/path/subject4
@prefix : <http://another.example/> . # 空の接頭辞
:subject5 :predicate5 :object5 . # 接頭辞名。例:http://another.example/subject5
:subject6 a :subject7 . # 右記と同じ。 :subject6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> :subject7 .
<http://伝言.example/?user=أكرم&channel=R%26D> a :subject8 . # 多文字種(multi-script)の主語IRI。
「@prefix
」と「@base
」の指示子には、IRIの後に終了文字「.
」が必要で、これらと同等の「PREFIX
」と「BASE
」は、指示子の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(または、これらのどちらもない)が置かれます。字句形式の表現は、"
(U+0022)などの先頭の区切り記号、認められている文字列か数値エスケープ・シーケンスか文字列エスケープ・シーケンス、最後の区切り記号で構成されます。対応するRDF字句形式は、エスケープ・シーケンス処理後の、区切り記号の間の文字です。言語タグがあれば、その前に「@
」(U+0040)が置かれます。言語タグがなければ、「^^
」(U+005E U+005E)の後にデータ型IRIが置かれるかもしれません。Turtleのデータ型IRIは、絶対IRI、相対IRI、接頭辞名のいずれかで記述できます。データ型IRIも言語タグもないときには、データ型はxsd:string
です。
「\
」(U+005C)は、エスケープ・シーケンスの一部として出現する場合を除き、引用符付きリテラルには出現できません。その他の制限は、次のとおり、区切り記号に依存します。
'
(U+0027)で区切られたリテラルには、'
、LF
(U+000A)、CR
(U+000D)の文字を含むことができません。"
で区切られたリテラルには、"
、LF
、CR
の文字を含むことができません。'''
で区切られたリテラルには、'''
の文字列を含むことができません。"""
で区切られたリテラルには、"""
の文字列を含むことができません。@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 . # XMLスキーマ文字列データ型のリテラル
show:218 rdfs:label "That Seventies Show"^^<http://www.w3.org/2001/XMLSchema#string> . # 同上
show:218 rdfs:label "That Seventies Show" . # 同上
show:218 show:localName "That Seventies Show"@en . # 言語タグ付きリテラル
show:218 show:localName 'Cette Serie des Annees Soixante-dix'@fr . # シングル引用符で区切られたリテラル
show:218 show:localName "Cette Serie des Annees Septante"@fr-be . # 領域サブタグ付きリテラル
show:218 show:blurb '''This is a multi-line # 組み込み改行(new line)および引用符付きリテラル
literal with many quotes (""""")
and up to two sequential apostrophes ('').''' .
数値は、その他のリテラルと同じように、字句形式とデータ型(例えば、"-5.0"^^xsd:decimal
)で記述できます。Turtleには、整数の値、任意の精度の10進数の値、倍精度浮動小数点数の値を記述するための省略構文があります。
データ型 | 省略形 | 字句形 | 説明 |
---|---|---|---|
xsd:integer | -5 |
"-5"^^xsd:integer |
整数の値は、オプションの記号と、一連の数字で記述できます。整数は、「[+-]?[0-9]+ 」という正規表現とマッチします。 |
xsd:decimal | -5.0 |
"-5.0"^^xsd:decimal |
任意の精度の10進数は、オプションの記号、0以上の数、小数点、1以上の数で記述できます。10進数は、「[+-]?[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リテラルを表します。
@prefix : <http://example.org/stats> .
<http://somecountry.example/census2007>
:isLandlocked false . # xsd:boolean
TurtleのRDF空白ノードは、_:
で表され、その後に一連の名前文字である空白ノード・ラベルが続きます。ラベル内の文字は、PN_CHARS_BASEに基づいて構築されますが、次のとおりに緩和されています。
_
という文字と数字は、空白ノード・ラベルのどこに出現してもよい。.
という文字は、最初または最後の文字を除き、どこに出現してもよい。-
、U+00B7
、U+0300
~U+036F
、U+203F
~U+2040
の文字は、最初の文字を除き、どこでも認められる。新しいRDF空白ノードは、ドキュメント内の一意の空白ノード・ラベルにそれぞれ割り当てられます。同じ空白ノード・ラベルを繰り返して用いると、同じRDF空白ノードを識別します。
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:alice foaf:knows _:bob .
_:bob foaf:knows _:alice .
Turtleでは、生成規則のblankNodePropertyListと終端記号のANONがマッチするときにも新しいRDF空白ノードが割り当てられます。これらの両方ともがトリプルの主語または目的語の位置に出現可能です(Turtle文法を参照)。その主語または目的語は、新しいRDF空白ノードです。この空白ノードは、blankNodePropertyListに組み込まれたpredicateObjectList生成規則とのマッチングにより生成されるトリプルの主語の機能も果たします。これらのトリプルの生成については、述語リストで記述しています。空白ノードは、下記で述べているコレクションにも割り当てられます。
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
# 誰かが他の誰かを知っていて、その人は「Bob」という名前を持っている。
[] foaf:knows [ foaf:name "Bob" ] .
Turtle文法では、blankNodePropertyListを入れ子にすることができます。このケースでは、個々の内部の[
は、新しい主語の空白ノードを設け、]
で外部ノードに戻り、述語目的語リストに対する現在の主語の機能を果たします。
blankNodePropertyListにおけるpredicateObjectListの使用は、ノードの一連のプロパティーを表すための一般的な成句です。
省略形:
@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> ] .
対応するシンプルなトリプル:
_: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> .
RDFは、RDFノードのリストにコレクション[RDF11-MT]の構造を提供します。コレクション用のTurtle構文は、()
で囲まれたRDF用語の恐らく空のリストです。このコレクションは、()
で囲まれた用語の順序であるrdf:first
ステートメントの目的語のシーケンスを持つrdf:first
/rdf:rest
リスト構造を表します。
(…)
という構文は、トリプルの主語か目的語の位置に出現しなければなりません(MUST)(Turtle文法を参照)。リスト冒頭の空白ノードは、含まれているトリプルの主語か目的語です。
@prefix : <http://example.org/foo> .
# このトリプルの目的語はRDFコレクション空白ノード
:subject :predicate ( :a :b :c ) .
# 空のコレクション値 - rdf:nil
:subject :predicate2 () .
この項は非規範的です。
この例は、RDF/XML構文仕様の例7をTurtleに変換したものです(example1.ttl)。
@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/> ] .
2つのリテラルの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 ] ] .
改行を含んだリテラルの目的語が含まれている2つの同じトリプルの例で、プレーン・リテラルと長いリテラルの形式で記述されています。この例の改行は、LINE FEED(U+000A)です(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""" .
文法で示されているように、コレクションは主語か目的語のどちらかになりえます。この主語や目的語は、コレクションに1つ以上の目的語があれば最初の目的語に対する新しい空白ノードになり、コレクションが空の場合には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#> .
_: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#> .
_: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.1クエリ言語(SPARQL)[SPARQL11-QUERY]は、そのTriplesBlock生成規則にTurtle形式の構文を用います。この生成規則は、次の点においてTurtle言語と異なっています。
?
名または$
名)が認められています。a
」を除き、大文字・小文字を区別しないキーワードを用います。Turtleの@prefix
と@base
の宣言は大文字・小文字を区別し、SPARQL由来のPREFIX
とBASE
は大文字・小文字を区別しません。true
」と「false
」は、SPARQLでは大文字・小文字を区別せず、Turtleでは区別します。TrUe
は、Turtleでは有効なブール値ではありません。詳細な情報に関しては、SPARQLクエリ・ドキュメント[SPARQL11-QUERY]のIRIの構文の項とSPARQL文法の項を参照してください。
非規範的と記している項と同じく、この仕様のすべての作成ガイドライン、図、例、注は、非規範的です。この仕様のその他の部分はすべて規範的です。
この仕様の「しなければならない(MUST)」、「してはならない(MUST NOT)」、「必須である/要求される(REQUIRED)」、「すべきである/する必要がある(SHOULD)」、「すべきでない/する必要がない(SHOULD NOT)」、「推奨される(RECOMMENDED)」、「することができる/してもよい(MAY)」、「選択できる/任意である(OPTIONAL)」というキーワードは、[RFC2119]で記述されているように解釈されるべきです。
この仕様は、次のものに関する適合性基準を定義しています。
適合Turtleドキュメントは、6項 Turtle文法で定義されている文法と追加の制約に準拠したUnicodeの文字列で、turtleDoc
生成規則で始まります。TurtleドキュメントはRDFグラフをシリアル化します。
適合Turtleパーサは、アプリケーションの代わりにTurtleドキュメントを読むことができるシステムです。7項 解析で定義しているように、これによってシリアル化されたRDFデータセットが作成され、通常は何らかのAPI形式で、それをアプリケーションに利用できます。
Turtle言語を識別するIRIは、http://www.w3.org/ns/formats/Turtle
です。
この仕様は、Turtleのパーサが非適合の入力ドキュメントを扱う方法を定義しません。
Turtleのメディア・タイプはtext/turtle
です。Turtleのコンテンツのコンテンツ・エンコーディングは、常にUTF-8です。MIME形式のCharsetパラメータは、text/
のメディア・タイプのツリーがcharsetパラメータなしにUTF-8を送信することを認めるような時が来るまで、必須です。メディア・タイプの登録形式については、B項 インターネット・メディア・タイプ、ファイル拡張子、およびマッキントッシュ・ファイル・タイプを参照してください。
Turtleドキュメントは、UTF-8でエンコードされたUnicode[UNICODE]文字列です。U+0000~U+10FFFFの範囲のUnicode文字のみが認められています。
空白(生成規則WS)は、そうしないと1つの終端記号と(誤)認識されてしまう2つの終端記号を分離するために用いられます。下記の大文字の規則名は、空白が重要なものです。これらは、Turtleパーサの構築のために選択できる終端記号を形成します。
空白は生成規則Stringにおいて重要です。
Turtle内のコメントは、IRIREFやStringの外部では、「#」の形式をとり、行末(U+000DかU+000Aの文字で記述される)か、コメント記号の後に行末がない場合にはファイルの最後まで続きます。コメントは空白として扱われます。
相対IRIは、URI(Uniform Resource Identifier): 一般的構文[RFC3986]にあるとおり、5.2項の基本アルゴリズムのみを用いて、基底IRIで解決されます。構文に基づく正規化もスキームに基づく正規化も(RFC3986の6.2.2および6.2.3項に記述されている)実行されません。IRI参照で追加的に認められている文字は、IRI(Internationalized Resource Identifiers)[RFC3987]の6.5項にあるとおり、URI参照で無制限の文字が扱われているのと同じ方法で扱われます。
RFC3986の5.1.1項「コンテンツ内に組み込まれた基底URI」にあるとおり、@base
やBASE
の指示子は、相対IRIを解決するために用いる基底IRIを指定します。5.1.2項「カプセル化されたエンティティーからの基底URI」では、xml:base指示子を持つSOAPエンベロープやContent-Locationヘッダーを持つマイム・マルチパート・ドキュメントのようなカプセル化されたドキュメントから、スコープ内の基底IRI(In-Scope Base IRI)を持ってくる方法を定めています。5.1.3項「検索URIからの基底URI」で識別された「検索URI」は、特定のTurtleが検索されたURLです。上記のどの方法でも基底URIを指定できない場合は、デフォルト基底URI(5.1.4項「デフォルト基底URI」)が用いられます。@base
やBASE
の指示子は、前のものに対して相対的に、それぞれ新しいスコープ内の基底URIを設定します。
turtleドキュメントで用いるエスケープには次の3つの形式があります。
数値エスケープ・シーケンスはUnicodeコード・ポイントを表します。
エスケープ・シーケンス | Unicodeコード・ポイント |
---|---|
'\u' hex hex hex hex | 最上位桁から最下位桁へと変換した4つの16進数字でエンコードした値に対応する、U+0000~U+FFFFの範囲のUnicode文字。 |
'\U' hex hex hex hex hex hex hex hex | 最上位桁から最下位桁へと変換した8つの16進数字でエンコードした値に対応する、U+0000~U+10FFFFの範囲のUnicode文字。 |
上記は、HEXが次の16進数の文字である場合です。
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 |
予約文字エスケープ・シーケンスは、「\」の後に~.-!$&'()*+,;=/?#@%_
のうちの1つが来る形で構成され、これらの文字は「\」の右側に置かれます。
数値 エスケープ |
文字列 エスケープ |
予約文字 エスケープ |
|
---|---|---|---|
RDF用語として、または、@prefix、PREFIX、@base、またはBASE宣言で用いられるIRI | yes | no | no |
ローカル名 | no | no | yes |
文字列 | yes | yes | no |
%エンコードのシーケンスは、IRIの文字範囲にあり、ローカル名で明示的に認められます。これは、「%」の後に2つの16進の文字が置かれる形式で、同じ3文字のシーケンスを表します。このシーケンスが処理中にデコードされることはありません。Turtleで<http://a.example/%66oo-bar>
と記述されている用語は、http://a.example/foo-bar
というIRIではなく、http://a.example/%66oo-bar
というIRIを指します。@prefix ex: <http://a.example/>
という接頭辞を持つex:%66oo-bar
として記述されている用語も、http://a.example/%66oo-bar
というIRIを指します。
ここで用いるEBNFは、XML 1.0[EBNF-NOTATION]で定義されています。[60s]のように、数値と末尾の「s」で構成される生成規則ラベルは、SPARQL 1.1クエリ言語文法[SPARQL11-QUERY]においてその数を持つ生成規則を参照しています。
注:
@base
」「@prefix
」、「a
」「true
」「false
」)は大文字・小文字を区別します。ダブル引用符(「BASE
」、「PREFIX
」)内のキーワードは大文字・小文字を区別しません。UCHAR
とECHAR
のエスケープ・シーケンスは、大文字・小文字を区別します。turtleDoc
です。ANON
::= '[
' WS*
']
' というトークンでは、空白とコメントは[]
間にいくつでも認められています。シングル・スペースのバージョンは、明瞭さのために文法で用いられます。prefix
」も「base
」も公認の言語サブタグではありませんが、「@prefix
」と「@base
」の文字列は、LANGTAGのパターンとマッチします。この仕様は、これらのトークン(例えば、"A"@base
)のどちらかが後続する引用符付きリテラルがTurtle言語に含まれるかどうかを定義しません。[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<>"{}|^`\ ] | UCHAR)* '> ' /* #x00=NULL #01-#x1F=control codes #x20=space */ |
[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 ] | [#x3001-#xD7FF ] | [#xF900-#xFDCF ] | [#xFDF0-#xFFFD ] | [#x10000-#xEFFFF ] |
[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 |
::= | '\ ' ('_ ' | '~ ' | '. ' | '- ' | '! ' | '$ ' | '& ' | "' " | '( ' | ') ' | '* ' | '+ ' | ', ' | '; ' | '= ' | '/ ' | '? ' | '# ' | '@ ' | '% ') |
RDF 1.1概念および抽象構文仕様[RDF11-CONCEPTS]は、IRI、リテラルおよび空白ノードという3種類のRDF用語を定義しています。リテラルは、字句形式と、オプションの言語タグ[BCP47]またはデータ型IRIで構成されます。prefix
という別の型は、解析中に文字列識別子を名前空間IRIにマッピングするために用います。この項では、生成規則と字句トークンにマッチする文字列をRDF用語やそれらの構成要素(例えば、言語タグ、リテラルの字句形式)にマッピングすることにより、6.5項 文法に適合する文字列をトリプルの集合にマッピングします。文法の生成規則により、パーサの状態が変更され、トリプルが作成されます。
Turtleの解析には、次の5つのアイテムの状態が必要です。
baseURI
― base生成規則に達した時には、2番目の規則引数であるIRIREF
は、相対IRIの解決に用いられる基底URIです。
namespaces
― prefixID生成規則の2番目と3番目規則引数(PNAME_NS
とIRIREF
)は、接頭辞(PNAME_NS
)に名前空間名(IRIREF
)を割り当てます。prefixID
生成規則以外では、あらゆるPNAME_NS
は名前空間と置き換えられます。(PN_PREFIX)? ":"
というPNAME_NS
生成規則により、接頭辞が空の文字列でありえることに注意してください。bnodeLabels
― 文字列から空白ノードへのマッピング。curSubject
― curSubject
がsubject
生成規則にバインドされます。curPredicate
― curPredicate
がverb
生成規則にバインドされます。マッチしたトークンが「a
」であった場合、curPredicate
はhttp://www.w3.org/1999/02/22-rdf-syntax-ns#type
というIRIにバインドされます。
次の表は、生成規則と字句トークンを、RDF terms
または7項 解析で挙げたRDF terms
の構成要素にマッピングしています。
生成規則 | 型 | 手順 |
---|---|---|
IRIREF | IRI | 「<」と「>」の間の文字を用いて、数値エスケープ・シーケンスをエスケープしないで、IRIのUnicode文字列を形成します。相対IRIの解決は6.3項により実行されます。 |
PNAME_NS | 接頭辞 | prefixID生成規則またはsparqlPrefix生成規則で用いた時には、prefix は、名前空間マップへのキーである規則の最初の引数にマッチする潜在的に空のUnicode文字列です。
|
IRI | PrefixedName生成規則で用いた時には、iri は、規則の最初の引数に対応する名前空間マップの値です。 |
|
PNAME_LN | IRI | 潜在的に空の接頭辞は、PNAME_NS という最初のシーケンスで識別されます。名前空間マップには対応する名前空間がなければなりません(MUST)。IRIのUnicode文字列は、2番目の引数であるPN_LOCAL で予約文字をエスケープせず、namespace に連結させることで形成されます。 |
STRING_LITERAL_SINGLE_QUOTE | 字句形式 | 最も外側の「'」の間の文字を用いて、数値および文字列のエスケープ・シーケンスをエスケープしないで、字句形式のUnicode文字列を形成します。 |
STRING_LITERAL_QUOTE | 字句形式 | 最も外側の「"」の間の文字を用いて、数値および文字列のエスケープ・シーケンスをエスケープしないで、字句形式のUnicode文字列を形成します。 |
STRING_LITERAL_LONG_SINGLE_QUOTE | 字句形式 | 最も外側の「'''」の間の文字を用いて、数値および文字列のエスケープ・シーケンスをエスケープしないで、字句形式のUnicode文字列を形成します。 |
STRING_LITERAL_LONG_QUOTE | 字句形式 | 最も外側の「"」の間の文字を用いて、数値および文字列のエスケープ・シーケンスをエスケープしないで、字句形式のUnicode文字列を形成します。 |
LANGTAG | 言語タグ | @ の後の文字は、言語タグのUnicode文字列を形成します。 |
RDFLiteral | リテラル | リテラルには、String という最初の規則の引数の字句形式があります。'^^' iri の規則がマッチする場合、データ型はiri で、リテラルには言語タグがありません。LANGTAG の規則がマッチした場合、データ型はrdf:langString で、言語タグはLANGTAG です。どちらもマッチしなかった場合、データ型はxsd:string で、リテラルには言語タグがありません。 |
INTEGER | リテラル | リテラルには、入力文字列の字句形式と、xsd:integer というデータ型があります。 |
DECIMAL | リテラル | リテラルには、入力文字列の字句形式と、xsd:decimal というデータ型があります。 |
DOUBLE | リテラル | リテラルには、入力文字列の字句形式と、xsd:double というデータ型があります。 |
BooleanLiteral | リテラル | リテラルには、true かfalse の字句形式があり(どれが入力とマッチしたかによる)と、xsd:boolean のデータ型があります。 |
BLANK_NODE_LABEL | 空白ノード | 2番目の引数であるPN_LOCAL とマッチする文字列は、bnodeLabelsのキーです。マップに対応する空白ノードがない場合、1が割り当てられます。 |
ANON | 空白ノード | 空白ノードが生成されます。 |
blankNodePropertyList | 空白ノード | 空白ノードが生成されます。次の項のblankNodePropertyList の規則に注意してください。
|
collection | 空白ノード | 空でないリストに対し、空白ノードが生成されます。次の項のcollection の規則に注意してください。 |
IRI | 空のリストに対し、結果として生じるIRIはrdf:nil です。次の項のcollection の規則に注意してください。 |
Turtleドキュメントは、RDFトリプルの集合で構成されるRDFグラフを定義しています。subject
生成規則は、curSubject
を設定します。verb
生成規則は、curPredicate
を設定します。ドキュメントの個々の目的語N
は、curSubject
curPredicate
N
.というRDFトリプルを生成します。
blankNodePropertyList
生成規則の開始により、curSubject
とcurPredicate
が記録され、curSubject
が新しいblank node
B
に設定されます。blankNodePropertyList
生成規則の終了により、curSubject
とcurPredicate
は復元されます。blankNodePropertyList
とのマッチにより生成されるノードは、空白ノードB
です。
collection
生成規則の開始により、curSubject
とcurPredicate
が記録されます。collection
生成規則の個々のobject
は、新しいblank node
B
に設定されたcurSubject
と、rdf:first
に設定されたcurPredicate
を持っています。最初のものの後で目的語objectn
ごとに、objectn-1
rdf:rest
objectn
.というトリプルが生成されます。collection
生成規則の終了により、curSubject rdf:rest rdf:nil
.というトリプルが追加生成され、curSubject
とcurPredicate
が復元されます。collection
とのマッチにより生成されたノードは、空でないリストに対する最初の空白ノードB
と、空のリストに対するrdf:nil
です。
この項は非規範的です。
次の参考情報の例は、このTurtleドキュメントをLALR(1)パーサで解析する際に行なわれるセマンティックなアクションを示します。
@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> .
http://www.w3.org/People/Eric/ericP-foaf.rdf#
というIRIにericFoaf
をマッピングします。http://xmlns.com/foaf/0.1/
というIRIに空の接頭辞をマッピングします。curSubject
にhttp://www.w3.org/People/Eric/ericP-foaf.rdf#ericP
というIRIを割り当てます。curPredicate
にhttp://xmlns.com/foaf/0.1/givenName
というIRIを割り当てます。<...rdf#ericP>
<.../givenName>
"Eric"
.というRDFトリプルを作成します。curPredicate
にhttp://xmlns.com/foaf/0.1/knows
というIRIを割り当てます。<...rdf#ericP>
<.../knows>
<...who/dan-brickley>
.というRDFトリプルを作成します。<...rdf#ericP>
<.../knows>
_:1
.というRDFトリプルを作成します。curSubject
を保存し、空白ノード_:1
に再び割り当てます。curPredicate
を保存します。curPredicate
にhttp://xmlns.com/foaf/0.1/mbox
というIRIを割り当てます。_:1
<.../mbox>
<mailto:timbl@w3.org>
.というRDFトリプルを作成します。curSubject
とcurPredicate
を、それらの保存した値(<...rdf#ericP>
, <.../knows>
)に復元させます。<...rdf#ericP>
<.../knows>
<http://getopenid.com/amyvdh>
.というRDFトリプルを作成します。この項は非規範的です。
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の内容は、type
属性をtext/turtle
に設定したscript
タグ内に記述すべきです。<
と>
の記号は、scriptタグ内でエスケープする必要はありません。組み込まれたTurtleの文字エンコードは、HTMLドキュメント・エンコーディングとマッチするでしょう。
この項は非規範的です。
JavaScriptのように、HTML(text/html
)用に記述したTurtleをXHTML(application/xhtml+xml
)で用いると壊れる場合があります。その解決策は、JavaScriptに用いられているものと同じです。
<script type="text/turtle"> # <![CDATA[ @prefix frbr: <http://purl.org/vocab/frbr/core#> . <http://books.example.com/works/45U8QJGZSQKDH8N> a frbr:Work . # ]]> </script>
Turtleデータ・ブロックは、XHTMLに組み込む時には、CDATAセクションで囲まなければなりません。このCDATAマーカーは、Turtleコメント内になければなりません。「]]>
」という文字列がドキュメントに出現すれば、それは文字列のエスケープ(\u005d\u0054\u003e
)を用いてエスケープされなければなりません。これによって、Turtleは、text/html
とapplication/xhtml+xml
の両方として機能する多言語ドキュメントでも安全になるでしょう。CDATAセクションの使用や「]]>
」のスケープを行わないと、整形式ではないXMLドキュメントが作成されるかもしれません。
この項は非規範的です。
組み込まれたTurtleの解析と通常のTurtleドキュメントには、構文上または文法上の違いはありません。HTML DOMから解析されたTurtleドキュメントは、UTF-8エンコードのバイトの列ではなく、文字データの列になるでしょう。HTMLドキュメントが既にDOMで解析されていれば、デコードは必要ありません。個々のscript
データ・ブロックは、自身のTurtleドキュメントであると考えられます。Turtleデータ・ブロックの@prefix
と@base
宣言の範囲はそのデータ・ブロックであり、その他のデータ・ブロックには影響を与えません。HTMLのlang
属性やXHTMLのxml:lang
属性は、データ・ブロックの解析には影響を与えません。カプセル化したHTMLドキュメントの基底URIは、RFC3986の5.1.1項により「コンテンツに組み込まれた基底URI」を提供します。
Turtleのインターネット・メディア・タイプ/MIMEタイプは、「text/turtle」です。
Turtleファイルは、すべてのプラットホーム上で拡張子「.ttl」(すべて小文字)であることが推奨されます。
マッキントッシュHFSファイル・システム上に保存されたTurtleファイルには、ファイル・タイプ「TEXT」が付与されていることが推奨されます。
下記のこの情報は、IANAでのレビュー、承認、および登録のためにIESGに提出されました。
charset
― このパラメータは、非ASCIIデータを転送する際に必要です。charset
は、それがもしあれば、常にUTF-8
です。この取り組みについては、他のRDF構文やTurtleの背景について論じているNew Syntaxes for RDFという論文(WWW2004に提出され、そこではN-Triples Plusと呼ばれた)で述べられました。
この取り組みは、EU IST-7プログラムIST-2001-34732の資金援助によるSemantic Web Advanced Development Europe (SWAD-Europe)プロジェクト(2002-2004年)の間に始められ、英国のブリストル大学Institute for Learning and Research Technology(2002-2005年9月)の支援でさらに開発がすすめられました。
Gregg Kellogg、Andy Seaborn、Sandro HawkeおよびRDFワーキンググループのメンバーにより、このバージョンへの有用な貢献が行われました。
ドキュメントは、より広範囲のコミュニティーによるレビュー・プロセスを通じて改善されました。
BASE
指示子とPREFIX
指示子の使用を認めるsparqlPrefixとsparqlBaseの追加は「危険」であると記述しました。この機能は、もはや危険ではありません。ex:first.name
。ex:7tm
W3C以前の提案変更履歴も参照してください。