【注意】 このドキュメントは、W3CのRDF 1.1 Primer W3C Working Group Note 25 February 2014の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2014年3月14日 | Last Update: 2014年3月18日
公開以後に報告されたエラーや問題がないか正誤表を確認してください。
Copyright © 2003-2014 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and document use rules apply.
この入門は、RDFを効果的に利用するために必要な基礎知識を読者に提供することを目指しています。RDFの基本概念を紹介し、RDF利用の具体例を示します。3~5項は、RDFの重要要素に対する必要最低限の入門として使用できます。RDF 1.1とRDF 1.0(2004年のバージョン)の間の変更点については、「RDF 1.1の新機能」[RDF11-NEW]という別のドキュメントで要約しています。
この項は、このドキュメントの公開時のステータスについて記述しています。他のドキュメントがこのドキュメントに取って代わることがありえます。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、http://www.w3.org/TR/のW3C技術報告インデックスにあります。
このドキュメントは、RDF 1.1ドキュメント群の一部です。それは、RDFの重要概念に関する参考情報となるメモです。RDF 1.1の規範的な仕様については、読者はRDF 1.1概念および抽象構文ドキュメント[RDF11-CONCEPTS]を参照してください。
このドキュメントは、RDFワーキンググループによってワーキンググループ・ノートとして発表されました。このドキュメントに関してコメントを行いたい場合には、public-rdf-comments@w3.org(購読、アーカイブ)にお送りください。どのようなコメントでも歓迎します。
ワーキンググループ・ノートとしての公開は、W3Cメンバーによる承認を意味するものではありません。これは草案ドキュメントであるため、他のドキュメントによって、随時更新されたり、置き換えられたり、廃止されることもありえます。このドキュメントを「作業中」以外のものとして引用することは適当ではありません。
このドキュメントは、2004年2月5日のW3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。
RDF(Resource Description Framework)は、資源に関する情報を表わすための枠組みです。資源は、ドキュメント、人間、物体、抽象的な概念を含む何ものでもありえます。
RDFは、人間に表示するだけではなく、アプリケーションがウェブ上の情報を処理する必要のある状況を目的としています。RDFは、この情報を表現するための共通の枠組みを提供するため、意味を損なわずにアプリケーション間で情報交換が行えます。共通の枠組みであるため、アプリケーションの設計者は共通のRDFパーサや処理ツールを有効利用できます。異なるアプリケーション間で情報交換できるということは、情報が元々作成された以外のアプリケーションでその情報を利用できることを意味します。
RDFはとりわけ、ウェブ上のデータを公開し連結するために使用できます。例えば、http://www.example.org/bob#me
を検索すると、ボブに関するデータを提供できます。ボブはアリスのIRI(IRIは「International Resource Identifier」。3.2項を参照)で識別されるため、これには、ボブが彼女のことを知っているという事実が含まれます。次に、アリスのIRIを検索すると、彼女の友達や関心などに関するその他のデータセットへのリンクを含む、彼女に関するより多くのデータを提供できます。その後、人または自動プロセスが、そのようなリンクをたどって、これらの様々な事物に関するデータを集約できます。RDFのこのような利用は、しばしばリンクト・データ[LINKED-DATA]に適しています。
このドキュメントは規範的ではなく、RDF 1.1を完全に説明するものでもありません。RDFの規範的な仕様は、次のドキュメントで見ることができます。
下記は、様々な実践コミュニティーを対象としたRDFの様々な異なる用途を説明しています。
RDFにより、資源について記述することが可能となります。このステートメントの形式はシンプルです。ステートメントは、常に次の構造を持っています。
<主語> <述語> <目的語>
RDFステートメントは、2つの資源の間の関係を表わします。主語と目的語は関連付けられる2つの資源を表わし、述語はこれらの関係の性質を表わします。関係は、方向性を持った方法(主語から目的語への)で表現され、RDFではそれをプロパティーと呼びます。RDFステートメントは3つの要素で構成されるため、トリプルと呼びます。
以下にRDFトリプルの例を示します(非形式的に擬似コードで表現)。
<Bob> <is a> <person>. <Bob> <is a friend of> <Alice>. <Bob> <is born on> <the 4th of July 1990>. <Bob> <is interested in> <the Mona Lisa>. <the Mona Lisa> <was created by> <Leonardo da Vinci>. <the video 'La Joconde à Washington'> <is about> <the Mona Lisa>
複数のトリプルが同じ資源を参照することがしばしばあります。上の例では、ボブ(Bob)は4つのトリプルの主語で、モナ・リザ(Mona Lisa)は1つのトリプルの主語と2つのトリプルの目的語です。同じ資源を、あるトリプルでは主語の位置に、別のトリプルでは目的語の位置に持つことができるこの能力により、トリプル間の関係性を発見でき、そのことはRDFの能力の重要要素となっています。
トリプルは、連結グラフとして視覚化できます。グラフは、ノードとアークで構成されます。トリプルの主語と目的語はグラフのノードを構築し、述語はアークを形成します。図1は、上記のトリプルの例を基に作成されるグラフを示します。
一度このようなグラフが得られれば、SPARQL[SPARQL11-OVERVIEW]を用いて、例えば、レオナルド・ダ・ヴィンチの絵に関心を持っている人に関するクエリを行うことができます。
この項では、RDFデータ・モデルは、「抽象構文」、つまり、特定の具象構文(テキスト・ファイルで格納されているトリプルを表わすために用いられる構文)に依存しないデータ・モデルの形式で記述しています。異なる具象構文は、抽象構文から見れば全く同じグラフを生成するかもしれません。RDFグラフ[RDF11-MT]のセマンティクスは、この抽象構文の観点で定義されます。具象RDF構文については、後ほど5項で紹介します。
次の3つの小項目では、IRI、リテラル、空白ノードという、トリプルに現れる3種類のRDFデータについて論じます。
IRIという略語は「International Resource Identifier」の省略形です。IRIは資源を識別します。Webのアドレスとして用いられているURL(Uniform Resource Locators)は、IRIの1つの形式です。その他のIRIの形式は、その位置や、それにアクセスする方法を示唆することなく、資源に識別子を提供します。IRIという概念はURI(Uniform Resource Identifier)を一般化したもので、非ASCII文字をIRIの文字列で使用できます。IRIは、RFC 3987[RFC3987]で規定されています。
IRIは、トリプルの3つの位置すべてに出現できます。
前に述べたように、IRIは、ドキュメント、人間、物体、抽象的な概念などの資源を識別するために用いられます。例えば、DBpedia内のレオナルド・ダ・ヴィンチのIRIは次のとおりです。
Europeanaの「La Joconde à Washington」と題するモナ・リザに関するINAのビデオのIRIは、次のとおりです。
IRIはグローバルな識別子です。したがって、他の人々が、同じものを識別するためにこのIRIを再利用できます。例えば、人々の間の知り合い関係を記述するために、多くの人が次のIRIをRDFプロパティーとして用いています。
RDFは、IRIが何を表わすかに依存しません。しかし、特定の語彙や規定でIRIに意味を与えることができます。例えば、DBpediaは、対応するウィキペディアの記事で記述されているものを示すためにhttp://dbpedia.org/resource/Name
という形式のIRIを用いています。
リテラルは、IRIでない基本的な値です。リテラルの例には、「La Joconde」のような文字列、「the 4th of July, 1990」のような日付、「3.14159」のような数が含まれます。リテラルは、データ型に関連付けることで、その値を正確に解析、解釈できるようになります。文字列のリテラルは、オプションで言語タグに関連付けることができます。例えば、「Léonard de Vinci」は「fr」という言語タグに、「李奥纳多·达·文西」は「zh」という言語タグに関連付けることができます。
リテラルは、トリプルの目的語の位置にのみ出現できます。
RDF概念のドキュメントは、(完全ではない)データ型のリストを提供します。これには、文字列、ブール値、整数、10進数、日付などのXMLスキーマで定義されている多くのデータ型が含まれています。
IRIとリテラルはともに、RDFステートメントを記述するための基本的な材料となります。それに加えて、グローバルな識別子を用いずに資源を記述できると便利なことがあります。例えば、モナ・リザの絵の背景にヌマスギ(cypress tree)として知られている未確認の木が描かれていると述べたいとします。絵のヌマスギのようなグローバルな識別子のない資源は、RDFでは空白ノードで表わすことができます。空白ノードは、代数の単純変数に似ています。つまり、その値が何なのかを述べずに事物を表わします。
空白ノードは、トリプルの主語と目的語の位置に出現できます。これを使用すれば、明示的にIRIで指定せずに、資源を示すことができます。
RDFは、複数のグラフのRDFステートメントをグループ化し、そのようなグラフをIRIに関連付ける方法を提供します。複数のグラフは、RDFデータ・モデルの最近の拡張です。実際のところ、RDFツールの開発者やデータの管理者には、トリプルの集合のサブセットについて記述する方法が必要でした。複数のグラフは、RDFクエリ言語SPARQLで最初に導入されました。したがって、RDFデータ・モデルは、SPARQLと緊密に関連する複数のグラフの概念で拡張されました。
RDFドキュメントの複数のグラフは、RDFデータセットを構成します。RDFデータセットは、複数の名前付きグラフと、高々1つの名前のない(「デフォルト」)グラフを持つことができます。
例えば、例1のステートメントは、2つの名前付きグラフにグループ化できます。最初のグラフは、ソーシャル・ネットワーキングのサイトで提供します。これはhttp://example.org/bob
で識別できます。
<Bob> <is a> <person>. <Bob> <is a friend of> <Alice>. <Bob> <is born on> <the 4th of July 1990>. <Bob> <is interested in> <the Mona Lisa>.
グラフに関連付けられたIRIをグラフ名と呼びます。
2番目のグラフはWikidataで提供します。これはhttps://www.wikidata.org/wiki/Special:EntityData/Q12418
で識別できます。
<Leonardo da Vinci> <is the creator of> <the Mona Lisa>. <The video 'La Joconde à Washington'> <is about> <the Mona Lisa>
下記は名前のないグラフの例です。これには、グラフ名<http://example.org/bob>
を主語として持つ2つのトリプルが含まれています。このトリプルは、公開者とライセンスの情報をこのグラフIRIに関連付けています。
<http://example.org/bob> <is published by> <http://example.org>. <http://example.org/bob> <has license> <http://creativecommons.org/licenses/by/3.0/>.
このデータセットの例では、グラフ名は、対応するグラフ内で保持されているRDFデータの情報源を表わすと考えられます。つまり、<http://example.org/bob>
を検索すると、そのグラフ内の4つのトリプルにアクセスすることになるでしょう。
RDFには、データセットの他の利用者にこのセマンティックな仮定(つまり、グラフの名前はRDFデータの情報源を表わすという仮定)を伝える標準的な方法がありません。意図されているとおりに利用者がデータセットを解釈するためには、コミュニティーの定着した慣習のようなの帯域外の知識(out-of-band knowledge)に頼る必要があるでしょう。考えられるデータセットのセマンティクスに関しては、別のノート[RDF11-DATASETS]で記述しています。
5.1.3項は、このグラフの具象構文の例を提供します。
RDFデータ・モデルは、資源について記述する方法を提供します。前に述べたように、このデータ・モデルは、IRIがどのような資源を表わすかに関していかなる仮定も行いません。実際には、RDFは一般的に、これらの資源に関してセマンティックな情報を提供する語彙やその他の規定と組み合わせて用いられます。
語彙の定義をサポートするために、RDFはRDFスキーマ言語[RDF11-SCHEMA]を提供しています。この言語によって、RDFデータのセマンティックな特性の定義が可能となります。例えば、http://www.example.org/friendOf
というIRIはプロパティーとして使用でき、http://www.example.org/friendOf
のトリプルの主語と目的語は、http://www.example.org/Person
というクラスの資源でなければならないと述べることができます。
RDFスキーマは、資源の分類に使用できるカテゴリーを指定するためにクラスの概念を用います。そのクラスとインスタンスとの関係は型プロパティーで記述します。RDFスキーマで、クラスとサブクラスの階層およびプロパティーとサブプロパティーの階層を作ることができます。特定のトリプルの主語と目的語に対する型の制限は、定義域と値域の制限で定義できます。定義域制限の一例として、「friendOf」トリプルの主語はクラス「Person」に属しているべきである、という例を上記に示しました。
RDFスキーマで提供される主要なモデリング構成子を次の表で要約しています。
構成子 | 構文形式 | 説明 |
---|---|---|
クラス(Class) - (クラス) | C rdf:type rdfs:Class |
C(資源)はRDFクラス |
プロパティー(Property) - (クラス) | P rdf:type rdf:Property |
P(資源)はRDFプロパティー |
型(type) - (プロパティー) | I rdf:type C |
I(資源)はC(クラス)のインスタンス |
~のサブクラス(subClassOf) - (プロパティー) | C1 rdfs:subClassOf C2 |
C1(クラス)はC2(クラス)のサブクラス |
~のサブプロパティー(subPropertyOf) - (プロパティー) | P1 rdfs:subPropertyOf P2 |
P1(プロパティー)はP2(プロパティー)のサブプロパティー |
定義域(domain) - (プロパティー) | P rdfs:domain C |
P(プロパティー)の定義域はC(クラス) |
値域(range) - (プロパティー) | P rdfs:range C |
P(プロパティー)の値域はC(クラス) |
構文形式(2列目)は接頭辞表記法で記述しています。これについては5項でより詳細に論じます。構成子には2つの異なる接頭辞(rdf:
とrdfs:
)があるという事実は、多少やっかいな歴史的産物ですが、これは下位互換性のために残されています。
RDFスキーマのおかげで、RDFデータのモデルを構築できます。下記はシンプルで非形式的な例です。
<Person> <type> <Class> <is a friend of> <type> <Property> <is a friend of> <domain> <Person> <is a friend of> <range> <Person> <is a good friend of> <subPropertyOf> <is a friend of>
<is a friend of>
は一般的に、トリプルの述語として用いられる(例1でそうであったように)プロパティーですが、このようなプロパティー自体は、トリプルで記述したり、他の資源の記述に値を提供したりできる資源であるということに注意してください。この例では、<is a friend of>
は、型、定義域、値域の値が割り当てられているトリプルの主語であり、さらに、<is a good friend of>
というプロパティーに関して何かを記述しているトリプルの目的語です。
世界的に用いられている初期のRDF語彙の1つは、ソーシャル・ネットワークを記述するための「Friend of a Friend」(FOAF)の語彙でした。その他のRDF語彙の例は次のとおりです。
語彙は再利用によって価値を持ちます。つまり、IRIは、他者から語彙を再利用されればされるほど、IRIの利用価値が高まります(いわゆるネットワーク効果)。これは、新しいIRIを作り出すのではなく、だれか他の人のIRIを再利用する方が良いということを意味します。
RDFスキーマ構成子のセマンティクスの形式的な仕様については、RDFセマンティクスのドキュメント[RDF11-MT]を参照してください。RDFデータのより包括的なセマンティック・モデリングに興味を持っているユーザは、OWL[OWL2-OVERVIEW]を使用することも考えられます。OWLはRDF語彙であるため、RDFスキーマと組み合わせて使用できます。
RDFグラフを記述するために、多数の様々なシリアル化形式が存在しています。しかし、同じグラフを別の方法で記述してもまったく同じトリプルになりえ、したがって、それらは論理的に同等です。
この項では、例に注釈を付しながら、次の形式について簡潔に紹介します。
読むにあたってのヒント: 5.1項(Turtleなど)では、RDFをシリアル化するためのすべての基本概念について論じています。RDFの特定の利用に興味がある場合にのみ、JSON-LD、RDFa、RDF/XMLの項を読まれることをお勧めします。
この小項目では、密接な関連性を有する4つのRDF言語を紹介します。N-Triplesは、RDFトリプルを記述するための基本的な構文を提供するため、N-Triplesの紹介から始めます。Turtle構文は、読みやすさを改善するために、様々な糖衣構文形式でこの基本的な構文を拡張します。続いて、TriGとN-Quadsについて論じます。これらはそれぞれTurtleとN-Triplesの拡張で、複数のグラフをエンコードするためのものです。これらの4つを合わせて「RDF言語のTurtleファミリー」と呼びます。
N-Triples[N-TRIPLES]は、シンプルな行ベースのプレーン・テキストでRDFグラフをシリアル化する方法を提供します。図1の非形式的なグラフは、次の方法でN-Triplesで表わすことができます。
01 <http://example.org/bob#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> . 02 <http://example.org/bob#me> <http://xmlns.com/foaf/0.1/knows> <http://example.org/alice#me> . 03 <http://example.org/bob#me> <http://schema.org/birthDate> "1990-07-04"^^<http://www.w3.org/2001/XMLSchema#date> . 04 <http://example.org/bob#me> <http://xmlns.com/foaf/0.1/topic_interest> <http://www.wikidata.org/entity/Q12418> . 05 <http://www.wikidata.org/entity/Q12418> <http://purl.org/dc/terms/title> "Mona Lisa" . 06 <http://www.wikidata.org/entity/Q12418> <http://purl.org/dc/terms/creator> <http://dbpedia.org/resource/Leonardo_da_Vinci> . 07 <http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619> <http://purl.org/dc/terms/subject> <http://www.wikidata.org/entity/Q12418> .
各行はトリプルを表わします。フル形式のIRIは、山括弧(<>
)で囲んでいます。行末のピリオドは、トリプルの終わりを示します。3行目には、リテラルの例があります。この場合、それは日付です。データ型は、^^
という区切り記号でリテラルに付記されます。日付の表現は、XMLスキーマ・データ型の日付の規定に従います。
文字列のリテラルは至る所に出現するため、N-Triplesでは、文字列のリテラルを書く場合には、ユーザはデータ型を省略できます。したがって、5行目の"Mona Lisa"
は、"Mona Lisa"^^xsd:string
と同等です。言語タグ付き文字列の場合には、"La Joconde"@fr
(モナ・リザのフランス語名)のように、タグは、@
という記号で区切って文字列の直後に出現します。
技術的な理由で、言語タグ付き文字列のデータ型はxsd:string
ではなくrdf:langString
です。言語タグ付き文字列のデータ型は、決して明示的に指定されません。
下の図は、例の結果のトリプルを示します。
N-Triplesの例の7行が上の図の7つのアークに相当することに注意してください。
N-Triplesは、大量のRDFの交換や、行指向型テキスト処理ツールで大規模なRDFグラフを処理するためにしばしば用いられます。
Turtle[TURTLE]は、N-Triplesの拡張です。Turtleは、基本的なN-Triples構文に加えて、名前空間接頭辞、リスト、データ型リテラルの省略形のサポートなど、多くの構文の省略形を導入しています。Turtleは、記述の容易さと解析および可読性の容易さの間のトレードオフを提供します。図4で示しているグラフは、Turtleで次のように表わすことができます。
01 BASE <http://example.org/> 02 PREFIX foaf: <http://xmlns.com/foaf/0.1/> 03 PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 04 PREFIX schema: <http://schema.org/> 05 PREFIX dcterms: <http://purl.org/dc/terms/> 06 PREFIX wd: <http://www.wikidata.org/entity/> 07 08 <bob#me> 09 a foaf:Person ; 10 foaf:knows <alice#me> ; 11 schema:birthDate "1990-07-04"^^xsd:date ; 12 foaf:topic_interest wd:Q12418 . 13 14 wd:Q12418 15 dcterms:title "Mona Lisa" ; 16 dcterms:creator <http://dbpedia.org/resource/Leonardo_da_Vinci> . 17 18 <http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619> 19 dcterms:subject wd:Q12418 .
このTurtleの例は、N-Triplesの例と論理的に同等です。1~6行目には、IRI記述の省略形を提供する多くの指示子が含まれています。相対IRI(8行目のbob#me
など)は、上記の1行目で指定されている基底IRIに対して解決されます。2~6行目では、IRI接頭辞(foaf:
など)を定義しており、これはフル形式のIRIの代わりに接頭辞名(foaf:Person
など)に使用できます。対応するIRIは、接頭辞をその対応するIRIに置き換えることで作成されます(この例では、foaf:Person
は<http://xmlns.com/foaf/0.1/Person>
を表わす)。
8~12行目は、同じ主語を持つトリプルにTurtleが省略形を提供する方法を示しています。9~12行目は、<http://example.org/bob#me>
を主語として持つ、述語-目的語部分を指定しています。9~11行目の末尾のセミコロンは、その後の述語-目的語のペアが、データ内で示されている最も新しい主語を用いた新しいトリプル(この場合はbob#me
)の一部であることを示します。
9行目は、特殊な糖衣構文の例を示しています。トリプルは、非形式的に「Bob (is) a Person」と読むべきです。a
という述語はインスタンス関係をモデル化するプロパティーrdf:type
の短縮形です(表1を参照)。a
という短縮形は、rdf:type
に関する人間の直観と一致させることを目的としたものです。
以下に、以前のヌマスギ(cypress tree)の例を用いて、空白ノードを記述するための2つの異なる構文を示します。
PREFIX lio: <http://purl.org/net/lio#> <http://dbpedia.org/resource/Mona_Lisa> lio:shows _:x . _:x a <http://dbpedia.org/resource/Cypress> .
_:x
という用語は空白ノードです。これは、モナ・リザの絵に描かれている名前のない資源を表わし、この名前のない資源はCypress
というクラスのインスタンスです。上の例は、図2の非形式的なグラフの具象構文です。
Turtleには、空白ノード用の別の表記法もあり、_:x
のような構文を用いる必要はありません。
@prefix foaf: <http://xmlns.com/foaf/0.1/> . # Some resource (blank node) is interested in some other resource # entitled "Mona Lisa" and created by Leonardo da Vinci. [] foaf:topic_interest [ dcterms:title "Mona Lisa" ; dcterms:creator <http://dbpedia.org/resource/Leonardo_da_Vinci> ] .
角括弧は、ここでは空白ノードを表わします。角括弧内の述語-目的語のペアは、空白ノードを主語として持つトリプルと解釈されます。「#」で始まる行はコメントを表わします。
Turtleの構文に関する詳細は、Turtleの仕様[TURTLE]を参照してください。
Turtleの構文は、グラフに「名前を付ける」手段がなく、1つのグラフの仕様のみをサポートします。TriG[TRIG]は、RDFデータセットの形式で複数のグラフの仕様を可能とするTurtleの拡張です。
RDF 1.1では、あらゆる正当なTurtleドキュメントは正当なTriGドキュメントです。それを1つの言語と見ることができるでしょう。TurtleとTriGの名前は、歴史上の理由によりまだ存在しています。
我々の例の複数グラフのバージョンは、TriGで次のように指定できます。
01 BASE <http://example.org/> 02 PREFIX foaf: <http://xmlns.com/foaf/0.1/> 03 PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 04 PREFIX schema: <http://schema.org/> 05 PREFIX dcterms: <http://purl.org/dc/terms/> 06 PREFIX wd: <http://www.wikidata.org/entity/> 07 08 GRAPH <http://example.org/bob> 09 { 10 <bob#me> 11 a foaf:Person ; 12 foaf:knows <alice#me> ; 13 schema:birthDate "1990-07-04"^^xsd:date ; 14 foaf:topic_interest wd:Q12418 . 15 } 16 17 GRAPH <https://www.wikidata.org/wiki/Special:EntityData/Q12418> 18 { 19 wd:Q12418 20 dcterms:title "Mona Lisa" ; 21 dcterms:creator <http://dbpedia.org/resource/Leonardo_da_Vinci> . 22 23 <http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619> 24 dcterms:subject wd:Q12418 . 25 } 26 27 <http://example.org/bob> 28 dcterms:publisher <http://example.org> ; 29 dcterms:rights <http://creativecommons.org/licenses/by/3.0/> .
このRDFデータセットには2つの名前付きグラフが含まれています。8行目と17行目に、これらの2つのグラフの名前を記述しています。名前付きグラフ内のトリプルは、一揃いの中括弧の間に置かれます(9行目と15行目、18行目と25行目)。オプションで、GRAPH
というキーワードをグラフ名の前に置くことができます。これによって読みやすさが改善するかもしれませんが、これは主にSPARQL更新[SPARQL11-UPDATE]との調和のために導入されています。
最上部のトリプルと指示子の構文は、Turtle構文に準拠しています。
27~29行目で指定されている2つのトリプルは、名前付きグラフの一部ではありません。これらは、合わせて、このRDFデータセットの名前のない(「デフォルトの」)グラフを形成します。
下記の図は、この例の結果として作成されるトリプルを示します。
N-Quads[N-QUADS]は、N-Triplesをシンプルに拡張してRDFデータセットの交換を可能としたものです。N-Quadsにより、4番目の要素を行に追加することが可能となり、その行に記述されているトリプルのグラフIRIを取り入れます。下記は、上記のTriGの例のN-Quadsバージョンです。
01 <http://example.org/bob#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> <http://example.org/bob> . 02 <http://example.org/bob#me> <http://xmlns.com/foaf/0.1/knows> <http://example.org/alice#me> <http://example.org/bob> . 03 <http://example.org/bob#me> <http://schema.org/birthDate> "1990-07-04"^^<http://www.w3.org/2001/XMLSchema#date> <http://example.org/bob> . 04 <http://example.org/bob#me> <http://xmlns.com/foaf/0.1/topic_interest> <http://www.wikidata.org/entity/Q12418> <http://example.org/bob> . 05 <http://www.wikidata.org/entity/Q12418> <http://purl.org/dc/terms/title> "Mona Lisa" <https://www.wikidata.org/wiki/Special:EntityData/Q12418> . 06 <http://www.wikidata.org/entity/Q12418> <http://purl.org/dc/terms/creator> <http://dbpedia.org/resource/Leonardo_da_Vinci> <https://www.wikidata.org/wiki/Special:EntityData/Q12418> . 07 <http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619> <http://purl.org/dc/terms/subject> <http://www.wikidata.org/entity/Q12418> <https://www.wikidata.org/wiki/Special:EntityData/Q12418> . 08 <http://example.org/bob> <http://purl.org/dc/terms/publisher> <http://example.org> . 09 <http://example.org/bob> <http://purl.org/dc/terms/rights> <http://creativecommons.org/licenses/by/3.0/> .
N-Quadsの例の9つの行は、図5の9つのアークに相当します。1~7行目はクアッド(quad;4つ組)を表わし、その最初の要素がグラフIRIです。クアッド内のグラフIRIより後の部分は、N-Triplesの構文規定に従い、ステートメントの主語、述語、目的語を指定します。8行目と9行目は、名前のない(デフォルトの)グラフのステートメントを表わし、これには4番目の要素がなく、したがって、通常のトリプルを構成します。
N-Triplesと同様に、N-Quadsは通常、大量のRDFデータセットの交換や行指向型テキスト処理ツールでRDFを処理するために用いられます。
JSON-LD[JSON-LD]は、RDFグラフとデータセットにJSON構文を提供します。JSON-LDは、変化を最小限にしつつ、JSONドキュメントをRDFに変換するために使用できます。JSON-LDは、データ型や言語の処理に加え、JSONドキュメントがウェブ上の別の場所にある別のJSONドキュメントに記述されているオブジェクトを参照できるメカニズムとしてJSONオブジェクトにユニバーサルな識別子を提供します。JSON-LDは、@graph
というキーワードの使用によりRDFデータセットをシリアル化する方法も提供します。
次のJSON-LDの例は、図4のグラフをエンコードしたものです。
01 { 02 "@context": "example-context.json", 03 "@id": "http://example.org/bob#me", 04 "@type": "Person", 05 "birthdate": "1990-07-04", 06 "knows": "http://example.org/alice#me", 07 "interest": { 08 "@id": "http://www.wikidata.org/entity/Q12418", 09 "title": "Mona Lisa", 10 "subject_of": "http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619", 11 "creator": "http://dbpedia.org/resource/Leonardo_da_Vinci" 12 } 13 }
2行目の@context
キーは、どのようにドキュメントをRDFグラフにマッピングできるかを記述したJSONドキュメントを指し示します(下記を参照)。個々のJSONオブジェクトは、RDF資源に相当します。この例では、3行目で@id
キーワードを用いて指定しているように、記述されている主な資源はhttp://example.org/bob#me
です。@id
キーワードは、JSON-LDドキュメントでキーとして用いた場合、現在のJSONオブジェクトに対応する資源を識別するIRIを指し示します。4行目でこの資源の型、5行目でその生年月日、6行目でその友達の1人を記述しています。7~12行目に、関心の1つである、モナ・リザの絵について記述しています。
この絵を記述するために、7行目で新しいJSONオブジェクトを作成し、8行目でそれをWikidataのモナ・リザのIRIに関連づけています。その後、9~11行目でその絵の様々なプロパティー(特性)を記述しています。
この例で用いているJSON-LDのコンテキストを下記で示しています。
01 { 02 "@context": { 03 "foaf": "http://xmlns.com/foaf/0.1/", 04 "Person": "foaf:Person", 05 "interest": "foaf:topic_interest", 06 "knows": { 07 "@id": "foaf:knows", 08 "@type": "@id" 09 }, 10 "birthdate": { 11 "@id": "http://schema.org/birthDate", 12 "@type": "http://www.w3.org/2001/XMLSchema#date" 13 }, 14 "dcterms": "http://purl.org/dc/terms/", 15 "title": "dcterms:title", 16 "creator": { 17 "@id": "dcterms:creator", 18 "@type": "@id" 19 }, 20 "subject_of": { 21 "@reverse": "dcterms:subject", 22 "@type": "@id" 23 } 24 } 25 }
このコンテキストは、どのようにJSON-LDドキュメントをRDFグラフにマッピングできるかを記述しています。4~9行目では、Person
(人)、interest
(関心)、knows
(知っている)を、3行目で定義しているFOAF名前空間の型とプロパティーにマッピングする方法を定めています。8行目で、knows
キーは、@type
と@id
のキーワードの使用により、IRIとして解釈される値を持つこということも定めています。
10~12行目では、schema.orgプロパティーのIRIにbirthdate
(生年月日)をマッピングし、その値をxsd:date
データ型にマッピングできることを定めています。
16~23行目では、ダブリン・コアのプロパティーのIRIに、title
(タイトル)、creator
(作成者)、subject_of
(~のキーワード)をマッピングする方法を記述しています。21行目の@reverse
キーワードは、このコンテキストを用いたJSON-LDドキュメントで"subject_of": "x"
に遭遇した場合は常に、主語がx
IRI、プロパティーがdcterms:subject
、目的語が親のJSONオブジェクトに対応した資源であるRDFトリプルにそれをマッピングすべきであることを定めるために用いられています。
RDFa[RDFA-PRIMER]は、HTMLとXMLのドキュメント内にRDFデータを組み込むために使用できるRDF構文です。これにより、例えば検索エンジンは、ウェブをクローリングする際にこのデータを集約し、検索結果を拡充するためにそれを利用できます(例えば、schema.orgとRich Snippetsを参照)。
次のHTMLの例は、図4で描かれているRDFグラフをエンコードしています。
01 <body prefix="foaf: http://xmlns.com/foaf/0.1/ 02 schema: http://schema.org/ 03 dcterms: http://purl.org/dc/terms/"> 04 <div resource="http://example.org/bob#me" typeof="foaf:Person"> 05 <p> 06 Bob knows <a property="foaf:knows" href="http://example.org/alice#me">Alice</a> 07 and was born on the <time property="schema:birthDate">1990-07-04</time>. 08 </p> 09 <p> 10 Bob is interested in <span property="foaf:topic_interest" 11 resource="http://www.wikidata.org/entity/Q12418">the Mona Lisa</span>. 12 </p> 13 </div> 14 <div resource="http://www.wikidata.org/entity/Q12418"> 15 <p> 16 The <span property="dcterms:title">Mona Lisa</span> was painted by 17 <a property="dcterms:creator" href="http://dbpedia.org/resource/Leonardo_da_Vinci">Leonardo da Vinci</a> 18 and is the subject of the video 19 <a href="http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619">'La Joconde à Washington'</a>. 20 </p> 21 </div> 22 <div resource="http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619"> 23 <link property="dcterms:subject" href="http://www.wikidata.org/entity/Q12418"/> 24 </div> 25 </body>
上記の例には、HTML内でRDFトリプルの仕様を有効にする、resource
(資源)、property
(プロパティー)、typeof
(~の型)、prefix
(接頭辞)の4つの特別なRDFa属性が含まれています。
1行目のprefix
属性は、Turtle接頭辞と同じような方法でIRIの省略形を指定します。厳密に言えば、RDFaには、この例で用いているものを含め、定義済み接頭辞のリストがあるため、これらの特別な接頭辞は省略可能でした。
4行目と14行目のdiv
要素には、このHTML要素内でRDFステートメントを記述できるIRIを指定するresource
属性があります。4行目のtypeof
属性の意味は、Turtleの(is) a
という省略形に似ており、主語であるhttp://example.org/bob#me
は、foaf:Person
というクラスのインスタンス(rdf:type
)です。
6行目にはproperty
属性があり、この属性の値(foaf:knows
)は、RDFプロパティーIRIとして解釈されます。href
属性の値(http://example.org/alice#me
)は、ここではトリプルの目的語として解釈されます。したがって、6行目の結果であるRDFステートメントは次のとおりです。
<http://example.org/bob#me> <http://xmlns.com/foaf/0.1/knows> <http://example.org/alice#me> .
7行目には、リテラル値を目的語として持つトリプルがあります。property
属性は、ここではHTMLのtime
要素で指定されています。HTMLでは、時間(time)要素の内容は、何らかの有効な時間の値である必要があります。time
要素の組み込み済みのHTMLセマンティクスを用いれば、RDFaは、明示的なデータ型宣言なしに、値をxsd:date
として解釈できます。
10~11行目には、トリプルの目的語を指定するためにも用いられているresource
属性があります。このアプローチは、目的語がIRIで、IRI自体がHTMLコンテンツ(href
属性など)の一部ではない場合に用いられます。16行目には、2番目のリテラルの例(「モナ・リザ」)が含まれており、ここではspan
属性のコンテンツとして定義されています。RDFaは、リテラルのデータ型を推論できない場合には、データ型はxsd:string
であると推測するでしょう。
RDFステートメントをドキュメントのHTMLコンテンツの一部として定義することが可能だとは限りません。その場合、コンテンツを表示しないHTML構成子を用いてトリプルを指定できます。22~23行目にその例があります。23行目のHTMLのlink
要素は、Europeanaのビデオ(22行目)のトピックが何なのかを明示するためにここで用いられています。
この例のRDFaの使用は、RDFa Lite[RDFA-LITE]に制限されています。RDFaに関する詳細については、RDFa入門[RDFA-PRIMER]をご覧ください。
RDF/XML[RDF-SYNTAX-GRAMMAR]は、RDFグラフにXML構文を提供します。RDFが最初に開発された1990年代後半には、これはRDFの唯一の構文であり、いまだにこの構文を「RDF」と呼ぶ人もいます。2001年には、「N3」と呼ばれるTurtleの前身が提案され、徐々に、ここで列挙しているその他の言語が採用され、標準化されました。
下記のRDF/XMLの例は、図4で描かれているRDFグラフをエンコードしています。
01 <?xml version="1.0" encoding="utf-8"?> 02 <rdf:RDF 03 xmlns:dcterms="http://purl.org/dc/terms/" 04 xmlns:foaf="http://xmlns.com/foaf/0.1/" 05 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 06 xmlns:schema="http://schema.org/"> 07 <rdf:Description rdf:about="http://example.org/bob#me"> 08 <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/> 09 <schema:birthDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">1990-07-04</schema:birthDate> 10 <foaf:knows rdf:resource="http://example.org/alice#me"/> 11 <foaf:topic_interest rdf:resource="http://www.wikidata.org/entity/Q12418"/> 12 </rdf:Description> 13 <rdf:Description rdf:about="http://www.wikidata.org/entity/Q12418"> 14 <dcterms:title>Mona Lisa</dcterms:title> 15 <dcterms:creator rdf:resource="http://dbpedia.org/resource/Leonardo_da_Vinci"/> 16 </rdf:Description> 17 <rdf:Description rdf:about="http://data.europeana.eu/item/04802/243FA8618938F4117025F17A8B813C5F9AA4D619"> 18 <dcterms:subject rdf:resource="http://www.wikidata.org/entity/Q12418"/> 19 </rdf:Description> 20 </rdf:RDF>
RDF/XMLではRDFトリプルは、rdf:RDF
というXML要素内で指定します(2行目と20行目)。rdf:RDF
開始タグの属性(3~6行目)は、XMLの要素と属性の名前を記述するための省略形を提供します。rdf:Description
というXML要素(http://www.w3.org/1999/02/22-rdf-syntax-ns#Description
の省略形)は、about
属性で指定されているIRIを主語として持つトリプルの集合を定義するために用いられます。最初の記述ブロック(7~12行目)には4つの下位要素があります。下位要素の名前は、RDFプロパティーを表わすIRI(例えばrdf:type
)です(8行目)。ここの下位要素はそれぞれ1つのトリプルを表わします。トリプルの目的語がIRIでもある場合には、プロパティー下位要素には内容がなく、その目的語のIRIはrdf:resource
属性を用いて指定されます(8、10~11、15、18行目)。例えば、10行目は次のトリプルに相当します。
<http://example.org/bob#me> <http://xmlns.com/foaf/0.1/knows> <http://example.org/alice#me> .
トリプルの目的語がリテラルであれば、そのリテラルの値がプロパティーの要素のコンテンツとして入力されます(9行目と14行目)。データ型はプロパティーの要素の属性として指定されます(9行目)。データ型が省略され(14行目)、言語タグが存在しない場合、リテラルはxsd:string
というデータ型を持つと考えられます。
例は、ベースラインの構文を示しています。構文のより詳細な処理に関しては、RDF/XMLドキュメント[RDF11-XML]をご覧ください。これらの名前空間の一部に接頭辞が定義されていたという事実にもかかわらず、属性値にフル形式のIRIが含まれているのは変だと思われるかもしれません。それは、これらの接頭辞はXML要素と属性名にのみ使用できるからという理由によります。
RDFを使用する重要な目標は、整合性と有用性を保ちつつより大きな集合を形成するために複数の情報源の有用な情報を自動的に結合できることです。この結合のための出発点として、上で述べたように、すべての情報は、主語-述語-目的語のトリプルという同じシンプルな形式で伝えられます。しかし、情報の整合性を保つためには、単なる標準構文を越えることが必要で、これらのトリプルのセマンティクスについて合意する必要もあります。
入門仕様のこの時点までに、読者は、RDFのセマンティクスを直観的に理解できるようになっているでしょう。
これらの概念(また、他のものも)、RDFセマンティクスのドキュメント[RDF11-MT]では、数学的正確さで指定されます。
これらの宣言的セマンティクスを持つRDFの利点の1つは、システムが論理的な推論を行うことができるということです。すなわち、真として受け入れたあるトリプルの入力データの集合を与えられれば、システムは、ある状況下において、論理的に他のトリプルも真であるに違いないと推定できます。我々は、最初のトリプルの集合が追加のトリプルを「含意する」といいます。「推論システム」と呼ばれるこれらのシステムは、与えられたトリプルの入力データが互いに矛盾することがあると推定することもできます。
新しい概念を使用したい時に新しい語彙を作成できる場合、RDFの柔軟性が得られれば、実行したい異なる種類の推論がたくさんあります。特定の種類の推論が様々なアプリケーションに役立つと思われる場合には、それを含意レジーム(entailment regime)としてドキュメント化できます。いくつかの含意レジームがRDFセマンティクスで規定されています。他のいくつかの含意レジームと、SPARQLでこれらを用いる方法の技術的な解説については[SPARQL11-ENTAILMENT]を参照してください。含意レジームには、かなり簡単に実装し素早く推論を実行できるものもありますが、効果的に実装するためには精巧な技術が必要なものもあることに注意してください。
含意の例として、次の2つのステートメントについて考えてみてください。
ex:bob foaf:knows ex:alice .
foaf:knows rdfs:domain foaf:Person .
このグラフから次のトリプルを導き出すことは正当であることが、RDFセマンティクスのドキュメントから分かります。
ex:bob rdf:type foaf:Person .
上記の導出は、RDFスキーマ含意[RDF11-MT]の例です。
リテラルがXMLスキーマ・データ型のinteger(整数)に対して定義されている制約に準拠していないため、RDFのセマンティクスから、
ex:bob ex:age "forty"^^xsd:integer .
このトリプルには論理矛盾が生じることも分かります。
RDFツールがすべてのデータ型を認識するとは限らないことに注意してください。最小限、ツールは文字列のリテラルと言語タグ付きリテラル用のデータ型をサポートする必要があります。
他の多くのデータ・モデリング言語とは異なり、RDFスキーマはモデリングに関し相当な自由度が認められています。例えば、同じエンティティーをクラスとプロパティーの両方として使用できます。さらに、「クラス」と「インスタンス」の領域には厳密な区別はありません。したがって、RDFセマンティクスは、次のグラフを有効なものと見なします。
ex:Jumbo rdf:type ex:Elephant .
ex:Elephant rdf:type ex:Species .
したがって、elephant(象)は、クラス(Jumboを例のインスタンスとして持つ)とインスタンス(つまり、動物種(animal species)のクラスに属する)の両方になりえます。
この項の例は、RDFセマンティクスによって何がもたらされるのかに関する何らかの感覚を読者に与えることだけを目的としています。完全な記述に関しては[RDF11-MT]を見てください。
RDFにより、任意の情報源の複数のトリプルをグラフへと結合させ、正当なRDFとして処理できるようになります。大量のRDFデータは、リンクト・データ[LINKED-DATA]として利用できます。データセットは、RDFを用いて、ウェブ上で公開され連結され、そのうちの多くは、SPARQL[SPARQL11-OVERVIEW]でクエリ機能を提供します。上記の例で用いているそのようなデータセットの例には、次のものが含まれます。
リンクト・データとして利用可能なデータセットのリストがdatahub.ioで維持されています。
RDFデータの情報源間のリンクを記録するための語彙の用語がたくさん普及しました。次の例は、OWL語彙が提供しているsameAs
プロパティーです。このプロパティーは、2つのIRIが実際には同じ資源を指し示すことを表わすために使用できます。異なる公開者が、異なる識別子を用いて同じものを表わすことができるため、これは便利です。例えば、VIAF(上記参照)にはレオナルド・ダ・ヴィンチを示すIRIもあります。owl:sameAs
のおかげで、我々はこの情報を次のように記録できます。
<http://dbpedia.org/resource/Leonardo_da_Vinci> owl:sameAs <http://viaf.org/viaf/24604287/> .
RDFデータ処理ソフトウェアは、このようなリンクを、例えば、同じ資源を指し示すIRIのRDFデータを結合したり比較することにより、展開できます。
これで、RDFに関する簡潔な紹介を終了します。より多くの詳細情報を得るためには、参考文献をご覧ください。W3Cのリンクト・データのページもご覧になると良いでしょう。
Antoine Isaacが、様々な構文形式を含む多くの例を提供しました。Pierre-Antoine Champinは、JSON-LDの例の1つを提供しました。Andrew Woodは図を作成しました。Sandro Hawkeは、RDFセマンティクスに関する項の最初の部分を書きました。
Gareth Adams、Thomas Baker、Dan Brickley、Pierre-Antoine Champin、Bob DuCharme、Sandro Hawke、Patrick Hayes、Ivan Herman、Kingsley Idehen、Antoine Isaac、Markus LanthalerおよびDavid Wood(ABC順)から提供されたコメントに感謝申し上げます。
このドキュメントの「はじめに」には、2004年の入門[RDF-PRIMER]の文章が多く含まれています。その他の部分に関しては、RDF 1.1入門は完全に新しいドキュメントです。