直感RDF!!　その3 -外部のデータと繋げて使える検索をしよう。


さて，前回までの直感RDF!で[RDFの概要を学び](http://qiita.com/maoringo/items/4742b5cd01c9e698260d)，[イカシタRDFを作成したり，情報収集する方法](http://qiita.com/maoringo/items/0d48a3d967a35581cc24)を紹介しました。今回は，外部のデータと繋げて検索する方法をご紹介します。
>同内容は[ブログ](http://maoring.hatenablog.com/entry/2014/09/14/192024)でも公開しております。

#目的ー何するの？
今回は今まで作成したRDFのデータを使って，薬のターゲット情報や，特許情報を取得するまでを書いていきたいと思います。
##外部のデータのことを知ろう。
外部のデータと繋げていくためには，外部のRDFデータについて知る必要があります。ここでは，薬のターゲット情報が知りたいので，bio2rdfで提供されているdrugbankの情報を見てみましょう。[bio2rdf](http://bio2rdf.org/)のトップページから，Vioxx [drugbank:DB00533 ]を選択します。右の検索窓に，drugbank:DB00143が表示されると思うのですが，これを自分の手持ちのデータのdrugbank ID - ここでは， drugbank:DB00864 に変更し，検索します。すると，[このようなページ](http://drugbank.bio2rdf.org/describe/?url=http%3A%2F%2Fbio2rdf.org%2Fdrugbank:DB00864)が開かれるはずです。ここからtargetを探ります。あ，ありました。
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914174025.png" itemprop="image"></span></p>
あ，あれ，なんか求めてたのと違う？URIじゃん，と思ったあなた，クリックしてみてください。
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914174151.png" itemprop="image"></span></p>
targetが見つかりました！

このように，ターゲットを1つのURIで表記をしておくと，他の化合物のターゲットだった時にも使いまわすことができるので，URI を使用していると思われます。ここでの例のように， URI が Object になり，今度はそれを Subject としてその先に Predicate とObject が書かれており，詳しい説明（多くの場合文字列）があるいう RDF のデータは良く存在します。自分で RDF のデータを作っていく時にも参考となるはずです。ただあまりグラフが深くなると，どこに何があるのか分からなくなってしまうという恐れもあります。

さて中身をご覧頂くと，おそらくバイオ関係で研究をされている方なら，この時点で遺伝子名，生物種，他の関連するデータベースの ID などが書かれているので興味を持って頂けるかも？と感じています。
あ，でも，dcterms:titleってなんだろう？と思ったあなた，クリックしてみてください。
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914174300.png" itemprop="image"></span></p>
あれ，あまり情報がない！こんな時は[検索エンジンで検索](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#q=dcterms)すれば，大体情報が出てきます。ちなみに，dctermsのdcはDublin Coreの略，コンピュータのメタ情報を記録するための語彙集であり，titleはそのタイトル，感覚としてはnameと同じくらいで良いと思います（多分ホントはもっと厳密）。ただ，このへんは長いものに巻かれろで，汎用的なものをそんなものか，という感覚で使う程度でも，ユーザーとしては良いと思います。
ま，そんな訳で薬のターゲットの出し方が分かりました。え，分かりにくい？そんな方のためにまたグラフを書いてみたよん☆<span style="color: #cccccc">テンションぶれぶれですが，お腹が空いているのです。お許し下さい。</span>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914175525.png" itemprop="image"></span></p>
もちろん，抜粋です。bio2rdfで提供されている，先にご紹介したページは，ページが数ページにわたることもありますので，ご注意ください。
###SPARQL Endpoint はござるか？
さて，RDFの検索において，繋げたいデータベースの SPARQL Endpoint があるかどうかは重要です。（ SPARQL Endpoint は SPARQL を使って検索できる，おっきな検索窓と捉えて頂いて差し支えありません）もちろんない場合も多々あり，あったとしても突然サービスが終わったり，データ更新が止まっていたり，時々落ちていたりして，んが(｡･_･｡)，となることもありますが，これがあることによって，手持ちのデータと繋げることが簡単に出来てしまいます。
ちなみに無い場合には，RDF のデータをダウンロードして，自分の使っているトリプルストア（サーバーにSPARQL Endpointを自分で立てる場合，それを提供している RDF 専用のデータベースのようなもの，たまに混同されますが，あくまでRDFはResource Description Frameworkで，別途保存するためのデータベースは必要です。）に保存をしてからの検索が必要です。速度的には，そちらのほうが速いです。RDF を使ってサービスを提供する場合は，現状データをダウンロードする必要があると思われます…。また，前回ご紹介した SparqlEPCU には，提供してくださっているサービスのサーバーに大きな負荷をかけることになるので（私の予想ですが），小さなデータでのテストに留めたほうが良いでしょう。
　さて，ありがたいことに drugbank の SPARQL Endpoint は，bio2rdf が提供してくれていました。検索してみましょう。
###その SPARQL Endpoint は使えるか？
残念ながら世の中には，SPARQL Endpoint があるぜ！と銘打っていても中に入っているデータが貧弱！貧弱ゥ！のことがありますので，事前に確認が必要です。先の例でウェブページ上には掲載されていた情報が，ちゃんと SPARQL Endpoint にあるか，事前に検索してみましょう。

レッツ検索！以下の様なクエリを入れてみましょう- [bio2rdfで提供している drugbank の SPARQL Endpoint](http://drugbank.bio2rdf.org/sparql)

```r
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX dv: <http://bio2rdf.org/bio2rdf.dataset_vocabulary:>
prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:>

SELECT *
WHERE {
 <http://bio2rdf.org/drugbank:DB00864> drgb:target ?o.
?o dcterms:title ?target.
                }
```
ここでは，<http://bio2rdf.org/drugbank:DB00864>のURIを主語として，targetとなりうる?o, Objectを探し出し，
そのtitleを出して，?targetとして出力させています。

####検索結果

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914182104.png" itemprop="image"></span></p>

よっしゃ，ビンゴ！
ここまでで，事前準備完了です。手持ちのデータと繋げてみましょう！！

##SPARQLで繋げ！

前回ご紹介した，DrugTargetの[SPARQL Endpoint](http://lodcu.cs.chubu.ac.jp/SparqlEPCU/project.jsp?projectID=DrugTarget)を開いていください。SERVICEを使って検索をします。

```r
prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:>
prefix dbowl: <http://dbpedia.org/ontology/>
prefix orphan: <http://www.nibio.go.jp/orphanDrugTarget#>

select distinct ?name  ?product ?drugbank ?title  ?target_name 
where {?s  drgb:name ?name;
          drgb:product ?product;
          dbowl:drugbank ?drugbank.
      
SERVICE <http://drugbank.bio2rdf.org/sparql>
               {?drugbank <http://purl.org/dc/terms/title> ?title;
                           drgb:target ?target.
                ?target drgb:name ?target_name.
                }
      
      }

```
解説しましょうっ。
まず，```select distinct``` のdistinctは重複を除く，との意味です。その後は，いつもどおり，```?s```でSubjectを探せ，```drgb:name ?name```で手持ちのデータの薬の名前出せ，";"でつなぐと，Subjectが同じままで検索できます。```drgb:product ?product```で製品名を出せ，dbowl:drugbank ?drugbankで?drugbankのURIを出せ，と指定しています。次の，SERVICE以降の;```<http://drugbank.bio2rdf.org/sparql>```では，外部のSPARQL Endpointを指定し，先ほど取り出した，?drugbankのURIをSubjectとし，```<http://purl.org/dc/terms/title> ?title```で名前を出し（prefixを使わない場合はURIを直接書いてしまってOKです），
```drgb:target ?target```で?targetのURIにつなぎ，```?target drgb:name ?target_name.```でターゲットの名前を出しています。

実行結果

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914184806.png" itemprop="image"></span></p>

もとのデータより表が大きいと感じる方がいらっしゃるかもしれませんが，どこかのデータが多い場合には，その多いデータに合わせて，表の行数も多くなります。ここでは，target_nameの数が多いので，それに合わせてありますね。
###ちょっと応用。
ここで，遺伝子名も見たいなぁと思った場合には，以下のようにチョビっと書き換えればOKです。この辺りで，もとのdrugbankのRDFを調べたことが効いていることが分かると思います。

```r
prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:>
prefix dbowl: <http://dbpedia.org/ontology/>
prefix orphan: <http://www.nibio.go.jp/orphanDrugTarget#>

select distinct ?name  ?product ?drugbank ?title  ?target_name ?gene_name
where {?s  drgb:name ?name;
          drgb:product ?product;
          dbowl:drugbank ?drugbank.
      
SERVICE <http://drugbank.bio2rdf.org/sparql>
               {?drugbank <http://purl.org/dc/terms/title> ?title;
                           drgb:target ?target.
                ?target drgb:name ?target_name;
                            drgb:gene-name ?gene_name.
                }
      
      }
```
実行結果
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914185336.png" itemprop="image"></span></p>


###特許の情報を知りたし。
そんな場合には，先ほどの[drugbankの解説ページ](http://drugbank.bio2rdf.org/describe/?url=http%3A%2F%2Fbio2rdf.org%2Fdrugbank:DB00864)に戻りましょう。3ページ目に特許らしき記述を発見しました。
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914185833.png" itemprop="image"></span></p>
特許番号は何かしら？とクリックすると，ありました♪
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maoring/20140914/20140914185937.png" itemprop="image"></span></p>

先ほどのターゲット情報と同様の方法を使えば，特許番号の取得が可能です。ぜひ，試してみてください！
おなか空いたので宿題です。皆さんなら出来るはずです（まさかの丸投げ）。
他にも提供されているSPARQL Endpointを使ったり，自分でトリプルストアを立てて公開されているRDFデータをダウンロードしたりして，色々と検索してみてください。言葉をつなぐように，データをつなぎ，新たな発見を見出すことが出来るかもしれません。また，複数のSPARQL Endpointを繋いで検索をすることもできます。これにより，世界中のデータとどんどこさと繋げていくことが出来ます。そして，それぞれの機関で作られているので，情報は勝手に新しくなってくれます。ティム・バーナーズ=リーが想像した世界に近づけます。やっほー。

ただ，現在のところストレスを感じるくらいに遅いので，技術革新を待つか，必要なデータは自分でダウンロードして入れしまいましょう。

##トリプルストアを自分で立てるなら？
最後に簡単に自分でトリプルストアを立てる時に役立ちそうなURLを紹介します。
以下の情報を参考にしてみてください。
 
* [VirtuosoをMac OS Xにインストール - 週末京都](http://d.hatena.ne.jp/keybot/20110827/p1)
* [Ubuntu で Virtuoso オープンソース版のインストール](http://www.kkaneko.com/rinkou/virtuoso/install.html)
* [Virtuosoのアップデートでハマった時のメモ。](http://qiita.com/maoringo/items/191bdfbea939d77fedc0)
* [OWLIM-Liteのインストール＆設定方法　(Linux)](http://maoring.hatenablog.com/entry/2013/07/25/150215)
* [Fusekiを使ったSPARQL Endpoint構築方法](http://www.statld.org/hp/1021)
  
  となんだか，日本語と手前味噌のエントリを紹介してしまいましたが，各トリプルストア（有名ドコロはVirtuoso, GraphDB<以前のOWLIM>, Fusekiといったところでしょうか）の公式ページにも掲載されています。また，Learning SPARQLの書籍をご購入された方は，ARQというコマンドを使用して検索するのも手軽で便利です。こちらの[エントリ](http://qiita.com/maoringo/items/7ede20a3a1da0b595391)をご参考に，ぜひ導入してみてください。詳しい使い方は，本の記述をご参照ください。それでは，またお会いしましょう！！Adios!!!（多分まだ色々と修正します^^;）

>直感RDF!! シリーズ
[その１-RDFとは。](http://qiita.com/maoringo/items/4742b5cd01c9e698260d)
[その２ -使いやすいRDFを作って，検索しよう。](http://qiita.com/maoringo/items/0d48a3d967a35581cc24)