RDF -- リソース表現のフレームワーク
ウェブの目標である「マシンに理解可能な情報」の表現のためには、メタデータなどのリソース相互の関係を、特定のアプリケーションに依存しない形で叙述的に示す共通の方法が必要です。RDFは、主語(リソース)と述語(プロパティ)、そしてその目的語(オブジェクト:プロパティの値)の三者関係によって、関係の連鎖を辿ることができるようなデータモデルを記述します。
※体系的な解説『RDF/OWL入門』を上梓しました。
マシンに理解可能な情報の記述
バーナーズ・リーが描いていたウェブの目標は、「コンピュータで読みとれる形の情報の空間が、人々の思考、やり取り、仕事のパターンの状態を適切に反映できるようになり、コンピュータの分析が我々のマネジメントの重要なツールになること」でした。しかし、RDF Model and Syntaxの仕様書[RDFMS]は、これまでのWWWについて「計算機可読」ではあっても「計算機に理解可能」ではないと述べています。
...although everything on it is machine-readable, this data is not machine-understandable. (1. Introduction)
適切に記述されたHTML文書は、その文法を理解しているユーザエージェントによって、見出しを抽出したり用語集を作ったり、あるいは検索のデータベースに収録したりといった自動処理は可能です。しかし、これはエージェントがHTMLという特定の語彙を知っていることが前提であり、ここで定義されていないこと(リソース)について、意味を推論する手段はありません。RDF (Resource Description Framework)は、特定のアプリケーションや知識領域を前提とせずに、相互運用可能な形で「リソースを記述する」ための標準的なメカニズム(枠組み)を提供する試みです。
RDFは、Concept and Abstract Syntax仕様[RDF-C]で、リソースの持つプロパティと値の叙述(Statement:文)を行うためのデータモデルを、RDF/XML Syntax仕様[RDF/XML]でそれを具体的に表現する(さしあたってはXMLを使っての)構文を定めます。また、RDF Schema仕様[RDFS]は、リソースを記述する語彙の定義方法を定めます(当サイトRDFスキーマ -- リソース表現の語彙定義)。このメカニズムにより、データを処理するエージェントが未知のスキーマに出会ったときは、そのクラスの系譜をさかのぼっていくことで、どのような定義が行われているかを理解可能にしようという構想が描かれています。
〔補足〕
本稿では、RDF-MS仕様書のStatementという用語に「叙述」「文」という2種類の訳語を充てています。JISの標準技術文書では「文」としています。この用語については、今後変更する可能性があります。
〔以上補足〕
RDFの基本データモデルとXML構文
RDFのトリプルとグラフ
RDFは、リソースの関係を主語、述語、目的語という3つの要素(トリプル)で表現します。トリプルの集合はRDFのグラフと呼ばれます。 トリプルは「主語・目的語間の関係のステートメント(文)」を表すとされています。
次の日本語の文:
[例1] http://www.kanzaki.comには神崎正英という作者がいます
は、RDFの「文」として捉えると、次のような要素から構成されています:
主語(Subject) | リソース | http://www.kanzaki.com |
述語(Predicate) | プロパティ | 作者 |
目的語(Object) | プロパティの値 | 神崎正英 |
RDFでは、これらの関係を有向ラベル付きグラフ(directed labeled graph)を用いて表現します。ここで、プロパティはDublin Coreの語彙を使って作者をdc:creator
と表現することにします(dc:
はDublin Coreの要素タイプを示す名前空間接頭辞とします)。
RDFのグラフでは、リソースを楕円で、プロパティをアーク(矢印)で、リテラルを長方形で表現します。アークの矢印は主語を始点とし、目的語を終点としています。
URI参照による語彙
RDFでは、意味や定義を計算機にとって曖昧さなく示すために、URI参照(URIとオプションのフラグメント識別子)による名前付けを行います。
前の例では、主語はホームページなのでURIで参照できることがすぐに分かりますが、述語(プロパティ)も、「作者」という単語ではなく、dc:creator
というURI(※)になっています。語彙を表すために、人によって使い方や与える意味が異なるかもしれない単語ではなく、URI参照を用いることで、確実な意味の交換を可能にしているのです。
ここでは目的語は文字列(リテラル)になっていますが、目的語も主語と同様、URI参照で名前付けされるリソースとすることができます。つまり、RDFは主語、述語、目的語の全てをURI参照によって名前付けして表現できるように設計されているわけです。
※RDFでは、dc:creator
のような修飾名は、名前空間接頭辞とローカル名を直接連結して、http://purl.org/dc/elements/1.1/creator
というひとつのURI参照を構成することになっています。
基本データモデルを表現するXML構文
このデータモデルをXMLとして表現するために、[RDF/XML]仕様は次のような構文を定めています。
[例2]
<rdf:RDF ...> <rdf:Description
rdf:about
="http://www.kanzaki.com
"> <dc:creator
>神崎正英
</dc:creator> </rdf:Description> </rdf:RDF>
(注)このページの例では、読みやすさのためにXML宣言、xmlsn:rdf="..."
などの名前空間接頭辞の宣言を省略しています。この例にこれらの宣言を加えたXML表記は、最後に示します。
この構文では、rdf:Description要素が「文」を示し、rdf:about属性が「主語」となるリソースのURIを、要素の内容が「述語」にあたるプロパティ(dc:creator
要素)と「目的語」となるリテラル値(神崎正英)を記述しています(rdf:
はRDF Model and Syntaxの名前空間を示すものとします)。
全く同じモデルを、Description
要素の内容を使わずに属性として記述することも可能です。こちらは短縮構文(Abbreviated Syntax)と呼ばれます。
[例3]
<rdf:RDF ...> <rdf:Description rdf:about="http://www.kanzaki.com
"dc:creator
="神崎正英
" /> </rdf:RDF>
こちらの構文は情報が複雑になると読みにくくなりますが、コンパクトに記述でき、(レンダリングされてしまう可能性のある)要素内容を持たないため、他の言語の中にRDFを埋め込むときには便利です。なお、省略構文の導き方のルールなどについては、当サイトRDF/XML構文の簡単な説明を参照してください。
構造化モデル
RDFの文(ステートメント)の目的語にはリソースを指定できます。一方、リソースはそれを主語とした文とすることも可能です。すなわち、ある文の目的語を、別の切り口では主語と見立てて新たな文を作成することができるわけです。この連鎖により構造化されたモデルで詳細にリソースを記述していくことが可能になります。
ここではvCard[VCARD]の語彙を用いて名前とメールアドレスというプロパティを表現しています(接頭辞v:
はvCardの名前空間を表すものとします)。このモデルを文章で表現すると、次のようになるでしょう:
[例4]
http://www.kanzaki.comの作者はurn:pin:MK705というURIで参照される人物で、彼(彼女)の名前は神崎正英、メールアドレスはwebmaster@kanzaki.comです。
この文章で示されるように、このモデルは2つの文から構成されるので、XML構文による表現も、それに対応して2つのDescription
要素を持ちます。
[例5]
<rdf:RDF ...> <rdf:Description
rdf:about="http://www.kanzaki.com
"> <dc:creatorrdf:resource
="urn:pin:MK705
"/> </rdf:Description> <rdf:Description
rdf:about
="urn:pin:MK705
"> <v:FN>神崎正英</v:FN> <v:EMAIL>webmaster@kanzaki.com</v:EMAIL> </rdf:Description> </rdf:RDF>
dc:creator
プロパティの値(目的語)をリテラルではなくリソースとするために、rdf:resourceという属性を用いる点に注意してください。このリソースが次のrdf:Description
要素(文)ではrdf:about
属性によって主語となり、それに関するプロパティが要素内容として表現されています。
このモデルは、rdf:Description
要素を入れ子にして次のように表現することもできます。グラフの形からすると、こちらの方が馴染みやすいかも知れません。コンピュータにとっては、どちらの表現でも全く同じことです。
[例6]
<rdf:RDF ...> <rdf:Description
rdf:about="http://www.kanzaki.com
"> <dc:creator> <rdf:Description
rdf:about
="urn:pin:MK705
"> <v:FN>神崎正英</v:FN> <v:EMAIL>webmaster@kanzaki.com</v:EMAIL> </rdf:Description> </dc:creator> </rdf:Description> </rdf:RDF>
さらに、これは短縮構文で次のように記述することもできます。
[例7]
<rdf:RDF ...> <rdf:Description
rdf:about="http://www.kanzaki.com
"> <dc:creatorrdf:resource
="urn:pin:MK705
" v:FN="神崎正英" v:EMAIL="webmaster@kanzaki.com" /> </rdf:Description> </rdf:RDF>
同じリソースでも、主語として扱う場合はrdf:about
属性、プロパティ要素の中でその値(目的語)を示す場合はrdf:resource
属性の値としてURIを記述することに注意してください。
〔補足〕
最初の例では、次のようにdc:creator
というプロパティの目的語をリテラル(文字列)にしていました。
[http://www.kanzaki.com] -- dc:creator --> "神崎正英"
しかし、厳密に言うと“文字列”がサイトをつくることはあり得ず、この名前を持つ“ある人物”がサイトをつくるわけです。従ってモデルとしては、この構造化モデルのセクションで示したように
[http:..] -- dc:creator --> [urn:..] -- v:FN --> "神崎正英"
と、人物を表すリソースを間に置く方が適切です。人物を表す適当なURIがない場合は、目的語を例9で示す匿名(空白)ノードとすることができます。
〔以上補足〕
コンテナモデル
リソースを記述するときに、複数のリソースのまとまりを表現する必要が出る場合があります。例えば、著者が複数いたり、言語によって異なる表記があったりといったケースです。これらを表現するために、RDFではコンテナというモデルを用います。コンテナには、次の3つのタイプがあります:
- Bag
- 順序を特定しないリソース、あるいはリテラルのリストです。
- Seq
- 順番のある(Sequence)リストです。
- Alt
- 同じプロパティ値の代替表現(Alternative)のリストです。異なる言語によるタイトルの翻訳、ミラーサイトなどを示すことができます。RDF処理アプリケーションは、Altリストの中からどれか一つを選んで処理することができます。
たとえば、ある雑誌の特集を二人の筆者と編集部が分担して執筆した場合にはBag
を使うことができます。XML構文の場合は、li要素を使って項目を列挙します。
[例8]
<rdf:RDF ...> <rdf:Description rdf:about="http://internet.impress.co.jp/magnavi/ip0011/"> <dc:title>プロが指摘するテクニック全公開-正しいHTMLの書き方</dc:title> <ex:authors> <rdf:Bag
> <rdf:li
>篠原稔和</rdf:li> <rdf:li
>神崎正英</rdf:li> <rdf:li
>インターネットマガジン編集部</rdf:li> </rdf:Bag> </ex:authors> </rdf:Description> </rdf:RDF>
ここでは述語にex:autohrs
という、「作者のグループ」を表すプロパティを用いています。これに対し、(通常はひとりの)作者を表すdc:creator
などの目的語がコンテナリソースになっていると、アプリケーションが混乱する可能性があるので、使い方には注意してください。
ダウンロードサイトが複数あるような場合、Alt
タイプを用いて、アプリケーションがその中からひとつを選択できるような記述が可能です。
[例9]
<rdf:RDF ...> <rdf:Description rdf:about="http://example.org/apps/killerApp"> <ex:downloadSites> <rdf:Alt
> <rdf:li
rdf:resource="http://dl1.example.org/apps/killerApp"/> <rdf:li
rdf:resource="http://lib.example.com/download/killerApp"/> </rdf:Alt> </ex:downloadSites> </rdf:Description> </rdf:RDF>
ex:downloadSites
の値は直接示されていないので、目的語は匿名リソースになり、空白の楕円が描かれます。コンテナは、リソースのタイプを示すrdf:typeというプロパティによって「rdf:Alt
タイプのリソース」という形で表現され、コンテナの目的語としてリストが示されます。リストのそれぞれの項目には、rdf:_1
, rdf:_2
といったメンバシップ名プロパティが内部的に順番に与えられ、それぞれの値としてリストの内容が表現されるという形です(XML構文を使って記述するときには、これらのプロパティは気にしなくても構いません)。
具体化:文についての文
RDFは文(statement)によってあるリソースについての叙述を行いますが、その文そのものについての叙述を行うというケースがあります。例えば、
[例10] エミがグランプリだと審査員が評価した
は、「エミがグランプリだ」という文に関する叙述とみることができます。文そのものはリソースではないので、これを主語としてRDFで表現するためには、文をリソースとして具体化(reification)する手続きが必要です。
RDFでは、文全体を表すrdf:Statement
というタイプのリソースをつくり、そのプロパティとしてrdf:subject
、rdf:predicate
、rdf:object
の3つを与えることで、この文自体を具体化します(以下の例で#Emiなど#で始まるrdf:resource属性値は、同じ文書内でrdf:IDによって定義されているリソースを参照していることを示します。またex:という接頭辞は、架空の名前空間を示すことにします)。
[例11]
<rdf:Statement
> <rdf:subject
rdf:resource="#Emi"/> <rdf:predicate
rdf:resource="#deserves"/> <rdf:object
rdf:resource="#GrandPrix"/> </rdf:Statement>
元の文の主語、述語、目的語が、それぞれ新しいリソース(rdf:Statement)の3プロパティの目的語となります。リソースは文の主語になることができますから、これを使って例10の文をRDFで表現してみましょう。
[例12]
<rdf:RDF ...> <rdf:Statement rdf:ID="award2004
"> <rdf:subject rdf:resource="#Emi"/> <rdf:predicate rdf:resource="#deserves"/> <rdf:object rdf:resource="#GrandPrix"/> </rdf:Statement> <rdf:Description rdf:about="#award2004
"> <ex:ratedBy rdf:resource="#Judge"/> </rdf:Description> </rdf:RDF>
新しいリソース(rdf:Statement)を別の文の主語としてrdf:about
で参照するためにはURIが必要なので、ID
属性によってaward2004という名前を与えています。これは、結局ex:ratedBy
というプロパティが新しいリソースの述語であるということなので、次のように記述しても等価です。
[例13]
<rdf:RDF ...> <rdf:Statement> <rdf:subject rdf:resource="#Emi"/> <rdf:predicate rdf:resource="#deserves"/> <rdf:object rdf:resource="#GrandPrix"/> <ex:ratedBy rdf:resource="#Judge"/> </rdf:Statement> </rdf:RDF>
この場合、文の具体化リソースをURI参照する必要がないので、ID属性は加えていません(匿名リソースとなります)。このモデルをグラフで表現すると次のようになります。
この具体化のモデルは、1つの文が4つの文に変換されるため、叙述が複雑になると扱いが大変になり、現在も改良の可能性が検討されています。しかし、文を具体化して別の文の主語や述語にするという考え方は、推論やロジックのレベルで重要になってくるので、概念だけは押さえておくとよいでしょう。
とりあえずのまとめ
簡単におさらいしましょう。RDFは、メタデータを計算機でも理解できるように表現するため、主語となるリソースをプロパティと値のペアに関連づけて叙述します。プロパティがどんなものであるかはスキーマによって定義され、RDFモデルではそのスキーマをURIで参照することで、プロパティを明確に理解可能にします。
スキーマを正しく参照するためには、もちろん名前空間がきちんと宣言されていなければなりませんから、最後にXML宣言、名前空間宣言も加えたRDFのXML構文の例を挙げておきます。
[例14]
<?xml version="1.0" encoding="Shift_JIS" ?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja"> <rdf:Description rdf:about="http://www.kanzaki.com"> <dc:creator>神崎正英</dc:creator> </rdf:Description> </rdf:RDF>
本稿で取り上げなかったこと
本稿はRDFのモデルの概要を紹介してきましたが、
- リテラルが文字列、数字、日付などのタイプを持つことを表す型付リテラル
- プロパティの値と単位を組み合わせて記述するために
rdf:value
属性を用いた多項関係の表現 - 閉じたリストを表すRDFコレクションモデル
- RDFの形式モデル
などについて説明していません。
なお、rdf:aboutEach
属性、およびrdf:aboutEachPrefix
属性は、それぞれ2001-12-07、2001-06-01のRDF Core WGミーティングで仕様から削除するとされたので、取り上げません。rdf:aboutEach
について解説していた部分は、2002-05-03に削除しました。
本稿で取り上げなかった次の構文規則について説明するRDF/XML構文の簡単な説明を公開しました(2002-05-13)。
- XMLで表記するための厳密な構文規則
- 目的語を示す要素内容にマークアップが含まれたときの解釈方法を示す
parseType
属性
参照文献
- [RDFMS]
- Resource Description Framework (RDF) Model and Syntax Specification, , W3C Recommendation (Obsolete) ,
- <http://www.w3.org/TR/REC-rdf-syntax>
- [REFACT]
- Refactoring RDF/XML Syntax, , W3C Working Draft ,
- <http://www.w3.org/TR/rdf-syntax-grammar/>
- [VCARD]
- Representing vCard Objects in RDF/XML, , W3C Note ,
- <http://www.w3.org/TR/vcard-rdf>