maoring blog

このブログはセマンティックウェブ関連の技術的なあれこれを綴ったブログです。

ニコニコ学会βサマーキャンプ2015に参加して

2015年8月8日(土)〜9日(日)まで
ニコニコ学会βサマーキャンプ@筑波 に参加してきました。
(完全プライベートです。意見も完全に個人の意見です。)
今回おじゃました目的は,ニコニコ学会β関連の活動をリアルで体験してみたかった
ということと,最近情報科学系の方と絡んでいなかったのでお話したかったということ
思考を少し発散させたかったということ,ラフなコミュニケーションを模索したかったこと
ウェブアプリケーションやツールを作っている方がどんな視点で取り組んでいるのかということを知りたいというのが目的でした(目的多っ)。
結論から言うと,想像以上に良い時間を過ごせたように思います。
例のごとく,いちど書き始めると超長いブログになってしまうので,ご容赦ください。
 
参加者は40名くらいでしたでしょうか?
情報科学系の会社の方が多かったように思います。アカデミックの方もちらほら。
情報科学系にかぎらず,人文系とか数学系とか物理系とか芸術系の方もいらっしゃいました。
学生さんもちらほら。政治家の方もいらっしゃいました!
年齢層は幅広くて中学2年生(確か)から50代?くらいの方もいました。
 
このキャンプはアンカンファレンス方式という方式で進められていました。
事前に準備をせず,その日に考えたことをざっくばらんに話しあう方式。
ただ,厳密にはすこーし誘導とアイデア出しのきっかけも含まれていました。
 
タイムテーブル <Facebookより転載>
【8月8日(土)】
12:00~13:00 開場・受付
13:00~13:10 オープニング
13:10~14:00 自己紹介
14:00~15:00 キックオフ・ブリーフィング
15:00~15:50 アンカンファレンスについてのオリエンテーション、テーマ決め
16:00~16:25 アンカンファレンスセッション1
16:30~16:55 アンカンファレンスセッション2
17:00~17:25 アンカンファレンスセッション3
17:30~17:55 アンカンファレンスセッション4
17:55~20:00 食事(19:30ラストオーダー)・入浴
20:00~21:30 ナイトセッション(パーティー)
 
【8月9日(日)】
7:00〜8:30 朝食
8:30~8:55 アンカンファレンスセッション5
9:00~9:25 アンカンファレンスセッション6
9:35~11:05 ラップアップセッション
11:10~11:30 本編クロージング
11:30~12:30 昼食
12:30~17:30 研究所見学(高エネルギー加速器研究機構、物質・材料研究機構)
17:30 解散
 
〜8日〜
今回のキャンプについて江渡さんの説明と10秒自己紹介(全員)のあとは
キックオフブリーフィング
9日に見学をする研究所関連の方の発表と三中さんのご発表
協賛のリクルートの方の発表がありました。
今回の発表は,
「」←タイトル忘れました,ナノテクの可能性について的なお話だったような…
国立研究開発法人物質・材料研究機構 有賀克彦さん
曼荼羅を描くこと」
肩書が多かったので,リンクで…http://cse.niaes.affrc.go.jp/minaka/files/CV.html
前半2つは完全に専門外だったので,こんなところに来てしまって大丈夫か感がありましたが,
三中さんの曼荼羅の話は,系統と分類のはなしでしたので,ライフサイエンスの研究にも関連のある話で興味深く拝聴しました。
その後どこかのタイミングで,協賛のリクルートの方々(お名前書いていいのかな?)から自己紹介と興味のあることを紹介してもらいました。
色々お話してくださってように思いますが,すみません,Ingressとエ?の話しか覚えてません…比較的オフレコのこともあった,かな?
 
その後15分くらいで,付箋を使って(1人10枚,最低3枚)マジックペンで思いついたこと,
話し合いたいトピックを書いていきます。その後ホワイトボードに書かれたラフなアンカンファレンスのタイムテーブルにそってペタペタ皆さんに貼って頂いた後,テーマ別に整理をして(その場でテーマも決める),アンカンファレンスセッションに割り当てていきます。
f:id:maoring:20150808160238j:plain
テーマ決めに参加している間にプレゼンしてくださった方々の本が売られたり,手形をお願いしたり。
私はテーマ決めに参加し,ぺたぺたとまとめていきました。ややプレゼンの影響も受けている感じで,意外と似た意見も出てきていて,なんとかテーマが分かれていきます。時間帯とお部屋とテーマかぶりに注意をしてテーマ決めをしたら,アンカンファレンスに移行します。
 
アンカンファレンスのグループ(?)は各時間帯3つずつ。時間内の移動も自由だったように思います。AとBは同じ部屋でAはニコ生で放送をし,Bは放送はしないがなんとなく声が聞こえます。
Cは完全オフレコで別部屋というくくりでした。
 
以下は,私が参加したセッションで印象に残ったこととその後に考えた考察や意見を書いていきます。本当はもっともっともっと色々な話題が出ているのですが,私の視点&感想中心になってしまっていること,ごめんなさい。
 
【リモートワーク】
情報系のお仕事の方はリモートでお仕事されている方,一部で取り入れている方もいるらしい。
家族との時間を確保できたり,余計な会議が減ったりするのは利点らしい。
一方で,外国の方とテレビ会議をしたりともにお仕事されている方は,話の通じやすさが
実際に一度会ったことがある人とない人とでは,違うということを感じていて,
実際に会うことのコミュニケーションの利点というものがあるということが話題に上がった。
しかし,それさえも,現状のSkype等のシステムの限界をこえて,もっと臨場感のあるシステムが出来てしまえば解決できるのではないか。
ただ,接待はできないよね,なんて話題も上がり,味覚と触覚(とお腹?)を満たすにはまだまだだということが分かった。
 
【就活をもっと楽しく】
こちらはオフレコの部屋だったので,すこしやわらかく書く。
新卒の就職について,企業も学生も不確定要素が多いままに漠然としたマッチングを行うことが
しんどいのではないのか,という話だった。企業の余裕がないから,大きな企業しか教育するという余裕がなく,総合的に能力の高い学生を皆取りたいという形になりがち。
今回の協賛はリクルートの方だったので,悲壮感が漂う就活をもっと良くしたいという思いもあってのセッションだったらしい。
ただ,参加した学生さんたちは,意欲の高い学生さんたちだったので,就活でしか出来ない話を聞けるとか,社会で働く先輩が貴重な時間を割いてくださったとか,気持ちの持ちようで楽しく出来たぜ,みたいな感じで。
確かにそうだが,本当にそうなのか,このや(以下自粛)感はあったような気がする。
その後,オーストラリアでの就活のお話が出て,オーストラリアでは,長期のインターンシップがあるので,そこで学生の絞り込みが行われて,日本のような漠然と多くの学生が同じような企業をどさっと志望するということはないとのことだった。ただ,その時点や就活の時点で学歴による絞込みも行われてしまうので,日本のようなフラットな就活がしにくいとのことだった。
 
(その後自分で考えたこと)
【教育系】
高校いらないんじゃないか論から,これからの高校談義まで。
研究者を育てるためにはどう実践すべき?論もあったような。
語れるほど覚えておらず…
 
【分類・系統】
 三中さんのプレゼンに触発されたセッション。ただ,触発されただけで意思は無かったので
あまりまとまらず,写真のみで失礼。

f:id:maoring:20150808182717j:plain

 
アンカンファレンスセッション4が終わった時点で,夕ごはん&入浴。
夜はパーティー&ナイトセッション
 
ナイトセッション→【エ?】
技術で解決できる究極のエロの話。
このセッションに最初からいるのはどうかと思ったけど,好奇心に負けたっ。
ひどく真面目に技術でいかにエロの世界を変えられるかということを長時間にわたってお話してた。
これに関しては,他の方がまとめてくれているだろうと思うのと,気になったら直接聞いてちょ。
 
この日も他のセッションもあったのですが,印象に残ったものだけピックアップしました。
 
 
ニコニコ学会βの今後とか,科学コミュニケーションとか,哲学とかもあつい香りがしましたが,
参加していないので詳細は分からんす。
 
夜のパーティーは
NEXT KITCHEN の中山晴奈さんのお料理とお酒。
筑波の食材を使ったお料理とか手作りの果実酒とか。
会場でモッツァレラチーズを作ってくださったりもしました。
パーティー前に食べた夕食が唐揚げ定食とがっつりだったので,魅力的なご飯が食べられなかったのも中山さんのこだわりをきちんとお聞きできなかったのはちょっと残念でした。
 
またこのパーティー時に,愛友酒造の方が来て下さり,日本酒の試飲と販売
酒造の歴史や,お酒の作り方の工夫,お米の種類とお酒の出来について,製品開発について
お話をしてくださいました。日本酒,まろやかで華やかな風味があってとっても美味しかったです。
御神酒のお話や,製造方法の工夫,商品開発のためのアイデア出しと実際にお酒に仕上げていく
過程のお話もとても興味深かったです。
 
セッションが終わった後も朝までお話されていたみたいでした。
私は,おなかいっぱいになって,朝までぐっすり寝てました(←え)
 
〜9日〜
翌日も2セッションありました。
えっと,私が参加したのは以下の2つ。
 
良いゲームをつくろうとした時に,以前は元手が必要ないのが最近のメリットだったはずだが,
ランキングに影響されたり,宣伝広告費にお金がかかったりして元手が必要,弱肉強食化が進んでいるのではないか。
それを解決するためにはキュレーションやリコメンデーションが1つの対策になるだろう。
ニッチなものを活かすには?という議論には希少疾病用医薬品の開発が製薬企業において進められていることがヒントになるのではないかと話した。ニーズが国内で少なくても,世界に広げれば,需要はあるはずだと。
しかし医薬品とは異なるので,そのニーズをどう探すのかは課題になるのではないかというご指摘を頂き,やはり,キュレーションやリコメンデーションが現状での解決策ではないのかということになった。
 
【ロボット・生体デバイス】
ロボットに死はあるのか?
死があったら人間社会に溶け込む?
アイボは実質的には死を迎えつつあり,お葬式が行われたりしている。
たまごっちは生きて死んでを繰り返す。(トランスフォーム)
ハードウェアの劣化と,組み込まれた仕組みが一致しない
これが一致したら,より良いパートナーシップが生まれるのでは?
一方で産業用ロボットは死んだら困る。
 
生体とは一体なんなのだろう?
外部ではなく,頭のなかに出力させるものがあったらどうか
話し相手としていたら良いのでは?
 
味,スキル,リハビリは脳次第でできるのでは?
お医者さんの技能をその場で真似できるスキルは脳に組み込めるのでは?
しかし,身体がついていくのか?
 
ラップアップセッション】
セッションが終わった後は,ラップアップ。
各セッションでまとめ役に回ってくださった方々により,それぞれのセッションのまとめがお話されます。
ニコ生で放送していたであろうと思うのですが,上記について軽く記述したノートがあるので,
よろしければご参照ください。
 
その後,全体のまとめ&昼食を経て研究所見学へ。
高エネルギー加速器研究機構物質・材料研究機構にそれぞれお伺いしました。
 
物理系の基礎研究に接するのは高校生以来だったので少し懐かしい気持ちでもあり,
実験施設の巨大さと精密さに驚きました。
ノーベル賞を受賞された小林・益川理論に関連する研究(CP対称性の破れとか,クオークとか,レプトンとか)
について中村さんがご説明(SuperKEKB/Belle2について)と背景・実験の概要についてお話してくださり,実験施設を案内して頂きました。
電子,陽電子の衝突を行う加速器とか測定値とか見てきましたが,とにかく圧倒されるくらい巨大。
巨大な施設の大部分は地下に埋まっていて,その上は草ボーボーだったり。
上に植物育てたら,何か影響があるかもしれないと思ったり。
超コアな研究の重要性とそれに対する正しい評価って難しいのだろうなと思ったり。
世界の最先端を走り続けている分野なのだろうなと感じたり。
あとは,理系といえども,自分の興味外の分野にイキイキとした興味を持つのは難しいと感じた瞬間でもありました。
 
研究所の概要,研究環境から,実際の研究までのご紹介から施設見学へ。
有賀先生と中山先生に平易にご説明頂くという贅沢な時間。
個人的には,外国の研究者の方のほうが多い研究環境,それをサポートする事務局の充実について知ることが出来て良かった。

f:id:maoring:20150815064301p:plain

研究所内公用語が英語であること,主体的に研究したりリーダーにも外国の方がいて協調しながら
研究を進めていること。また,多様な価値観故に,研究成果をあげられるという主張と実践に刺激を受けた。
もちろん,この研究機構側の紹介なので,正の側面しか見ていないわけだが,多分他の研究所でも
ロールモデルになりうるはず。ウェブを見返したら,任期制定年制,キャリア形成職員があったり
頂いたパンフレットを見たら,職を離れた後の女性の方が再度就職しても,長く安心して働ける環境が整っていたりして,
意欲的に継続的な発展を望んでいる機関でありそうでもあった。
研究内容について,興味ある部分のつまみ食いだと,癌治療のための材料であるナノファイバーメッシュ

f:id:maoring:20150815064710p:plain

超高感度超並列分子センサーによるがんの診断応用が気になった。

f:id:maoring:20150815065042p:plain

セシウムの検出の話も興味深かった。
ちょっと順番が前後するが,中山せんせが紹介してくださった
研究・研究者ってなんだろ?と考えた時に 
Dr. Heinrich Rohrer の 「科学は人類の役に立たねばならない」という言葉の紹介は考えさせられる言葉だった。

f:id:maoring:20150815070212p:plain

人,ではなくて,人類であることが肝のような気がする。基礎研究であれば,場合によっては大いに人類の役に立つ。
過去の惨禍に対する決意の表明にも捉えられる。
 
実際の実験環境を見させて頂いて,WETのラボにうにうにしたり,アルミホイルまみれの走査型プローブ顕微鏡とそれを用いた研究成果について説明していただいたりした。
 
そんな感じで研究所見学も終わり(他にもいろいろあったけどこれでも割愛しました。時々出会う美しい機械とか器具とかってなんなんでしょうね?)
帰路につきました。
 
【感想・まとめ】
様々な分野の様々な年齢層の方とお話出来て良かったです。
あえて議論のテーマの敷居を下げることで,フラットに話しやすい環境を作ってくださったのは幸いでした。自分が関わる分野外の方と話すと新たな発見があったり,視点を教えてもらえたり,自分自身が提供できるものもあったりします。
こういったイベントにわざわざ参加する方々なので,相手の話を聞く時に,自分が主体だったらどうするのかという視点で提案をする人が多かったのもありがたかったです。
あとは,技術の進歩で解決できる問題はまだまだあるのだろうという認識を確かにしました。
今回のサマーキャンプ,アンカンファレンス形式なので,もちろんそこで結論を得るものではないわけですが,ヒントを得る良いきっかけにはなるものなのかな,ということを感じました。
医薬系だったり,ライフサイエンス系だったり,情報科学系以外の研究者の方もきっと楽しめます。
最後になりましたが,運営をしてくださった皆様,本当にありがとうございました。
この記事が何かのお役に立てますと幸いです。
 
【余談】
 個人的な目的に対して
ニコニコ学会β関連の活動をリアルで体験してみたかった→出来た。多分かなり片鱗だけど,それでいいと思う。
最近情報科学系の方と絡んでいなかったのでお話したかったということ→出来た。自分の考え方ってこっちよりなんだなと再認識
思考を少し発散させたかったということ,→出来た。これから,また実際の生活やお仕事に帰着させるのが大事なのだろう。
ラフなコミュニケーションを模索したかったこと→多分出来た。やっぱちょっと苦手。
ウェブアプリケーションやツールを作っている方がどんな視点で取り組んでいるのかということを知りたい→ある程度は出来た。実は,帰りの電車でお話できて,ランニングコストとか建物の配置とウェブ上の構成との関連とかヒントを頂いたので今後に活かす。
 
【反省?】
本や論文で知識を補強しないとおもしろい話をしにくいなと感じました。知識の大きな人は強いなと。遠慮することは自己防衛にすらならないらしい,と。
普段からフラットな議論とか会話をしたほうがいいんだよなぁ。
あと,普段からMediatorとして活動しているけど,Creatorの側面がないと,こういう場所に行ってもアピールはしにくいのかなぁとか。
 
どうでもいいこと。
美人さんが多かったので,wow!ってなってた。イケ・・,いた,いたな。
Apple Watch所持率が高かった(これ,何か理由があるはず)
筑波研修センターは清々しいほどアメニティがありませんでした(笑)
以前バイオハッカソンに参加していた時に,相部屋だったのですが,長くお話するというためには相部屋でも良かったのかもしれません
でも,一泊だとちょっと厳しいかな。そんな部屋がある環境でも良かったかも…?
Ingressはじめました。まだ使い方よくわかっていないので,詳しい方教えてください。
 
ふう,お盆だからゆるゆる書いてたらすごい長い文章になってしまいました。
行ったつもりでサマーキャンプッ☆
 
みなさまも良い夏休みを!
 
 
 
 

ARQをMacにインストールして,さくっとSPARQLでRDFを検索しよう。

はじめに

ARQは,Jena(Apacheのプロジェクト)でサポートされているパッケージの1つです。 ARQを使うことで,コマンドプロンプトでSPARQLを実行し,簡易的にRDFを検索することが出来ます。今回はARQをMacにインストールする方法と簡単な使い方をご紹介します。

⚠バージョンによって,インストール方法が変わる恐れがあります。ネット上の情報も古い場合があるので,その場合には,解凍したフォルダのREADMEをご覧ください。Windowsの場合の方法もREADMEに載っています(動作は未確認)。

インストール

最新版のapache-jenaを任意の場所にインストールします。

$ wget http://www.apache.org/dist/jena/binaries/apache-jena-2.12.0.tar.gz
$ tar -xzvf apache-jena-2.12.0.tar.gz

(参照:Macでwgetコマンドを使えるようにするの書

PATHを通す

.bash_profileにPATHを設定し,有効化します。

$ vim ~/.bash_profile

#色々な記述があったり無かったり
 export JENA_HOME=インストールした場所/apache-jena-2.10.1
#色々な記述があったり無かったり

$ source ~/.bash_profile

レッツ実行

$ arq --version
Jena:       VERSION: 2.10.1
Jena:       BUILD_DATE: 2013-05-11T22:05:51+0100
ARQ:        VERSION: 2.10.1
ARQ:        BUILD_DATE: 2013-05-11T22:05:51+0100
RIOT:       VERSION: 2.10.1
RIOT:       BUILD_DATE: 2013-05-11T22:05:51+0100

上記のようにバージョンが表示されればOKです。

 Exception in thread "main" java.lang.NoClassDefFoundError:

のようなエラーが出た場合には,PATHの指定が間違っているのでご注意ください。

サンプルクエリ

ちなみに実行形式や実行結果は以下のとおりです。

$ arq --data ex002.ttl --query ex003.rq 
--------------------------------
| craigEmail                   |
================================
| "c.ellis@usairwaysgroup.com" |
| "craigellis@yahoo.com"       |
--------------------------------

ちなみに中身は,Learning SPARQLのサンプルデータです。ここからダウンロード出来ます。 ex002.ttlはTurtle形式のRDF,ex003.rqにSPARQLのクエリが書かれています。

$ cat ex002.ttl 
# filename: ex002.ttl

@prefix ab: <http://learningsparql.com/ns/addressbook#> .

ab:richard ab:homeTel "(229) 276-5135" . 
ab:richard ab:email   "richard49@hotmail.com" . 

ab:cindy ab:homeTel "(245) 646-5488" . 
ab:cindy ab:email   "cindym@gmail.com" . 

ab:craig ab:homeTel "(194) 966-1505" . 
ab:craig ab:email   "craigellis@yahoo.com" . 
ab:craig ab:email   "c.ellis@usairwaysgroup.com" . 

$ cat ex003.rq 
# filename: ex003.rq

PREFIX ab: <http://learningsparql.com/ns/addressbook#> 

SELECT ?craigEmail
WHERE
{ ab:craig ab:email ?craigEmail . }

間違いの検出にも

ARQの便利なところは,RDFの間違いについても検出してくれるところです(超重要)。例えば,以下のように,ab:craigとするべきところを,a:craigとしてしまうと,

$ cat ex002.ttl 
# filename: ex002.ttl

@prefix ab: <http://learningsparql.com/ns/addressbook#> .

ab:richard ab:homeTel "(229) 276-5135" . 
ab:richard ab:email   "richard49@hotmail.com" . 

ab:cindy ab:homeTel "(245) 646-5488" . 
ab:cindy ab:email   "cindym@gmail.com" . 

ab:craig ab:homeTel "(194) 966-1505" . 
a:craig ab:email   "craigellis@yahoo.com" . 
a:craig ab:email   "c.ellis@usairwaysgroup.com" . 
$ arq --data ex002.ttl --query ex003.rq 
11:54:56 ERROR riot                 :: [line: 12, col: 1 ] Undefined prefix: a
org.apache.jena.riot.RiotException: [line: 12, col: 1 ] Undefined prefix: a
    at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:132)
    at 
…以下略

上記のようにどこが間違っているのか教えてくれます。

Resultsオプション

地味に便利なresultsオプションを使うと,異なるフォーマットでの出力も可能です。下記の例では,実行結果をJSONで出力させています。他にも,text, XML, CSV, TSV 形式での出力が可能です。

$ arq --data ex002.ttl --query ex003.rq --results json
{
  "head": {
    "vars": [ "craigEmail" ]
  } ,
  "results": {
    "bindings": [
      {
        "craigEmail": { "type": "literal" , "value": "c.ellis@usairwaysgroup.com" }
      } ,
      {
        "craigEmail": { "type": "literal" , "value": "craigellis@yahoo.com" }
      }
    ]
  }
}

ではでは,レッツ エンジョイ スパークルライフ!!しゅわしゅわっ。

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

さて,前回までの直感RDF!でRDFの概要を学びイカシタRDFを作成したり,情報収集する方法を紹介しました。今回は,外部のデータと繋げて検索する方法をご紹介します。

目的ー何するの?

今回は今まで作成したRDFのデータを使って,薬のターゲット情報や,特許情報を取得するまでを書いていきたいと思います。

外部のデータのことを知ろう。

外部のデータと繋げていくためには,外部のRDFデータについて知る必要があります。ここでは,薬のターゲット情報が知りたいので,bio2rdfで提供されているdrugbankの情報を見てみましょう。bio2rdfのトップページから,Vioxx [drugbank:DB00533 ]を選択します。右の検索窓に,drugbank:DB00143が表示されると思うのですが,これを自分の手持ちのデータのdrugbank ID - ここでは, drugbank:DB00864 に変更し,検索します。すると,このようなページが開かれるはずです。ここからtargetを探ります。あ,ありました。

f:id:maoring:20140914174025p:plain

あ,あれ,なんか求めてたのと違う?URIじゃん,と思ったあなた,クリックしてみてください。

f:id:maoring:20140914174151p:plain

targetが見つかりました!

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

さて中身をご覧頂くと,おそらくバイオ関係で研究をされている方なら,この時点で遺伝子名,生物種,他の関連するデータベースの ID などが書かれているので興味を持って頂けるかも?と感じています。 あ,でも,dcterms:titleってなんだろう?と思ったあなた,クリックしてみてください。

f:id:maoring:20140914174300p:plain

あれ,あまり情報がない!こんな時は検索エンジンで検索すれば,大体情報が出てきます。ちなみに,dctermsのdcはDublin Coreの略,コンピュータのメタ情報を記録するための語彙集であり,titleはそのタイトル,感覚としてはnameと同じくらいで良いと思います(多分ホントはもっと厳密)。ただ,このへんは長いものに巻かれろで,汎用的なものをそんなものか,という感覚で使う程度でも,ユーザーとしては良いと思います。 ま,そんな訳で薬のターゲットの出し方が分かりました。え,分かりにくい?そんな方のためにまたグラフを書いてみたよん☆テンションぶれぶれですが,お腹が空いているのです。お許し下さい。

f:id:maoring:20140914175525p:plain

もちろん,抜粋です。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

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:DB00864URIを主語として,targetとなりうる?o, Objectを探し出し, そのtitleを出して,?targetとして出力させています。

検索結果

f:id:maoring:20140914182104p:plain

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

SPARQLで繋げ!

前回ご紹介した,DrugTargetのSPARQL Endpointを開いていください。SERVICEを使って検索をします。

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.でターゲットの名前を出しています。

実行結果

f:id:maoring:20140914184806p:plain

もとのデータより表が大きいと感じる方がいらっしゃるかもしれませんが,どこかのデータが多い場合には,その多いデータに合わせて,表の行数も多くなります。ここでは,target_nameの数が多いので,それに合わせてありますね。

ちょっと応用。

ここで,遺伝子名も見たいなぁと思った場合には,以下のようにチョビっと書き換えればOKです。この辺りで,もとのdrugbankのRDFを調べたことが効いていることが分かると思います。

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.
                }
      
      }

実行結果

f:id:maoring:20140914185336p:plain

特許の情報を知りたし。

そんな場合には,先ほどのdrugbankの解説ページに戻りましょう。3ページ目に特許らしき記述を発見しました。

f:id:maoring:20140914185833p:plain

特許番号は何かしら?とクリックすると,ありました♪

f:id:maoring:20140914185937p:plain

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

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

トリプルストアを自分で立てるなら?

最後に簡単に自分でトリプルストアを立てる時に役立ちそうなURLを紹介します。 以下の情報を参考にしてみてください。

直感RDF!! その2 -使いやすいRDFを作って,検索しよう。

直感シリーズ第二弾,その2です。えっと,次は書くといいながら,300日弱の時が過ぎました。なんやて!(エセ関西弁)。ある程度ネタが集まったので書いていくことにします。

手持ちのデータをRDF化しよう。

実際にRDFを他のRDFと統合しようと思ったら手元のデータのRDF化が必要です。RDF自体の説明は前回のエントリをご覧頂くとして,ここでは,こんなデータを用意してみました。ある薬のデータです。シチュエーションとしては,ある研究所の研究支援部(あくまでFictionにしてあげてください)が支援している薬のデータをRDF化したとします。中身は,ある薬を基準として,その名前,製品名,drugbankID,疾患名,疾患分類であるicd10のIDをつけています。rdf(記法はttl形式)の中身はこうなります。

@prefix drugbank:   <http://bio2rdf.org/drugbank:> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:> .
@prefix dbowl:    <http://dbpedia.org/ontology/> .
@prefix Medical_condition: <http://schema.org/MedicalCondition/> .

<http://sampledrug.jp/Drug#1>
        drgb:name "タクロリムス"@ja;
        drgb:product "プログラフ顆粒0.2mg"@ja;
        dbowl:drugbank  drugbank:DB00864; 
        Medical_condition:name  "移植片対宿主病"@ja;
        dbowl:icd10 "T860".

最初にprefixで以下の記述で省略したいURIを書いています。今回は可読性のためにもprefixを多用していますが,(drgb:nameは正式には,http://bio2rdf.org/drugbank_vocabulary:name です。ここで使われているURIをクリックすると,そのURI自体について,概略が説明されていることもあります(本当は,そのようなウェブページを作るのが望ましいとされています。ただ,今回はクリックしても真っ白だぜ)。 このRDFのdrgb:name,dbowl:drugbankの部分(http://sampledrug.jp/Drug#1の主語(Subject)に対して述語(Predicate)といいます。ちなみに"タクロリムス"@ja は目的語(Object)になります。)は汎用的なものを使うことが望ましいとされています。

上記のRDFをグラフにするとこんな感じになります。(Subjectについては,http://sampledrug.jp/Drug#をsampledrug: に省略しています。)

f:id:maoring:20140913134844p:plain

適切なURI(特にpredicate)を探せ

少しRDFの検索からは横道にそれますが,適切なURIの付与は個人的には,RDF(というかLOD←情報は色々とあると思うので検索してくだされ)において重要であると考えています。また,RDFのトリプルに適切なURIを指定する際の話を詳しく書いてある既存の記事が少ないので,記載します。 RDFの概念では,SubjectとPredicateには,URIを使うということが前提となっています。それはグラフ式のデータベースのそれぞれのResource(RDFのRのResource,具体的にはSubject, Predicate, Objectに該当するデータ)を他のデータとつなげようとした時に,このURIが同一かどうかで判断しているからです。例えば,先ほど書いた,<http://sampledrug.jp/Drug#1> dbowl:drugbank drugbank:DB00864.のトリプルですが,別のデータベースにおいて<http://othercompany.jp/Drug#29> dbowl:drugbank drugbank:DB00864.と書かれていた場合に,このdrugbank:DB00864は唯一無二のものとして認識することが出来ます。例えば,othercompanyが薬の特許を取得していてその情報をRDFで記述していたなら,

@prefix drugbank:   <http://bio2rdf.org/drugbank:> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:> .
@prefix dbowl:    <http://dbpedia.org/ontology/> .
@prefix Medical_condition: <http://schema.org/MedicalCondition/> .

<http://othercompany.jp/Drug#29>
        dbowl:drugbank  drugbank:DB00864; 
        drgb:patent "Japanese patent 5260301".

のようになり,先ほどのデータと,drugbank:DB00864を通じてデータを的確に繋げることが出来ます。 グラフにするとこんな感じです。

f:id:maoring:20140914123039p:plain

こうすることで,例えば,移植片宿主病の薬はタクロリムスで,その特許はothercompanyにより取得されていて,その特許番号は日本国特許の場合526301である,ということが取り出せます。(詳しい方法は後述します。)

ここまで,さりげなくRDFを書いてしまいましたが,実際にはこの手持ちのデータをRDF化する過程で時間がかかります(多分これはデータが貯まれば貯まるほど前例が出来るので簡単になっていくはずです)。現状では,適切なURIを割り当てるということがなかなか難しい状況であります。私自身も現在手探りで進めているところではあるのですが,そのための方法(案)を幾つか紹介しましょう。 もっとも,適当に自分の好きなURIを割り当ててしまって後から修正するという考え方もあります。その辺の緩やかさも許容されるのは,RDFの強みです。特に既存のものが見つからなかった場合には無理をしなくてもいいんじゃないのかな?と個人的には考えています。(まともにやるとオントロジーの設計やらをする必要が出てしまうので…)

ここから述べる情報は私が個人的に本を読んだり,教えていただいたりした情報なので,もっと良い方法がありましたら,ご連絡ください〜また,今後掲載する情報は,現在私がいる環境に関連しているため,ライフサイエンスまわりの情報に偏っていることはご容赦ください。

ちなみに,Subjectは手持ちのデータの場合,自分の所属する機関や所有するウェブページのURIを使って生成すると良いと思います。確かその辺りの話は,Linked Data: Webをグローバルなデータ空間にする仕組みという本が詳しいのでご参照ください。

DBpedia

まず,汎用性が高いDBpediaから紹介しましょう。Wikipediaの情報を頑張ってセマンティックウェブに対応してくださっているプロジェクトです。論文を読むと,ライプツィヒ大学の方々が中心となってこのサービスを進めてくださっているようです。

ここでのURIを探す方法ですが,まず,wikipediaで手持ちのデータと関連するデータを検索します。 ここでは,タクロリムスを検索してみました。次に,Englishをクリックして,英語ページを表示します。

f:id:maoring:20140914131137p:plain

英語ページのURIをチェックして,en.wikipedia.org/wiki/ 以降の部分をコピーします。

f:id:maoring:20140914131501p:plain

そして,http://dbpedia.org/page/Tacrolimusのように,dbpedia.org/page/ 以降に先ほどのコピーした文字列をペーストして,dbpediaのページを開きます。もちろん,直接調べたい情報の文字列を書き込んでいただいても構いません。すると以下の様なページが開かれます。

f:id:maoring:20140914131918p:plain

さて,ここでPropertyやValueをチェックしていきます。RDF的にこのページを捉えると,ページのURIである http://dbpedia.org/page/Tacrolimus がSubject, PropertyがPredicate, ValueがObjectになります。 先の例では,dbpedia-owl:drugbankを使いましたが,DBpediaから参照して使用しました。ちなみにこのページのdbpedia-owl:drugbankをクリックすると,dbpedia-owl:drugbankをSubjectとしたPredicate, Objectに該当する情報(ここでdbpedia-owlはオントロジーです)を表示してくれます。(DBpediaの中の方のすごい労力を感じる…)。 そうして,適切なURIが見つかれば,http://dbpedia.org/ontology/drugbank を手持ちのRDFデータのリソースに付与してあげることが出来ます。

LODSTATS

LODSTATSは統計的によく使われているPropertyなどを検索することが出来ます。例えば,ここでpatentを検索するとhttp://patents.data.gov.uk/def/patents/patentID といったPropertyと個数が出てきて汎用的に使われているデータを検索できます。

f:id:maoring:20140914133417p:plain

とはいえ,収録されているデータが網羅的ではないようなので,私にはあまり参考になりませんでした(・・;)。分野によっては参考になることもありそうです。

bio2rdf

bio2rdfは,バイオに特化したプロジェクトではありますが,かなり参考になるデータも多く含まれています。お目当てのデータベースの種類が決まっている場合にはトップ画面のセレクトボックスから,目的のデータベースを選び,検索をしてみると良いです。

f:id:maoring:20140924130400p:plain

すると先ほど紹介したDBpediaと同様に1つのページがSubjectに該当し,参考となるAttributes(Predicate)と内容であるValues(Object)を調べることが出来ます。bio2rdfでは,他にも個別のデータベースのSPARQL Endpointが存在し(例:MGIClinical Trials)それぞれのデータベース毎に検索が出来たり,データをまとめてダウンロード(ダウンロードページ)をすることが出来るので,バイオ関連の方は必見といって良いと思います。難点はそのデータベースを作っている機関が作成したRDFではないため,RDF化したデータの捉え方が正確ではない点とリンク切れも結構あります。

データベースを作成している研究機関によるRDF

各国の研究機関では,そのデータベースを作成している研究機関が持っているデータをRDF化して,公開,検索,またはダウンロードできる場合があります。専門的な内容となるので,詳細は省きますが,以下にリンク先を掲載します。

  • EMBL-EBI RDF Platform

    BioModels, BioSamples, ChEMBL, Expression Atlas, Reactome, Uniprotの各データベースをRDF化し,公開,検索,ダウンロードできます。検索例も充実しており,SPARQLの勉強にもなります。またそれぞれRDF化されたデータの概要やグラフ画像もあるので,自分の出したクエリがどういった経路を辿って出力されるのか,直感的に理解することも出来ます。例:ChEMBL documentation

  • PubChemRDF Release Notes

    上記のページに説明が細かく書いてあります。化学的な知識が無いと使いこなすことが難しそうですが(私はひと通りドキュメントを読んだのですが,実験用語の概念を理解して,ほぉ,と思っただけという状況です…すみません…。)専門的な検索が出来そうに見受けられます。検索するための機能は無さそうなので(現時点では),ダウンロードして使用するということが必要のようです。

  • KEGG LinkDB RDF

    keggの各エントリにはRDFでダウンロードできるページがついており,使用することができます。どうやら,最近SPARQLによる検索もできるようになったようです。とてもシンプルなRDFで構成されているので,実際にデータを繋げていく時にも便利ではないか,という印象を持っています。

  • PDB

    こちらの検索窓に検索語を入れて,検索をすると,該当するSubjectやPredicateを検索できます。日本語での説明(pdbj)での説明はこちら。また,PDB上のタンパク質のデータは基本的にRDF形式でのダウンロードが可能です。しかし,PDBのデータと見せ方は綺麗だなぁ,といつも思います。

  • RIKEN BASE

    理研で公開されているデータをまとめて検索できるページなのですが,バイオリソース系を中心として,RDF形式でのダウンロードが可能です。例えば,シロイヌナズナフェノームデータベースマウス系統リストのページにあるこのテーブルをダウンロードするボタンを押すと,RDF形式でのダウンロードを選択できます。手持ちのデータがこれらのデータと近い場合には,かなり参考となるデータが揃っているはずです。ただ,SPARQL Endpointが公開されていなかったり,Predicateがcria315s1iなど,すぐに意味が分からない言葉が含まれていることが難点です。

他にもあるはずですが,有用なデータベースを紹介していなかったらご連絡ください〜。 全般的に,データを出している機関によるRDF化されたデータは,データの信頼度が高いと思われます。(中の人にもよるかもしれない)前述のbio2RDFはかなり便利なのですが,本家のデータベースのRDF化されたデータとデータリソースがかぶっていた場合,かなり書き方が異なることもあるので,注意が必要です。

ふう。他には何かあったかしら?あ,そうでした!

BioPortal

BioPortalは,どちらかというとオントロジーの集積といった色合いが強く,バイオロジーや医薬関連のオントロジーがこちらに集約されています。登録されているものについては,各オントロジーの詳しい説明や定義されている語彙の階層構造や関係性を検索することが出来ます。自分で開発したオントロジーを登録することも出来るので(やったことないですが,多分ユーザー登録が必要です。ちなみに微生物DBであるMicrobe DBで考えられたVocabularlyはこちらで登録されています。)

しっかりとしたRDF(というよりオントロジーを記述するための言語のOWLかな、ここでは説明しませんが、オントロジーの設計にはこのフォーマットのほうがRDFより適しています。)を気を入れて作る場合には,大いに役立つサイトだと思います。また,オントロジーによってはSPARQLによる検索をかけることが出来(ということの知名度はあまり高くなかったはず), BioPortal SPARQL betaは,案外検索例も充実しています。疾患分類であるicd10自体のオントロジー検索は,こちらから行うことができました。ただ,個人的にはオントロジーを検索できても,そこからデータを繋げていくのは難しいので,辞書的なもの,あるいはハブ的なものととらえたほうが良いのかなぁと感じています。(そうでもないかもしれないので,そうでもない使い方をされている方は教えて下さい〜)

LODに関するプロジェクトとRDF

直接研究機関で出しているもの,ではないですが,アメリカの特許のRDF化や検索(SPARQL Endpointによる)RDFを活用したアプリケーションについては,こちらのAKSWから見つけられます。先ほど紹介したDBpediaをはじめとしたRDF(というか,もっとひろくLOD(LODについての情報は転がっていると思うので,調べてあげてください))を活用した様々なプロジェクトがあるので,探しものが見つかるかもしれません。

Schema.org

Schema.orgは,htmlをmicordata, RDFa, JSON-LDでマークアップするための語彙を記述してまとめているサイトなのですが(余裕があったら後述しますが,RDF的に捉えると基本的に各ウェブページをSubjectとし,そこに含まれているデータを指定してObjectとし<文字列が多いですが,URIや画像等も指定できます> Predicate<原則Schema.orgの語彙>を使ってウェブページ1ページでRDFを表現するようなものです),ここで使われているプロパティもRDFに使用することが可能です。前述した手持ちのデータのRDF化でも@prefix Medical_condition: <http://schema.org/MedicalCondition/> .で使用しています。こちらのURL:http://schema.org/MedicalConditionには詳しく説明があります。Propertyの下の方にnameがあることがご確認いただけますでしょうか。今回のRDFのMedical_condition:nameはこちらから使用しています。

@prefix drugbank:   <http://bio2rdf.org/drugbank:> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:> .
@prefix dbowl:    <http://dbpedia.org/ontology/> .
@prefix Medical_condition: <http://schema.org/MedicalCondition/> .

<http://sampledrug.jp/Drug#1>
        drgb:name "タクロリムス"@ja;
        drgb:product "プログラフ顆粒0.2mg"@ja;
        dbowl:drugbank  drugbank:DB00864; 
        Medical_condition:name  "移植片対宿主病"@ja;
        dbowl:icd10 "T860".

ファイルタイプ指定検索

裏技的な方法ですが,google(他の検索エンジンでもそうかもしれない)では,データタイプを指定して検索をかけることができます。通常は pdf, doc, png などを検索するのですが,例:ぐぐれ filetype:pdf これで,rdf関連のフォーマットで検索してしまうのです。例:癌 filetype:ttl RDFのフォーマットとしては,他に,rdf, n3, nt, trig, trixがあるので,良かったら,調べてみてください。

もう少し多くのデータを作成して…

さて,今後の検索のために,データが一つだけだとつまらないので4つほどお薬をご用意しました。

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix drugbank:   <http://bio2rdf.org/drugbank:> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:> .
@prefix dbowl:    <http://dbpedia.org/ontology/> .
@prefix Medical_condition: <http://schema.org/MedicalCondition/> .

<http://sampledrug.jp/Drug#1>
        drgb:name "タクロリムス"@ja;
        drgb:product "プログラフ顆粒0.2mg"@ja;
        dbowl:drugbank  drugbank:DB00864; 
        Medical_condition:name  "移植片対宿主病"@ja;
        dbowl:icd10 "T860".

<http://sampledrug.jp/Drug#2>
        drgb:name "ホスカルネットナトリウム水和物"@ja;
        drgb:product "点滴静注用ホスカビル注24mg/mL"@ja;
        Medical_condition:name  "サイトメガロウイルス網膜炎"@ja;
        dbowl:icd10 "B258","H320";
        dbowl:drugbank  drugbank:DB00529 .

<http://sampledrug.jp/Drug#3>
        drgb:name "塩酸ゲムシタビン"@ja;
        drgb:product "ジェムザール注射用200mg"@ja;
        Medical_condition:name  "膵癌"@ja;
        dbowl:icd10 "C259";
        dbowl:drugbank  drugbank:DB00441 .

<http://sampledrug.jp/Drug#4>
        drgb:product "ランプレンカプセル50mg"@ja;
        Medical_condition:name  "ハンセン病"@ja;
        dbowl:icd10 "A309";
        drgb:name "クロファジミン"@ja;
        dbowl:drugbank  drugbank:DB00845 .

RDFを検索!

いやはや,URI談義がこんなに長くなるとは思わなんだ…あの,余分な情報でしたらすっ飛ばしてください。 さて,いよいよ,RDFを検索しましょう! RDFの検索にはSPARQL という言語を使います。SQLチックに,でも,言葉のようなRDFはそのままに検索することが出来ます。 ブログで紹介できるクエリは限られているので,よりよいクエリや環境構築を学びたい方は,Learning SPARQL という本をご参照ください。残念ながら英語版しか無いのですが,クエリとその実行結果だけでも,読む価値有りです。1st Editionと2nd Editionがありますが,新しい情報も追加されているので,2nd Editionをオススメします。

今回は,こちらに検索窓をご用意しました(一般的にはSPARQL Endpointといいます。)。Let's click!

するとこんな感じの画面が開かれると思います。

f:id:maoring:20140913135622p:plain

何はともあれ,検索実行ボタンを押してみてください。

select * where {?s ?p ?o.} LIMIT 100

検索結果

f:id:maoring:20140913140200p:plain

解説しましょうっ。selectは単純に選んでくれといっています。その後の*はワイルドカード,全部選んでくれ!と言っています。次にwhere,どこの何を選ぶのか,以下に指定します。?s ?p ?o.これはあ大変ざっくりしたクエリで,?s ?p ?o という形になるもの全部出せや,と言っています。なので,トリプルすべてを出すということになります。ちなみに,この?s ?p ?o.は自分で指定して良いので,別に?shugo ?jutugo ?mokutekigo.とかにしても構いません。ちなみに,ずぼらな私はselectやwhereを小文字にしてしまっていますが,一般的には大文字を使います。ただ検索上は問題ないので(そのあたりは,SQL系の言語と同じです)ご了承ください。 ちょっと分かりにくい方のために,例えば,以下のクエリを実行してみてください。

prefix Medical_condition: <http://schema.org/MedicalCondition/>
select * where
 {?s Medical_condition:name ?o.}

すると疾患名だけが検索結果に現れるはずです。

f:id:maoring:20140914162025p:plain

もう少し検索してみましょう。

prefix Medical_condition: <http://schema.org/MedicalCondition/>
prefix dbowl: <http://dbpedia.org/ontology/>
prefix drgb: <http://bio2rdf.org/drugbank_vocabulary:>
prefix drugbank:   <http://bio2rdf.org/drugbank:>

select  ?name ?product ?drugbank_ID ?disease_name ?disease_ID
where
{
?s 
drgb:name ?name;
drgb:product ?product;
dbowl:drugbank ?drugbank_ID;
Medical_condition:name ?disease_name;
dbowl:icd10 ?disease_ID.
}

?s drgb:name ?name;のように,";"で繋げると,Subject は同じまま,PredicateとObjectを書いていくことが出来ます。

実行結果

f:id:maoring:20140914161359p:plain

え,今まで作ったRDF形式の手持ちのデータを表形式にしただけじゃないか,この…(以下自粛)って? あ,はい,このままではそうです。次回は,外部のデータと繋げてもっと使える検索をする, という話をしたいと思います。

ご紹介が遅れましたが,今回使用させて頂いた http://lodcu.cs.chubu.ac.jp/SparqlEPCU/は中部大学の年岡研究室で提供してくださっているサービスで,手持ちのRDFデータをアップロードすると,SPARQL Endpointという検索窓を提供してくれる太っ腹なサービスです。データ量が少ない場合やちょっと皆さんとデータを共有したい時には,使用してみると大変便利だと思います。

その3に続きます。

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

直感RDF!! その1-RDFとは。

直感シリーズ第二弾です。microdataについてももちろん追記したいのですが,状況が流動的なので,もう少しかたまってから,追記していきたいと思っています。

RDFとは

Resource Description Framework の略です。頭文字を取って,RDFWikipediaによると,

Resource Description Framework (リソース・ディスクリプション・フレームワークRDF) とは、ウェブ上にある「リソース」を記述するための統一された枠組みであり、W3Cにより1999年2月に規格化されている…中略…RDFは特にメタデータについて記述することを目的としており、セマンティック・ウェブを実現するための技術的な構成要素の1つとなっている。

ふーん,って感じじゃないですか?枠組みって言われてもねぇ。と私は思っていました。 もう少し耐えて,調べてみましょう。

そのセマンティックウェブって何よ?

Webページおよびその中に記述された内容について、それが何を意味するかを表す情報(メタデータ)を一定の規則に従って付加することで、コンピュータが効率よく情報を収集・解釈できるようにする構想。インターネットを単なるデータの集合から知識のデータベースに進化させようという試みがセマンティックWebである。IT用語辞典 e-words より

一度理解してしまうと,確かにそうではあるのですが,もう少し直感的に,ゴールから捉えてみましょう。

RDFを使って目指す世界

RDFは要素間の関係性を記述していく枠組みです。RDFとそれが使われて表現されるセマンティックウェブを直感的に捉えるならば,グラフとして捉えるのがよいと思います。 世の中の全てのデータをグラフ表記してしまえ!そしてそのグラフっていうのは,機械にも理解できるような世界共通のグラフにしてしまえ,というのが,RDFを使って目指す世界です。(だと私は思っています。)

f:id:maoring:20131128222044p:plain

http://www.mkbergman.com/968/a-new-best-friend-gephi-for-large-scale-networks/

RDFの文法

まずは感覚的に。

しばらく,RDFをグラフとして捉えていきましょう。ここでは,ちょっぴり学術的に,薬を例にして考えてみます。とあるデータベースの"薬の化合物のID DB00316"の"名前"が"アセトアミノフェン"である,とします。それをグラフで書くとこうなります。

f:id:maoring:20131128223112p:plain

これを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”.

f:id:maoring:20131128232920p:plain

グラフをつなげていこう。

ここから徐々に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(プロスタグランディン エンドペルオキシド 合成酵素)"である,ということを示しているわけです。 これをグラフにして表記すると,このようになります。

f:id:maoring:20131128235036p:plain

RDFを使って目指す世界とは,このような要素間のグラフを繋げまくって,ウェブの世界をまるごとグラフにしてしまおうぜ,というものです。そして,このグラフを機械が理解するためには,出来るだけ,それぞれの要素が,世界的にどういう意味なのか,という定義付けがされているとありがたいわけです。先程の例だと,drugbankというデータベースのIDであることが明記されていれば,例えば,他の薬につなげたり,化合物の別名があれば,それを表記することも容易になるわけです。そして,他の人が作ったデータとも,容易に繋げていくことが出来ます。それは,単純にグラフを繋げていくだけだからです。 ちょっと凝った話になりますが,テーブル同士をどう繋げていくのかという設計に頭を悩ませるRDBに対する利点であり,Subject Predicate Objectという3組になっているという時点で,key-value方式で保存をされているNo SQLとも相性が良いのではないか,と私は感じています。

実際使われてるの?

RDFの利用は確かにまだまだ発展途上ですが,その利用は確実に伸びています。先ほど紹介したDrugbankのデータもありますし,WikipediaRDFに変換したものや,博物館のデータ,政府のデータや自治体のデータ,BBCなどの報道機関のデータ,音楽の情報,地理的な情報をRDF化したものなどがゴロゴロと存在しています。多くのデータがより繋がっていけば,より多くの価値ある情報を取り出せるようになるはずです。

次回は,グラフでつないだデータをどう取り出すのか,ということをメインに書いていきたいと思います。(思ったより,超長くなってごめんなさい。)また,お会いしましょうっ。つ,次はちゃんと書く。きっと書きます〜

直感RDF!! その2 -使いやすいRDFを作って,検索しよう。 - maoring blog

Virtuosoのアップデートでハマった時のメモ。

Virtuosoたんをアップデートしたい!

RDFにクエリを投げる時には,SPARQLというSQLライクな言語を使うのですが,そのストアとして使用していたVirtuosoたんをアップデートしようとしてひっかかったので,メモ。 もともとは,Version: 06.01.3127だったのですが,新しいバージョン(Version: 07.0 )だと,新しいSPARQL1.1のクエリも投げられると聞いたので,アップデートしようと試みました。

どっかのUIにあるのか,コマンドでちょちょいと出来るのかと思いきや,思いの外情報が無い(・・;)。twitterでつぶやいたら,@OKB_Pさんが返信をくださいましたっ!!

@maoringo ただ,内部サーバーにインストールしているvirtuosoをせっかくなので,アップデートしようと思うのですが,一度アンインストールする必要があるのでしょうか。それともすぐに出来るものなのでしょうか。

@OKB_Pさん 商用版は分かりませんが、オープンソース版だとビルドし直して、古い方のvirtuoso.dbファイルをコピーしてやると動くはず(バージョンがあまり離れていない場合?)。 ポート番号がかぶるので、古い方は停止させるかポート番号を変えるかしてます

ありがとうございます!持つべきものは頼もしいおねえさま!というわけだったのですが,実はこの質問をした時には,もう,virtuosoの前のバージョンを削除してしまっていて,しかし,アクセスすると,こんな感じでアクセスできる,うわー,な状態だったので,

kobito.1383008959.655497.png

ポートを停止せよ。

なんとか,停止を試みることにしました。 最初は,公式ページを見たのですが,ここで指定したコマンドを実行することが出来ずorz 頂いたメッセージを頼りに,ポートを閉じることに。

あったった。HOW TO CLOSE A PORT IN LINUX 最初に空いているポートを確認。

nmap localhost

unknownでポートが開いているっぽいことを確認。公式ページから,使っているポートが私の環境の場合,1111と8890だったので,キルしたぞなもし。 (ここに至るまで思いの外時間がかかった…)

fuser -k 1111/tcp
fuser -k 8890/tcp

後はいつもどおりにインストール再開。

それでもって,普通にインストール再開&起動 ダウンロードはこちらから。 普通のインストールは,こちらを見ると便利です。週末京都-VirtuosoをMac OS Xにインストール Macもlinuxも大体同じです。インストールする際に事前に追加が必要なパッケージについては,インストールしたフォルダ内のREADMEをご覧いただき,チェックの上,追加してください。

$ ./configure
$ make
$ sudo make install

$ cd [インストールしたとこ]/virtuoso-opensource/var/lib/virtuoso/db
$ sudo [インストールしたとこ]/virtuoso-opensource/bin/virtuoso-t -f &

出来た☆ kobito.1383018508.930221.png

ちなみに今回は,大したデータを入れていなかったので,前のバージョンのものをまるっと消してしまいましたが,@OKB_Pさんが仰った通り,[インストールしたとこ]/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.db にデータが保存されているようなので,バージョンアップする際には,これをどこかに一時的に避難させておいて,インストールしたものをコピーするのがよさそうです。 今回は,調査のため同じ内容をqiitaにも投稿しています。

microdataとソフトウェア(調査編)

以前microdata関連のブログを書いてから何日が経ったでしょうか(遠い目)。 続きはいつかきっと書くとして(えー),今日はソフトウェアアプリケーションについてmicrodataを入れるとどんなよいことがあるのか,ということに着目して書いていくことにしましょう。

目的

研究室で開発したソフトウェアを宣伝したい。そのためには,検索エンジンで目立つことが1つの対策だ。目立つためにmicrodataを使ってみよう。

目立つってどういうこと?

こういうことです。

f:id:maoring:20130926175847p:plain

あ,LINEなんてもう超有名なんだから宣伝する必要が無いって?いやいや,これを我々の開発してるソフトウェアでもやってしまいましょうということです。

調査

どんなページ?

調査から入りましょう。 先ほどのヒットをクリックするとこんなかんじで,普通のソフトウェアの紹介ページです。

f:id:maoring:20130926180526p:plain

コードを拝見

このように☆が検索結果にあるページというのは,なんらかのメタデータが埋め込まれているか,超大手のサイトで検索エンジンのクローラーが,勝手に構造を解釈しているかのどちらかです(まおりんしらべ)。さあ,コードを見てみましょう。

f:id:maoring:20130926180847p:plain

ちょっと小さくて見にくい感じですが‥ありました!"itemscope" microdataは"itemtype"と"itemscope"と"itemprop"で大抵の場合,構成されているので,それらが見つかればmicrodataマークアップされていると考えていただいて問題ないです。 さて,このgoogleのページ : リッチ スニペット - ソフトウェア アプリケーション を見ると,色々とデータをマークアップして,メタデータを付与できるのことが分かります。しかしながら,全部入れるのは少々面倒ですし,検索結果にきれいに反映されないとせっかくやったのに(´Д⊂グスンということになるので,今回は拾ってきてくれそうなものだけに着目することにしましょう。

ピックアップ

f:id:maoring:20130926195247p:plain

必要なのは,上記画像の★★★☆☆評価:3 部分と68票,無料,Androidの部分です。 何のitempropを使用しているか,調べるために 構造化データ テストツールを使います。もう既にmicrodataによるマークアップが完了しているウェブページの場合,ここのURLに記入し,プレビューを押せばOKです。さきほど参照したサイトだと,このようにデータが表示されます。一部抜粋↓

f:id:maoring:20130926201020p:plain

マークアップされているタグを探していこう。

こちらのデータを参照すると,

<div itemscope itemtype="http://schema.org/SoftwareApplication">
<strong itemprop="name">LINE(ライン) - 無料通話・メールアプリ</strong>
…中略…
<dl itemprop="aggregateRating" itemscope itemtype="http://schema.org/aggregaterating">
    <dt>ユーザー  </dt>
    <dd>
        <ul>
                    <li>
                <meta itemprop="worstRating" content="0" />
                <span itemprop="ratingValue">6.1</span>
                <meta itemprop="bestRating" content="10" />
…中略…
                <em itemprop="ratingCount">68</em>
            </li>
                </ul>
    </dd>
</dl>
<dd itemprop="operatingSystems">
<ul><li>Android</li></ul>                             
</dd>
<ul  itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<li><meta itemprop="price" content="0" /></li>
</ul>
</div>

まずは,概要的なitempropから。<strong itemprop="name">LINE(ライン) - 無料通話・メールアプリ</strong>でソフトウェアの名前を書いています。

次に,評価を書くためのソフトウェアのプロパティitemprop="aggregateRating"を使い,具体的な評価を書く際には評価を書くためのitemtype="http://schema.org/aggregaterating"を使用し,入れ子にして書いています。その中での最低点をitemprop="worstRating"で示し,最高点をitemprop="bestRating"で示しています。なお,このworstとbestは特に指定しないと,1が最低,5が最高点となるようです。参照 : http://schema.org/AggregateRating  また,metaタグを使うと,画面上には表示しないメタデータをhtml上に埋め込むことが出来ます。得点の最高,最低点なんで書かなくても良いですものね? さて,ここでの得点はitemprop="ratingValue"を使って書いています。<span itemprop="ratingValue">6.1</span>この6.1点が,5点満点に変換されて,評価:3と検索結果では表示されているようです。

票数は,<em itemprop="ratingCount">68</em>で書かれています。お気づきのように,microdataのitemprop等のタグはspanやdivタグに限らず,通常のタグ内に埋め込んでしまって構いません。そして,そのタグが閉じられるまでは,そのmicrodataで指定したプロパティが有効になっています。従って,この評価については,<dl itemprop="aggregateRating" itemscope itemtype="http://schema.org/aggregaterating">とdlタグで始まっているので</dl>で閉じられています。

金額について書く時には"http://schema.org/Offer"をボキャブラリとして使い,プロパティとしてpriceでマークアップし,その中身はcontent="0"で無料であることを示しています。<li><meta itemprop="price" content="0" /></li>

後出しジャンケン的な解説になりますが,itemscopeというのが,次に書かれているitemtype="http://schema.org/aggregaterating"が有効になっている範囲が始まるぜベイベ的な意味を持っています。 そんな関係で,OperatingSytemは評価から外れるので,aggregateratingのタグの外に出て,<dd itemprop="operatingSystems">で書かれています。 言葉で説明すると少しややこしいかもしれませんが,グラフにするとこんなかんじです。 RDFグラフの視覚化 Turtle, Microdata, JSON-LD より

グラフっ

f:id:maoring:20131002113315p:plain

評価の部分は入れ子になっていることがわかると思います。

JSONっ

JSONにしたほうがやりやすいという方もいるので,JSONにするとこんなかんじです。 参照:Live Microdata

{
  "items": [
    {
      "type": [
        "http://schema.org/SoftwareApplication"
      ],
      "properties": {
        "name": [
          "LINE(ライン) - 無料通話・メールアプリ"
        ],
        "aggregateRating": [
          {
            "type": [
              "http://schema.org/aggregaterating"
            ],
            "properties": {
              "worstRating": [
                "0"
              ],
              "ratingValue": [
                "6.1"
              ],
              "bestRating": [
                "10"
              ],
              "ratingCount": [
                "68"
              ]
            }
          }
        ],
        "operatingSystems": [
          "\nAndroid\t\t\t\t\t\t\t\t\n"
        ],
        "offers": [
          {
            "type": [
              "http://schema.org/Offer"
            ],
            "properties": {
              "price": [
                "0"
              ]
            }
          }
        ]
      }
    }
  ]
}

続くっ

次回はマークアップ編です。お手持ちの開発した,もしくは評価したいソフトウェアにmicrodataマークアップします。ご期待くださいっ