直感シリーズ第二弾です。(同内容をブログにもアップしています。)
RDFとは
Resource Description Framework の略です。頭文字を取って,RDF。Wikipediaによると,
Resource Description Framework (リソース・ディスクリプション・フレームワーク、RDF) とは、ウェブ上にある「リソース」を記述するための統一された枠組みであり、W3Cにより1999年2月に規格化されている…中略…RDFは特にメタデータについて記述することを目的としており、セマンティック・ウェブを実現するための技術的な構成要素の1つとなっている。
ふーん,って感じじゃないですか?枠組みって言われてもねぇ。と私は思っていました。
もう少し耐えて,調べてみましょう。
そのセマンティックウェブって何よ?
Webページおよびその中に記述された内容について、それが何を意味するかを表す情報(メタデータ)を一定の規則に従って付加することで、コンピュータが効率よく情報を収集・解釈できるようにする構想。インターネットを単なるデータの集合から知識のデータベースに進化させようという試みがセマンティックWebである。IT用語辞典 e-words より
一度理解してしまうと,確かにそうではあるのですが,もう少し直感的に,ゴールから捉えてみましょう。
##RDFを使って目指す世界
RDFは要素間の関係性を記述していく枠組みです。RDFとそれが使われて表現されるセマンティックウェブを直感的に捉えるならば,グラフとして捉えるのがよいと思います。
世の中の全てのデータをグラフ表記してしまえ!そしてそのグラフっていうのは,機械にも理解できるような世界共通のグラフにしてしまえ,というのが,RDFを使って目指す世界です。(だと私は思っています。)
#RDFの文法
##まずは感覚的に。
しばらく,RDFをグラフとして捉えていきましょう。ここでは,ちょっぴり学術的に,薬を例にして考えてみます。とあるデータベースの"薬の化合物のID DB00316"の"名前"が"アセトアミノフェン"である,とします。それをグラフで書くとこうなります。
これをRDF(の中でも最も簡単な表記形式)で書くと,こうなります。
薬のID:DB00316 名前 アセトアミノフェン.
超あっさり。RDFの基本はこれだけです。
ただ,このままだと,少し問題があります。先ほど述べた"機械にも理解できるような世界共通のグラフ"というものが出来ないのです。どうして,世界共通のグラフであって欲しいのか,という話は追ってしますが,もう少しちゃんとした,RDFで書いていきましょう。
Drug_ID:DB00316 label "Acetaminophen”.
あ,これだと英語にしただけですね(名前をラベルとしましたが)。
世界共通で機械が判読できるグラフにするために,ちょいと宣言をしてからRDFを書きます。(prefix<接頭辞>といいます。)
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix drugbank: <http://bio2rdf.org/drugbank:> .
drugbank:DB00316 rdfs:label "Acetaminophen”.
こうすることで,世界共通で機械が判読できるグラフに近づきます。最初のprefixでこれからrdfsと書くのは,http://www.w3.org/2000/01/rdf-schema#の略であり, これから,drugbankと書くのはhttp://bio2rdf.org/drugbank:の略ですよ,と宣言しているわけです。ここで宣言したprefix,rdfsやdrugbankは既に汎用的に使われている語彙(直感的には辞書のようなもの)であり,その意味は明確に定義されています。これらを使うことによって,機械は,そこで表現されているグラフが何であるのか,ということが明確にわかるようになるわけです。普通に我々が話している言語だって,まずは,何語であるのか,ということが明確にわからないと,話にならないですよね?これをもっと厳密に機械に対しては,定義をしてあげるということです。
こうして,drugbankという語彙で定義された,drugbankのIDのDB00316は,rdfsという語彙で定義されたlabelで示すと,Acetaminophenであるということが表現されます。
##次にきちんと。
ここまで書いてきたのですが,なんだか,RDFって言葉に近いって思われませんでしたか?この,RDFの記述方式は,Subject(主語) Predicate(述語) Object(目的語)という,英語の文になぞらえられます。グラフと共に示すとにするとこうなります。個人的には,主語,述語,目的語としてとらえるよりも,主語と目的語に当たる要素の関係性を述語が示している,ととらえたほうが(日本人的には?)分かりやすいように感じています。
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix drugbank: <http://bio2rdf.org/drugbank/> .
drugbank:DB00316 rdfs:label "Acetaminophen”.
#グラフをつなげていこう。
ここから徐々にRDFの本領発揮となってくるわけですが,データを増やしていくのはわりと簡単です。
例えば,先ほど書いた化合物,"Acetaminophen (アセトアミノフェン)"が,"Prostaglandin G/H synthase 2(プロスタグランディン エンドペルオキシド 合成酵素)"のターゲットになるということを書きたいとします。(おまじないのような合成酵素を使用した例にしたことを若干後悔しています。)その場合には,付け加えて書いていくだけです。(付け加える要素に応じて,prefixは追加していきます。
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix drugbank: <http://bio2rdf.org/drugbank:> .
@prefix drugbank_vocab: <http://bio2rdf.org/drugbank_vocabulary:> .
@prefix drugbank_target: <http://bio2rdf.org/drugbank_target:> .
drugbank:DB00316 rdfs:label "Acetaminophen" ;
drugbank_vocab:target drugbank_target:290 .
drugbank_target:290 rdfs:label "Prostaglandin G/H synthase 2".
こうすると,先ほどの,DB00316のラベルがアセトアミノフェンであり,(主語が変わらない場合には";"で繋げます。そのターゲットがdrugbank_targetという語彙の290(番)だと示しています。
そして,その290(番)のラベルは,"Prostaglandin G/H synthase 2(プロスタグランディン エンドペルオキシド 合成酵素)"である,ということを示しているわけです。
これをグラフにして表記すると,このようになります。
RDFを使って目指す世界とは,このような要素間のグラフを繋げまくって,ウェブの世界をまるごとグラフにしてしまおうぜ,というものです。そして,このグラフを機械が理解するためには,出来るだけ,それぞれの要素が,世界的にどういう意味なのか,という定義付けがされているとありがたいわけです。先程の例だと,drugbankというデータベースのIDであることが明記されていれば,例えば,他の薬につなげたり,化合物の別名があれば,それを表記することも容易になるわけです。そして,他の人が作ったデータとも,容易に繋げていくことが出来ます。それは,単純にグラフを繋げていくだけだからです。
ちょっと凝った話になりますが,テーブル同士をどう繋げていくのかという設計に頭を悩ませるRDBに対する利点であり,Subject Predicate Objectという3組になっているという時点で,key-value方式で保存をされているNo SQLとも相性が良いのではないか,と私は感じています。
#実際使われてるの?
RDFの利用は確かにまだまだ発展途上ですが,その利用は確実に伸びています。先ほど紹介したDrugbankのデータもありますし,WikipediaをRDFに変換したものや,博物館のデータ,政府のデータや自治体のデータ,BBCなどの報道機関のデータ,音楽の情報,地理的な情報をRDF化したものなどがゴロゴロと存在しています。多くのデータがより繋がっていけば,より多くの価値ある情報を取り出せるようになるはずです。
次回は,グラフでつないだデータをどう取り出すのか,ということをメインに書いていきたいと思います。(思ったより,超長くなってごめんなさい。)また,お会いしましょうっ。つ,次はちゃんと書く。きっと書きます〜
無事に追記しましたっ
直感RDF!! シリーズ
その2 -使いやすいRDFを作って,検索しよう。
その3 -外部のデータと繋げて使える検索をしよう。