ニコニコ学会βサマーキャンプ2015に参加して
夜はパーティー&ナイトセッション
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
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を探ります。あ,ありました。
あ,あれ,なんか求めてたのと違う?URIじゃん,と思ったあなた,クリックしてみてください。
targetが見つかりました!
このように,ターゲットを1つのURIで表記をしておくと,他の化合物のターゲットだった時にも使いまわすことができるので,URI を使用していると思われます。ここでの例のように, URI が Object になり,今度はそれを Subject としてその先に Predicate とObject が書かれており,詳しい説明(多くの場合文字列)があるいう RDF のデータは良く存在します。自分で RDF のデータを作っていく時にも参考となるはずです。ただあまりグラフが深くなると,どこに何があるのか分からなくなってしまうという恐れもあります。
さて中身をご覧頂くと,おそらくバイオ関係で研究をされている方なら,この時点で遺伝子名,生物種,他の関連するデータベースの ID などが書かれているので興味を持って頂けるかも?と感じています。 あ,でも,dcterms:titleってなんだろう?と思ったあなた,クリックしてみてください。
あれ,あまり情報がない!こんな時は検索エンジンで検索すれば,大体情報が出てきます。ちなみに,dctermsのdcはDublin Coreの略,コンピュータのメタ情報を記録するための語彙集であり,titleはそのタイトル,感覚としてはnameと同じくらいで良いと思います(多分ホントはもっと厳密)。ただ,このへんは長いものに巻かれろで,汎用的なものをそんなものか,という感覚で使う程度でも,ユーザーとしては良いと思います。 ま,そんな訳で薬のターゲットの出し方が分かりました。え,分かりにくい?そんな方のためにまたグラフを書いてみたよん☆テンションぶれぶれですが,お腹が空いているのです。お許し下さい。
もちろん,抜粋です。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:DB00864のURIを主語として,targetとなりうる?o, Objectを探し出し, そのtitleを出して,?targetとして出力させています。
検索結果
よっしゃ,ビンゴ! ここまでで,事前準備完了です。手持ちのデータと繋げてみましょう!!
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.
でターゲットの名前を出しています。
実行結果
もとのデータより表が大きいと感じる方がいらっしゃるかもしれませんが,どこかのデータが多い場合には,その多いデータに合わせて,表の行数も多くなります。ここでは,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. } }
実行結果
特許の情報を知りたし。
そんな場合には,先ほどのdrugbankの解説ページに戻りましょう。3ページ目に特許らしき記述を発見しました。
特許番号は何かしら?とクリックすると,ありました♪
先ほどのターゲット情報と同様の方法を使えば,特許番号の取得が可能です。ぜひ,試してみてください! おなか空いたので宿題です。皆さんなら出来るはずです(まさかの丸投げ)。 他にも提供されているSPARQL Endpointを使ったり,自分でトリプルストアを立てて公開されているRDFデータをダウンロードしたりして,色々と検索してみてください。言葉をつなぐように,データをつなぎ,新たな発見を見出すことが出来るかもしれません。また,複数のSPARQL Endpointを繋いで検索をすることもできます。これにより,世界中のデータとどんどこさと繋げていくことが出来ます。そして,それぞれの機関で作られているので,情報は勝手に新しくなってくれます。ティム・バーナーズ=リーが想像した世界に近づけます。やっほー。
ただ,現在のところストレスを感じるくらいに遅いので,技術革新を待つか,必要なデータは自分でダウンロードして入れしまいましょう。
トリプルストアを自分で立てるなら?
最後に簡単に自分でトリプルストアを立てる時に役立ちそうなURLを紹介します。 以下の情報を参考にしてみてください。
- VirtuosoをMac OS Xにインストール - 週末京都
- Ubuntu で Virtuoso オープンソース版のインストール
- Virtuosoのアップデートでハマった時のメモ。
- OWLIM-Liteのインストール&設定方法 (Linux)
-
となんだか,日本語と手前味噌のエントリを紹介してしまいましたが,各トリプルストア(有名ドコロはVirtuoso, GraphDB<以前のOWLIM>, Fusekiといったところでしょうか)の公式ページにも掲載されています。また,Learning SPARQLの書籍をご購入された方は,ARQというコマンドを使用して検索するのも手軽で便利です。こちらのエントリをご参考に,ぜひ導入してみてください。詳しい使い方は,本の記述をご参照ください。本の記述をご参照ください。 それでは,またお会いしましょう!!Adios!!!(多分まだ色々と修正します^^;)
直感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: に省略しています。)
適切な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を通じてデータを的確に繋げることが出来ます。 グラフにするとこんな感じです。
こうすることで,例えば,移植片宿主病の薬はタクロリムスで,その特許はothercompanyにより取得されていて,その特許番号は日本国特許の場合526301である,ということが取り出せます。(詳しい方法は後述します。)
ここまで,さりげなくRDFを書いてしまいましたが,実際にはこの手持ちのデータをRDF化する過程で時間がかかります(多分これはデータが貯まれば貯まるほど前例が出来るので簡単になっていくはずです)。現状では,適切なURIを割り当てるということがなかなか難しい状況であります。私自身も現在手探りで進めているところではあるのですが,そのための方法(案)を幾つか紹介しましょう。 もっとも,適当に自分の好きなURIを割り当ててしまって後から修正するという考え方もあります。その辺の緩やかさも許容されるのは,RDFの強みです。特に既存のものが見つからなかった場合には無理をしなくてもいいんじゃないのかな?と個人的には考えています。(まともにやるとオントロジーの設計やらをする必要が出てしまうので…)
ここから述べる情報は私が個人的に本を読んだり,教えていただいたりした情報なので,もっと良い方法がありましたら,ご連絡ください〜また,今後掲載する情報は,現在私がいる環境に関連しているため,ライフサイエンスまわりの情報に偏っていることはご容赦ください。
ちなみに,Subjectは手持ちのデータの場合,自分の所属する機関や所有するウェブページのURIを使って生成すると良いと思います。確かその辺りの話は,Linked Data: Webをグローバルなデータ空間にする仕組みという本が詳しいのでご参照ください。
DBpedia
まず,汎用性が高いDBpediaから紹介しましょう。Wikipediaの情報を頑張ってセマンティックウェブに対応してくださっているプロジェクトです。論文を読むと,ライプツィヒ大学の方々が中心となってこのサービスを進めてくださっているようです。
ここでのURIを探す方法ですが,まず,wikipediaで手持ちのデータと関連するデータを検索します。 ここでは,タクロリムスを検索してみました。次に,Englishをクリックして,英語ページを表示します。
英語ページのURIをチェックして,en.wikipedia.org/wiki/ 以降の部分をコピーします。
そして,http://dbpedia.org/page/Tacrolimusのように,dbpedia.org/page/ 以降に先ほどのコピーした文字列をペーストして,dbpediaのページを開きます。もちろん,直接調べたい情報の文字列を書き込んでいただいても構いません。すると以下の様なページが開かれます。
さて,ここで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と個数が出てきて汎用的に使われているデータを検索できます。
とはいえ,収録されているデータが網羅的ではないようなので,私にはあまり参考になりませんでした(・・;)。分野によっては参考になることもありそうです。
bio2rdf
bio2rdfは,バイオに特化したプロジェクトではありますが,かなり参考になるデータも多く含まれています。お目当てのデータベースの種類が決まっている場合にはトップ画面のセレクトボックスから,目的のデータベースを選び,検索をしてみると良いです。
すると先ほど紹介したDBpediaと同様に1つのページがSubjectに該当し,参考となるAttributes(Predicate)と内容であるValues(Object)を調べることが出来ます。bio2rdfでは,他にも個別のデータベースのSPARQL Endpointが存在し(例:MGI,Clinical Trials)それぞれのデータベース毎に検索が出来たり,データをまとめてダウンロード(ダウンロードページ)をすることが出来るので,バイオ関連の方は必見といって良いと思います。難点はそのデータベースを作っている機関が作成したRDFではないため,RDF化したデータの捉え方が正確ではない点とリンク切れも結構あります。
データベースを作成している研究機関によるRDF
各国の研究機関では,そのデータベースを作成している研究機関が持っているデータをRDF化して,公開,検索,またはダウンロードできる場合があります。専門的な内容となるので,詳細は省きますが,以下にリンク先を掲載します。
-
BioModels, BioSamples, ChEMBL, Expression Atlas, Reactome, Uniprotの各データベースをRDF化し,公開,検索,ダウンロードできます。検索例も充実しており,SPARQLの勉強にもなります。またそれぞれRDF化されたデータの概要やグラフ画像もあるので,自分の出したクエリがどういった経路を辿って出力されるのか,直感的に理解することも出来ます。例:ChEMBL documentation
-
上記のページに説明が細かく書いてあります。化学的な知識が無いと使いこなすことが難しそうですが(私はひと通りドキュメントを読んだのですが,実験用語の概念を理解して,ほぉ,と思っただけという状況です…すみません…。)専門的な検索が出来そうに見受けられます。検索するための機能は無さそうなので(現時点では),ダウンロードして使用するということが必要のようです。
-
keggの各エントリにはRDFでダウンロードできるページがついており,使用することができます。どうやら,最近SPARQLによる検索もできるようになったようです。とてもシンプルなRDFで構成されているので,実際にデータを繋げていく時にも便利ではないか,という印象を持っています。
-
こちらの検索窓に検索語を入れて,検索をすると,該当するSubjectやPredicateを検索できます。日本語での説明(pdbj)での説明はこちら。また,PDB上のタンパク質のデータは基本的にRDF形式でのダウンロードが可能です。しかし,PDBのデータと見せ方は綺麗だなぁ,といつも思います。
-
理研で公開されているデータをまとめて検索できるページなのですが,バイオリソース系を中心として,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!
するとこんな感じの画面が開かれると思います。
何はともあれ,検索実行ボタンを押してみてください。
select * where {?s ?p ?o.} LIMIT 100
検索結果
解説しましょうっ。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.}
すると疾患名だけが検索結果に現れるはずです。
もう少し検索してみましょう。
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を書いていくことが出来ます。
実行結果
え,今まで作ったRDF形式の手持ちのデータを表形式にしただけじゃないか,この…(以下自粛)って? あ,はい,このままではそうです。次回は,外部のデータと繋げてもっと使える検索をする, という話をしたいと思います。
ご紹介が遅れましたが,今回使用させて頂いた http://lodcu.cs.chubu.ac.jp/SparqlEPCU/は中部大学の年岡研究室で提供してくださっているサービスで,手持ちのRDFデータをアップロードすると,SPARQL Endpointという検索窓を提供してくれる太っ腹なサービスです。データ量が少ない場合やちょっと皆さんとデータを共有したい時には,使用してみると大変便利だと思います。
直感RDF!! その1-RDFとは。
直感シリーズ第二弾です。microdataについてももちろん追記したいのですが,状況が流動的なので,もう少しかたまってから,追記していきたいと思っています。
RDFとは
Resource Description Framework の略です。頭文字を取って,RDF。Wikipediaによると,
Resource Description Framework (リソース・ディスクリプション・フレームワーク、RDF) とは、ウェブ上にある「リソース」を記述するための統一された枠組みであり、W3Cにより1999年2月に規格化されている…中略…RDFは特にメタデータについて記述することを目的としており、セマンティック・ウェブを実現するための技術的な構成要素の1つとなっている。
ふーん,って感じじゃないですか?枠組みって言われてもねぇ。と私は思っていました。 もう少し耐えて,調べてみましょう。
そのセマンティックウェブって何よ?
Webページおよびその中に記述された内容について、それが何を意味するかを表す情報(メタデータ)を一定の規則に従って付加することで、コンピュータが効率よく情報を収集・解釈できるようにする構想。インターネットを単なるデータの集合から知識のデータベースに進化させようという試みがセマンティックWebである。IT用語辞典 e-words より
一度理解してしまうと,確かにそうではあるのですが,もう少し直感的に,ゴールから捉えてみましょう。
RDFを使って目指す世界
RDFは要素間の関係性を記述していく枠組みです。RDFとそれが使われて表現されるセマンティックウェブを直感的に捉えるならば,グラフとして捉えるのがよいと思います。
世の中の全てのデータをグラフ表記してしまえ!そしてそのグラフっていうのは,機械にも理解できるような世界共通のグラフにしてしまえ,というのが,RDFを使って目指す世界です。(だと私は思っています。)
http://www.mkbergman.com/968/a-new-best-friend-gephi-for-large-scale-networks/
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化したものなどがゴロゴロと存在しています。多くのデータがより繋がっていけば,より多くの価値ある情報を取り出せるようになるはずです。
次回は,グラフでつないだデータをどう取り出すのか,ということをメインに書いていきたいと思います。(思ったより,超長くなってごめんなさい。)また,お会いしましょうっ。つ,次はちゃんと書く。きっと書きます〜
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の前のバージョンを削除してしまっていて,しかし,アクセスすると,こんな感じでアクセスできる,うわー,な状態だったので,
ポートを停止せよ。
なんとか,停止を試みることにしました。 最初は,公式ページを見たのですが,ここで指定したコマンドを実行することが出来ず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 &
出来た☆
ちなみに今回は,大したデータを入れていなかったので,前のバージョンのものをまるっと消してしまいましたが,@OKB_Pさんが仰った通り,[インストールしたとこ]/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.db
にデータが保存されているようなので,バージョンアップする際には,これをどこかに一時的に避難させておいて,インストールしたものをコピーするのがよさそうです。
今回は,調査のため同じ内容をqiitaにも投稿しています。
microdataとソフトウェア(調査編)
以前microdata関連のブログを書いてから何日が経ったでしょうか(遠い目)。 続きはいつかきっと書くとして(えー),今日はソフトウェアアプリケーションについてmicrodataを入れるとどんなよいことがあるのか,ということに着目して書いていくことにしましょう。
目的
研究室で開発したソフトウェアを宣伝したい。そのためには,検索エンジンで目立つことが1つの対策だ。目立つためにmicrodataを使ってみよう。
目立つってどういうこと?
こういうことです。
あ,LINEなんてもう超有名なんだから宣伝する必要が無いって?いやいや,これを我々の開発してるソフトウェアでもやってしまいましょうということです。
調査
どんなページ?
調査から入りましょう。 先ほどのヒットをクリックするとこんなかんじで,普通のソフトウェアの紹介ページです。
コードを拝見
このように☆が検索結果にあるページというのは,なんらかのメタデータが埋め込まれているか,超大手のサイトで検索エンジンのクローラーが,勝手に構造を解釈しているかのどちらかです(まおりんしらべ)。さあ,コードを見てみましょう。
ちょっと小さくて見にくい感じですが‥ありました!"itemscope" microdataは"itemtype"と"itemscope"と"itemprop"で大抵の場合,構成されているので,それらが見つかればmicrodataでマークアップされていると考えていただいて問題ないです。 さて,このgoogleのページ : リッチ スニペット - ソフトウェア アプリケーション を見ると,色々とデータをマークアップして,メタデータを付与できるのことが分かります。しかしながら,全部入れるのは少々面倒ですし,検索結果にきれいに反映されないとせっかくやったのに(´Д⊂グスンということになるので,今回は拾ってきてくれそうなものだけに着目することにしましょう。
ピックアップ
必要なのは,上記画像の★★★☆☆評価:3 部分と68票,無料,Androidの部分です。 何のitempropを使用しているか,調べるために 構造化データ テストツールを使います。もう既にmicrodataによるマークアップが完了しているウェブページの場合,ここのURLに記入し,プレビューを押せばOKです。さきほど参照したサイトだと,このようにデータが表示されます。一部抜粋↓
マークアップされているタグを探していこう。
こちらのデータを参照すると,
<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 より
グラフっ
評価の部分は入れ子になっていることがわかると思います。
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でマークアップします。ご期待くださいっ