maoring blog

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

希少疾病用医薬品・希少疾病用医療機器のデータをRDF化しよう。その6

日本語のデータをRDF化しよう。

基本的な手順は英語版の時と同じです。OpenRefineを使って,データを綺麗にし(下画像),Export→Templatingにて,json形式に出力します。

f:id:maoring:20130904161707p:plain

英語版の時と同様にprefixを入れ,以前に決めたpredicateを入れていったらOKです。

#!/usr/local/bin/ruby -Ku
require "json"
require "date"
fp_json = []
open("orphan_j.json",'r'){|fp|
 fp_json = JSON.parse(fp.read)
}
puts "@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix eob: <http://pashworth.org/orangebook#> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary/> .
@prefix drgn: <http://www.nibio.go.jp/drugVocabulary#> .
@prefix odrgn: <http://www.nibio.go.jp/orphanDrugVocabulary#> .
@prefix cc: <http://creativecommons.org/ns#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
"
puts

fp_json.each do |key,val|
    val.each_with_index do |column,i|
        print "<http://www.nibio.go.jp/orphanDrugTarget#"+ i.to_s + "> drgn:designationFiscalYear \""+ column["Column 1"].to_s + "\";\n"
        print " drgn:designationDate \"" + column["Column 2"].to_s + "\"^^xsd:date;\n";
        if column["Column 3"].nil?
           print " drgn:number \" \";\n"
        else
        print " drgn:number \"" + column["Column 3"] + "\";\n";
        end 
...中略
       if column["Column 8"].nil?
            print  "drgb:pharmacology \" \"; \n"
        else
        print " drgb:pharmacology \'\'\'" + column["Column 8"] + "\'\'\';\n";
        end 
...中略
        print " drgn:revocationDate \"" + column["Column 23"].to_s + "\"^^xsd:date;\n";
        print " drgn:status \"" + column["Column 24"].to_s + "\".\n";
puts
puts

            end 
end
puts "<http://www.nibio.go.jp/orphanDrug_j.ttl>
 dcterms:creator \"伊藤 真和吏 \" ;
 dcterms:publisher \"独立行政法人 医薬基盤研究所\" ;"
print(" dcterms:date \"",Date.today.to_s,"\"^^xsd:date ;\n")
puts " cc:license <http:\/\/creativecommons.org/licenses/by-sa/3.0> ."

このような形で,書いていけばOKです。
なお,print " drgb:pharmacology \'\'\'" + column["Column 8"] + "\'\'\';\n";の部分ですが,記述が複数行にわたり,改行が必要な場合には,シングルクオテーション*3をすることが必要のようです。(そうしないと上手く,SPARQLで調べられませんでした…参考 Turtle literals←Thanks to @32nmさん!!
実行結果はこのようになります。日本語だと,なんかより親しみが持てる感じがします(私だけ?)

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix eob: <http://pashworth.org/orangebook#> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary/> .
@prefix drgn: <http://www.nibio.go.jp/drugVocabulary#> .
@prefix odrgn: <http://www.nibio.go.jp/orphanDrugVocabulary#> .
@prefix cc: <http://creativecommons.org/ns#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix db: <http://dbpedia.org/ontology/> .

<http://www.nibio.go.jp/orphanDrugTarget#1> drgn:designationFiscalYear "1993";
 drgn:designationDate "1993-11-15"^^xsd:date;
 drgn:number "(5薬B)第2号";
 drgn:grantPeriod "";
 drgb:name " ";
 dc:description "ゴーシェ病Ⅰ型患者の諸症状(貧血・血小板減少症、肝脾腫等)の改善";
 drgn:designationApplicant "ジェンザイム・ジャパン㈱";
 drgb:pharmacology '''ゴーシェ病Ⅰ型患者の諸症状(貧血、血小板減少症、肝脾腫及び骨症状)の改善''';
 drgb:manufacturer "ジェンザイム・ジャパン㈱";
 eob:approvalDate "1996-07-10"^^xsd:date;
 drgb:product "セレデース注50U";
 drgb:product "セレデース注400U";
 drgb:brand " ";
 drgn:HOT9 " ";
 drgn:approvedNameDrugPackageJ " ";
 drgn:approvedNameDrugPackage " ";
 drgn:JSCC " ";
 drgn:CODE106 " ";
 drgn:approvedName "";
 drgn:approvedNameJ "";
 drgn:CASNumber " ";
 drgn:clinicalTrialNumber " ";
 rdfs:comment "これらの2製剤については現在、供給されていませんが、代わりに指定番号(8薬)第81号の製剤が供給されています。";
 drgn:revocationDate ""^^xsd:date;
 drgn:status "承認".
 drgn:specifiedDiseaseNumber " ";
・・・中略
<http://www.nibio.go.jp/orphanDrug_j.ttl>
 dcterms:creator "伊藤 真和吏 " ;
 dcterms:publisher "独立行政法人 医薬基盤研究所" ;
 dcterms:date "2013-09-04"^^xsd:date ;
 cc:license <http://creativecommons.org/licenses/by-sa/3.0> .

これでデータのRDF化がひと通り完成しました。バンザーイ。
(後で補足はするかもしれません。)

次回予告

せっかく,データをRDF化したので,次回はこれらのデータを使って,SPARQLでのクエリを投げてみましょうか(予定は未定,ちょっと遅くなるかもです。)SPARQLのクエリを投げると,より口語的な表現で,データを得ることが出来るようになります。ここがRDFの醍醐味の1つ,でもあるかもしれません。乞うご期待ください☆

希少疾病用医薬品・希少疾病用医療機器のデータをRDF化しよう。その5

いやはや長期連載になりそうですね。いつか,誰かの役に立つことを信じて,今日も記事を書いていくことにしましょう。
※自己流の部分もあるので,間違いがありましたら,ご指摘頂けますと大変ありがたいですʕ•ᴥ•ʔ

ライセンス情報を記録しよう。

これから書くことは,データを動かすという意味では必須ではありません。ただ,今後のことを考えると,書いてあったほうがよいに違いないと思われるので,参考までに書いていきます。誰がそのデータを書いて,どこで作られていて,どの程度自由に使えるのか,明示されていたほうが,公開する側にもデータを得る側にもメリットが多いと考えるからです。

prefixを増やすぞ。

ライセンス情報の記述と所属等を記述するために,prefixを追加していきます。

puts "@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix eob: <http://pashworth.org/orangebook#> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary> .
@prefix drgn: <http://www.nibio.go.jp/drugVocabulary#> .
@prefix odrgn: <http://www.nibio.go.jp/orphanDrugVocabulary#> .
@prefix cc: <http://creativecommons.org/ns#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
"

ccとdctermsが追加事項です。 前回書いたttlに追加する形で,下に追加します。(下が良いという明確なルールがあるわけではありません。)
rubyのプログラム

puts "<http://www.nibio.go.jp/orphanDrug.ttl>
 dcterms:creator \"Maori Ito \" ;
 dcterms:publisher \"National Institute of Biomedical Innovation\" ;"
print(" dcterms:date \"",Date.today.to_s,"\"^^xsd:date ;\n")
puts " cc:license <http:\/\/creativecommons.org/licenses/by-sa/3.0> ."

↓実行結果

<http://www.nibio.go.jp/orphanDrug.ttl>
 dcterms:creator "Maori Ito " ;
 dcterms:publisher "National Institute of Biomedical Innovation" ;
 dcterms:date "2013-09-03"^^xsd:date ;
 cc:license <http://creativecommons.org/licenses/by-sa/3.0> .

今回作成するドキュメントがorphanDrug.ttlだったとし,その作者や制作元,いつ作られたのか,そして著作権について記述しています。
今回,creatorやpublisherはテキストにしてしまいましたが,例えば,"Maori Ito" の部分は<http://www.nibio.go.jp/people/maori-ito.rdf>等とし,そこに私自身の説明を記述したり,publisherの"National Institute of Biomedical Innovation"の部分は<http://www.nibio.go.jp/organisation.rdf>等とし,そこにこの機関の説明を記述するとよりよいかもしれません。日付はデータを作成した日を入れます。(ここで今日の日付を入れられるのはプログラムの良い所かもしれませんね?)また,日付であることを明記するために,xml形式由来のデータ型^^xsd:dateを日付の後に付け加えています。
そして,ライセンスがどうであるのかというのことを,http://creativecommons.org/licenses/by-sa/3.0で指定しています。もちろん,ここの"3.0"の部分は,あなたの公開状況によって変更して構いません。参照:About The Licenses
さて,短いですが,英語版はこれで一区切りです。お次は日本語版といきましょう。

希少疾病用医薬品・希少疾病用医療機器のデータをRDF化しよう。その4

もとのデータをきれいにしよう。

さて,前回までの日記であらかた書くべきデータが揃いました。今回は実装編です。まず,手持ちのデータを綺麗にします。もともとはエクセルファイルのこのようなデータなのですが,ここから,まずは英語版だけピックアップして整理し,プログラムで利用しやすい形式にします。 この整理には,OpenRefine (Google Refine)を利用します。ダウンロードはこちらからどうぞ。Create Projectからファイルをアップロードします。そうすると,表形式にデータを表示してくれますので,Project nameをつけ,Project作成です。

f:id:maoring:20130828123920p:plain

もし,ここで汚いデータ等ありましたら,Open Refineの機能で,綺麗にしていくことも出来るので,OpenRefineのページの動画等を参照にして取り組んでみてください。また,このOpenRefineでは,拡張を行うとRDFの出力を行うことできます。OpenRefineでのRDFの拡張と簡単な実装方法については,こちらのブログ - 週末京都 Google RefineによるRDFデータへの変換 をご参照ください。もとのデータ数が多くなかったり,1つの欄の中での分割が必要でない場合にはこちらでも,十分に対応できます。特に,既に汎用されている語(Predicate 後ほど説明します)が多い場合には,(RDFの拡張をした後)RDF▼→ RDF Schema Alignment → RDF Skeltonで列ごとにprefix(後ほど説明します)を利用してpredicateを付けることが出来るので,便利です。

f:id:maoring:20130828124945p:plain

今回の場合,1つの欄の中での分割が必要だったり,オリジナルのpredicateを使いたかったので,OpenRefineでのRDF化は採用しないことにしました。

JSONからRDFを作ろう。

OpenRefineによるJSONの出力

当初はtxtファイルかcsvファイルに落としこんで,プログラムによる処理をしようと思っていたのですが,空欄と欄内の改行のせいで,なかなかうまくいかなかったので,今回はJSONを採用します。 先ほどのOpenRefineのExport▼→ Templating からJSON形式のデータをダウンロードすることができます。

f:id:maoring:20130828125354p:plain

Exportして名前(例:OOOO.json)をつけ,保存します。

まずはprefix!

RDFを記述するためのフォーマットは幾つかあるのですが,今回はttl(Turtle形式)で実装したいと思います。

Turtle の書き方

RDFは三組でグラフを書いていくものですが,幾つかの記述方式(RDF/XML,N-Triples等)があります。その中でも,簡潔な書き方で人にも読みやすい書き方として汎用されているのが,このTurtle形式です。 Wikipediaの例)を用いて,みていくことにしましょう。

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix ex: <http://example.org/stuff/1.0/> .

<http://www.w3.org/TR/rdf-syntax-grammar>
  dc:title "RDF/XML Syntax Specification (Revised)" ;
  ex:editor [
    ex:fullname "Dave Beckett";
    ex:homePage <http://purl.org/net/dajobe/>
  ] .

このように,最初にprefix,つまり接頭辞を書いて,これからrdfと書くのは, http://www.w3.org/1999/02/22-rdf-syntax-ns#のことですよ, dcと書くのは,http://purl.org/dc/elements/1.1/のことですよ…,という宣言をします。 実際に,それらのサイトに行くと,用語体系がダウンロード出来たり,用語体系の説明が書かれていたりします(無いことも結構あるけど,本来はあるとよいもの)。何故,こんなことをするのかということですが,出来るだけ,統一された用語体系で書かれていたほうが,後々データを繋げたり,同じ意味のデータを取り出すのに便利だからです。 直感的に理解するなら,辞書,と考えてもらえると良いかもしれません。日本語とフランス語と英語が混在しているページがあって,しかも,超専門的な分野のことが書かれていたならば,これから使う語の意味は,英語の糖鎖生物学の辞書に載っているものです。と書かれていたならば,その辞書を参照すれば,明確な意味が分かる,というようなイメージです。(厳密には,それらの用語同士の関係性が集合論的に書かれていることもあるので,その限りではありません(^_^;))

さて,中身も見ていきましょう。 <http://www.w3.org/TR/rdf-syntax-grammar>はSubject,つまり主語にあたります。 これから言うのは,<http://www.w3.org/TR/rdf-syntax-grammar>についてです,ということを示しています。 次に dc:titleというのは,dcという用語体系の中でtitleであるのは,というPredicate,すなわち述語にあたり,"RDF/XML Syntax Specification (Revised)"はObject,すなわち目的語にあたります。日本語にすると <http://www.w3.org/TR/rdf-syntax-grammar> のタイトルは "RDF/XML Syntax Specification (Revised)"
といった感じです。まだ途中なので,";"で続けて(主語は<http://www.w3.org/TR/rdf-syntax-grammar> のまま。次は, ex:editorでexの用語の中の編集者をこれから書きますよという意味です。[ ex:fullname "Dave Beckett"; ex:homePage <http://purl.org/net/dajobe/> ] . []を使用することでまとめて記述していますが,編集者について,さらに説明していて ex:fullnamefullnameは"Dave Backett"で,homePageは”http://purl.org/net/dajobe/”であるということを示しています。以上をグラフにするとこのようになります。RDFグラフの視覚化 Turtle, Microdata, JSON-LDからグラフを書きました。

f:id:maoring:20130828162320p:plain

主語が<http://www.w3.org/TR/rdf-syntax-grammar>であり,そのタイトルと,編集者について書かれていることが,グラフによって示されていることがお分かりになるでしょうか。なお,薄青色のノード(楕円)は空白ノードといって,そこのノード自体には,意味は無いのですが,分岐がさらに続いたり,毎回predicateを書くことを省略したり,複雑なグラフを書く時に便利なので,よく用いられるものです。

手持ちのデータにもprefixをつけよう。

基本的には,使う用語のprefixだけで大丈夫です。そして,今回オレオレ(独自に)定義した語彙についてもprefixをつけました。こんな感じで最初に宣言をしていきます。

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix eob: <http://pashworth.org/orangebook#> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary> .
@prefix drgn: <http://www.nibio.go.jp/drugVocabulary#> .
@prefix odrgn: <http://www.nibio.go.jp/orphanDrugVocabulary#> .

前々回探しだした語彙についても,@prefix eob: http://pashworth.org/orangebook# . @prefix drgb: http://bio2rdf.org/drugbank_vocabulary . として記述しています。本当は汎用的なprefix名があるはずなのですが,(その上の dc , rdfsなどと同様に)見つからなかったので,このような記述にしています。

また,ここで独自に定義する語彙についてですが,URIの設計上の注意があり,基本的には303リダイレクトを使う方法とハッシュURIを使う方法があるようなのですが(参考:Linked Data: Webをグローバルなデータ空間にする仕組み)ここでは,ハッシュ”#"を使い,http://www.nibio.go.jp/drugVocabulary#としています。また,predicateの記述の方法も幾つかあるのですが,ここでは,ローワーキャメルケース(複合語の先頭を小文字で書き始め,2個目以降の単語の先頭を大文字で書く)方法を採用しています。

RubyによるJSONの処理

今回は,OpenRefineでJSONで出力したので,JSONから処理していきます。今回はrubyを使って,JSONのパースを行っていきます。もとのJSONのデータはこんな感じです。

{
  "rows" : [
    {    
      "Column 1" : 1993,
      "Column 2" : "1993/11/15",
      "Column 3" : "1993/11/15",
      "Column 4" : "(5yaku A) No. 1",
      "Column 5" : 2, 
      "Column 6" : "Mixture of L-arginine and L-arginine hydrochloride granules; L-arginine hydrochloride injectable",
      "Column 7" : "The granule form improves the neurological symptoms due to hyperammonaemia, of vomiting, lethargy and abnormal electroencephalogram, and the other symp
      "Column 8" : "Roussel Morishita Company, Limited",
      "Column 9" : "<Granule>\nInhibition of rising blood level of ammonia in the following diseases: congenital urea cycle enzyme abnormalities - carbamyl phosphate synth
      "Column 10" : "Ajinomoto Co. Inc.",
      "Column 11" : "1999/9/22",
      "Column 12" : "1999/9/22",
      "Column 13" : "Argi-U Granule\nArgi-U Injection 20g",
      "Column 14" : "Argi-U_ Granule\nArgi-U_ Injection",
      "Column 15" : "L-Arginine Hydrochloride, L-Arginine\nL-Arginine Hydrochloride",
      "Column 16" : null,
      "Column 17" : null,
      "Column 18" : "Approved"
    },   
    {    
      "Column 1" : 1993,
      "Column 2" : "1993/11/15",
      "Column 3" : "1993/11/15",
      "Column 4" : "(5yaku B) No. 2",
      "Column 5" : null,
      "Column 6" : "Alglucerase",
      "Column 7" : "Improvement of the following symptoms in patients with Gaucher's disease type I: anaemia, thrombocytopenia, and hepatosplenomegaly.",
      "Column 8" : "Genzyme Japan K.K.",
      "Column 9" : "Improvement of the following symptoms in patients with Gaucher's disease type I: anaemia, thrombocytopenia, hepatosplenomegaly and other symptoms in bo
      "Column 10" : "Genzyme Japan K.K."
…
}
]
}

rubyの1.9以降には標準ライブラリにJSONのライブラリが入っているため,簡単にパースをしていくことができます。 例

require "json"
fp_json = []
open("originalOrphane.json",'r'){|fp|
 fp_json = JSON.parse(fp.read)
}
fp_json.each do |key,val|
    val.each_with_index do |column,i|
    puts column["Column 1"]
end
end

これだけで,先ほどのJSON形式のファイルにおけるColumn 1の年号がずらずらと出てきてくれます。

RDFを作っちゃうぞ。

ここまで出来てしまうと後は実は簡単です。prefixさんを上の方で宣言して,既に使用することを決めたpredicateさん達(前に書いた記事 や,こちらのGoogle Document をご参照ください)を当てはめて,書いていきます。そう,こんな感じに。

require "json"
fp_json = []
open("originalOrphane.json",'r'){|fp|
 fp_json = JSON.parse(fp.read)
}
puts "@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix eob: <http://pashworth.org/orangebook#> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary> .
@prefix drgn: <http://www.nibio.go.jp/drugVocabulary#> .
@prefix odrgn: <http://www.nibio.go.jp/orphanDrugVocabulary#> .
"
puts

fp_json.each do |key,val|
    val.each_with_index do |column,i|
        print "<http://www.nibio.go.jp/orphandrugTarget#"+ i.to_s + "> drgn:designationFiscalYear \""+ column["Column 1"].to_s + "\";\n"
        print " drgn:designationDateJapaneseEra \"" + column["Column 2"].to_s + "\";\n";
        print " drgn:designationDate \"" + column["Column 3"].to_s + "\";\n";
        print " drgn:number \"" + column["Column 4"] + "\";\n";
        print " drgn:grantPeriod \"" + column["Column 5"].to_s + "\";\n";
        print " drgb:name \"" + column["Column 6"] + "\";\n";
        print " dc:description \"" + column["Column 7"] + "\";\n";
        print " drgn:designationApplicant \"" + column["Column 8"] + "\";\n";
        print " drgb:pharmacology \"" + column["Column 9"] + "\";\n";
        print " drgb:manufacturer \"" + column["Column 10"].to_s + "\";\n";
        print " eob:approvalDateJ \"" + column["Column 11"].to_s + "\";\n";
        print " eob:approvalDate \"" + column["Column 12"].to_s + "\";\n";
        print " drgb:product \"" + column["Column 13"].to_s + "\";\n";
        print " drgb:brand \"" + column["Column 14"].to_s + "\";\n";
        print " drgn:approvedName \"" + column["Column 15"].to_s + "\";\n";
        print " rdfs:comment \"" + column["Column 16"].to_s + "\";\n";
        print " drgn:revocationDate \"" + column["Column 17"].to_s + "\";\n";
        print " drgn:status \"" + column["Column 18"].to_s + "\".\n";
#最後は” ; ”ではなく,” . ” で主語に区切りをつける。
        puts
     end 
end
出力結果

出力すると,こんな感じになります。

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix eob: <http://pashworth.org/orangebook#> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary> .
@prefix drgn: <http://www.nibio.go.jp/drugVocabulary#> .
@prefix odrgn: <http://www.nibio.go.jp/orphanDrugVocabulary#> .

<http://www.nibio.go.jp/orphandrugTarget#1> drgn:designationFiscalYear "1993";
 drgn:designationDateJapaneseEra "1993/11/15";
 drgn:designationDate "1993/11/15";
 drgn:number "(5yaku B) No. 2";
 drgn:grantPeriod "";
 drgb:name "Alglucerase";
 dc:description "Improvement of the following symptoms in patients with Gaucher's disease type I: anaemia, thrombocytopenia, and hepatosplenomegaly.";
 drgn:designationApplicant "Genzyme Japan K.K.";
 drgb:pharmacology "Improvement of the following symptoms in patients with Gaucher's disease type I: anaemia, thrombocytopenia, hepatosplenomegaly and other symptoms in bo
 drgb:manufacturer "Genzyme Japan K.K.";
 eob:approvalDateJ "1996/7/10";
 eob:approvalDate "1996/7/10";
 drgb:product "Ceredase injection 50U
Ceredase injection 400U";
 drgb:brand "−"; 
 drgn:approvedName "−"; 
 rdfs:revocationDate "";
 drgn:comment "These two formulations are currently being supplied. Designation number “Drug 8 No. 81” is being supplied instead. ";
 drgn:status "Approved".

大分,いい感じになってきました。 これで,完成!と言いたいところですが,ちょっと手直しをしていきます。

分岐するデータを記述する。

ここで,RDF化しているデータは,もとはエクセル形式のデータのです。ただ,同じ希少疾病用医薬品であっても,商品化されているものは,2つあったり,ということがありえます。そんな時に,私の手持ちのデータでは,

Approved product name for manufacture and sale
Argi-U Granule¥n Argi-U Injection 20g

のように,改行があるデータがありました。こういうものがあるときは,グラフ化したデータの方が扱いやすくなるわけですが,プログラムで処理をしていきます。なんてもったいぶって書きましたが,実にシンプルです。

#一部を抜粋しています。
        if  column["Column 13"].nil? #nilだったら
            print " drgb:product \" \";\n" #データが無いことを示す。
        elsif 
            column["Column 13"].include?("\n") #改行があったら
            column13 = column["Column 13"].split("\n") #改行ごとに分割
            column13.each do |value| #1つずつ出力。
            print " drgb:product \"" + value + "\";\n";
            end 
        else
            print " drgb:product \"" + column["Column 13"].to_s + "\";\n";
        end 

出力結果(抜粋)

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix eob: <http://pashworth.org/orangebook#> .
@prefix drgb: <http://bio2rdf.org/drugbank_vocabulary> .
@prefix drgn: <http://www.nibio.go.jp/drugVocabulary#> .
@prefix odrgn: <http://www.nibio.go.jp/orphanDrugVocabulary#> .

<http://www.nibio.go.jp/orphandrugTarget#1> drgn:designationFiscalYear "1993";
 drgn:designationDateJapaneseEra "1993/11/15";
 drgn:designationDate "1993/11/15";
 drgn:number "(5yaku B) No. 2";
 drgn:grantPeriod "";
 drgb:name "Alglucerase";
 dc:description "Improvement of the following symptoms in patients with Gaucher's disease type I: anaemia, thrombocytopenia, and hepatosplenomegaly.";
 drgn:designationApplicant "Genzyme Japan K.K.";
 drgb:pharmacology "Improvement of the following symptoms in patients with Gaucher's disease type I: anaemia, thrombocytopenia, hepatosplenomegaly and other symptoms in bones";
 drgb:manufacturer "Genzyme Japan K.K.";
 eob:approvalDateJ "1996/7/10";
 eob:approvalDate "1996/7/10";
 drgb:product "Ceredase injection 50U";
 drgb:product "Ceredase injection 400U";
 drgb:brand "−"; 
 drgn:approvedName "−"; 
 drgn:revocationDate "These two formulations are currently being supplied. Designation number “Drug 8 No. 81” is being supplied instead. ";
 rdfs:comment "";
 drgn:status "Approved".
正しいデータか確かめよう。

無事にデータが出来てきたところで,ちゃんと書けているかどうか,さっと確認します。 先ほどの神崎さんのツール(RDFグラフの視覚化 Turtle, Microdata, JSON-LD) を使い,出力データの一部をコピペして,グラフ化出来るか確認してみます。

f:id:maoring:20130829171855p:plain

うむ,(もう少しグラフであることを意識した記述のほうが良いかもしれないけれど)大丈夫そうです。先ほどのArgi-U Granule¥n Argi-U Injection 20gのようなデータもちゃんと別のObjectとして扱ってくれています。

もう一歩

ここから先は努力事項ですが,ライセンス事項についても書くと,後々のためになります。誰がそのデータを書いてそのライセンスがどうなのか,そのファイル自体に書かれていたら便利でしょ?長くなってしまったので,詳しくは後ほど。次回は,日本語のデータのRDF化についてのお話もしていきたいと思います。 ではでは,また,お会いしましょうっ☆(記事を書く日によってテンションが変わってしまうのを何とかしたい,maoringoでしたっ。)

希少疾病用医薬品・希少疾病用医療機器のデータをRDF化しよう。その3

前回の記事から大分時間が経ってしまった。そこからの進捗もあるので,まとめて報告することにしましょう。*取りかかりはじめたばかりなので,間違いがあったら,ご指摘大歓迎です。

OWLって何?

さて,前回の時点で,ある程度のPredicateをdrugbankから埋めることが出来て,やれやれとしていた所,強敵,OWLくんが登場しました。OWLって何?意味は神崎さんのページから引用させていただきましょう。

ウェブ・オントロジー言語に求められる共有性、発展性、相互運用性、矛盾の検出といった要件を満たすものとして、W3Cのワーキンググループで開発されているのが、OWLという言語です(Web Ontology Languageの略ならばWOLとなるはずですが、発音のしやすさと智恵の象徴フクロウと語呂合わせなどから、OWLという名前となった模様)。これは「用語・語彙とそこに含まれる各要素の関連の明確な表現」を目的としており、これまでに開発されてきたオントロジー言語[DAML+OIL]の改良版となっています。

とのことで,これだけだと,概念しか分からなかったので,本を読んだり,調べたりしたところ,RDFより厳密であり,書かれた語同士の論理的な関係(定義域,値域,階層関係,和集合・補集合等の論理演算子を使うような関係など)が記述出来る言語体系のようです。このOWLを使って,今私の手元にある希少疾病用医薬品・医療機器のデータを記述することも可能,みたいです。特に,このOWLは,新たな語彙を定義する際に,その語彙同士がどういう関係にあるのか,ということを書くために使われていることが多い印象があります。
何だか大変曖昧な物言いになってしまいましたが,厳密にデータをLOD化させたいなら,OWLも現実的な手段であり,特に,新たな語彙を設計する場合には有効な手段であるということです。 もう少し詳しい話は,こちらの本セマンティック・ウェブのためのRDF/OWL入門が参考になるかもしれません。検索しても色々と出てきます。ただ,概念的で,取っつきにくい感じではあります…。

既存のOWLのデータをどう使おうか?

もともとの問題に戻ります。FDAのデータをOWLで示してくれた方がいて,そのデータを今RDF化しているものに,どう取り入れようかという問題です。今の結論では,該当するpredicateだけ拝借する,だけです。(ごめんなさい。)実際のデータを見てみると,このように書かれているので,(以下抜粋)

<?xml version="1.0"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:eob="http://pashworth.org/orangebook#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xml:base="http://pashworth.org/orangebook/data" > 
  <rdf:Description rdf:about="http://pashworth.org/orangebook#drug-019107">
    <eob:nDANumber rdf:datatype="http://www.w3.org/2001/XMLSchema#string">019107</eob:nDANumber>
…中略
    <eob:approvalDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">1987-01-20</eob:approvalDate>

最初の "xmlns:eob="http://pashworth.org/orangebook#""と <eob:approvalDate rdf:datatype="http://www.w3.org/2001/XMLSchema#date">1987-01-20</eob:approvalDate> から,承認日ということを示すための,predicateを取り出し,http://pashworth.org/orangebook#approvalDate としてpredicate扱いすることにします。 ただ,この判断は,どこかの記事を見たわけではなく,独自の判断なので,もっと適切な書き方があるかもしれないですし,そもそも,あまり汎用的ではない既存の語彙体系を採用する意義があるのか,という問題もあります。

あとは,独自の語彙

日本の希少疾病用医薬品のための語彙,というものは,現在は 無さそうなので,"http://www.nibio.go.jp/drug_vocabulary:revocation-date"などと,語彙を考えて,どんどん書いていきます。厳密には,先ほどのOWLで語彙体系を設計して,既存のボキャブラリを公開しているページに入れたほうが良いようなのですが,まだまだ変更の可能性もあるため,今のところはオレオレで書いていきます。書いていった結果は,こちらのGoogle Documentからご覧いただけます。

さて,次回はいよいよRDF化します。ご期待あれ〜

希少疾病用医薬品・希少疾病用医療機器のデータをRDF化しよう。その2

さあ,RDF化しよう。

predicateを探せ。

では,どうやってRDF化をしていくのか,ということですが,まずは,グラフの点と点をつなぐ線に意味をつけていきます。この意味付けがとても大事で,オレオレで書くと,前回のエントリに書いたような話が通じん!てことが起こってしまうので,出来るだけ,世界共通語を探します。

どう探す?

とはいえ,RDF化初心者の私には,分からないことが多いので,いろいろ,聞いてまとめました

開始

まず,元データからサンプルを用意します。 markdownで書こうかと思ったのですが,見にくくなったので,Google Docsに置きます。
ここから見てね☆
参考にしたサイトは,以下のとおり,地道に,predicateはねーかー,当てはまりそうなのはねーかー,と探していきます。 drugbankで幾つか埋まりました。んー,あんまりぴったりこないのもある〜。 bio2rdfで公開されているdrugabankのデータ例:http://bio2rdf.org/page/drugbank_target:1056

他にも,DBpedia(例:http://dbpedia.org/page/HIV)や,bioportalも 見たのですが,しっくりこなくて,といった時に,FDA(アメリカ食品医薬品局)のデータをRDF化したったぜ,という[ブログを発見] (http://semantically-challenged.blogspot.jp/2010/02/fda-electronic-orange-book-in-rdf.html)。こっからダウンロード出来るぜ,(当然英語だから,ぜ,とか書いていませんが)と書いてあったのでダウンロードして,開いてみたら。Oh... OWL でござる。そしてよく見たら,orangebook(ジェネリック等一般的な医薬品についてまとめたページ→参照ジェネリック医薬品FAQ)のOWLだぜ。(続く)

希少疾病用医薬品・希少疾病用医療機器のデータをRDF化しよう。その1

はじめに

私が現在所属している医薬基盤研究所には希少疾病用医薬品・希少疾病用医療機器の開発の支援をしている部(研究振興部←もちろんその限りではない)がある。そこでは,希少疾病用医薬品・希少疾病用医療機器についての状況を把握し,それらのデータを管理している。
この一覧表に何が書いてあるのかというと,これらの医薬品はいつ認可がされたのか,助成期間がどのくらいなのか, 薬効は何か,指定を受けた会社はどこか,許可された販売者は何か,といったことが書かれている。
詳しくはこちら:希少疾病用医薬品指定品目一覧表希少疾病用医療機器指定品目一覧表

RDF化しよう

上記の表は定期的に(私の記憶が正しければ,3ヶ月に一度程度)更新されている。個人的には,重要なデータだと 思っているので,もっと活用できるように出来たら,と考えている。

どう活用するのか。

これらのデータを他の用途に使いたいと思った時に,現状では,htmlから無理やりcsvやExcel形式にして,利用するしか無い。そして,英語のデータも実はあるのだが,そもそも掲載されていない。それは,データを管理されている方が普段はプログラムを書かれるような方ではないというのと,ここでは,表になっているのだが,指定が取り消されたり,番号すら変更されたり,一つの指定品目が,別の疾患にも使えることが分かって分割されたり,見た目以上に複雑になっていくから,といった事情がある。(ノバルティスファーマの高血圧症治療薬の問題が最近取り沙汰されているが,一度認可された医薬品が,他の疾患にも使えるというのは,認可を出すことを考えても,現実的に売り出すことを考えても,メリットが大きいらしい。)まずは,何らかの形でもっと管理しやすい形にDB化,であろうが,それについては他の方にお任せしているので,とばすとして,私の方ではこれらのデータを,外部のデータと統合しやすい形(RDF)に変更しておこうということである。

何故活用したいのか。

何故,そんなことをするのか,ということだが,日本国外においては,化合物名や,薬,関連する研究や,関連する遺伝情報についてのRDF化が進んでいる。RDFについては,前回のエントリを参考にしていただくとして(もっといい説明をしたいのだけど,私も全容を把握しきれていないので,もう少し調査してから,きっと説明する(^_^;))この取組みが進むと,例えば,特定の化合物をピックアップした時に,それは,どの薬で使われているのか,どの国のどの会社で発売されているのか,その薬は世界中で,どのくらいの患者さんに使われているのか,最新の研究は何か,関連する論文は何か,ターゲットとなる遺伝子は何か,報告されている各国別の副作用は何か,などといった情報が一度に得られるようになる。現状では,一つ一つ調べるしかなかった統計的な情報等も,工夫次第で一度に得られるようになるわけだ。

で,具体的には,どうすんの?

RDF化されているデータについては,SPARQL というSQLチックなクエリー言語を用いると,欲しいデータをざざっと得られる。また,SPARQLや,他の手法を使って,繋げられたデータを得たり,活用しているウェブアプリケーションもポンポンと出てきているらしい。それについては,もう少し集まったら紹介するとして(←そんなのが多くてすまぬ。)今回はデータを提供する側として,RDF化を進めていきたいと思う。

ただ,この取組みを理想的に進めるとなると,それなりに骨が折れる。なぜかというと,それらのデータを綺麗につなげていく必要があるからだ。RDFの基本的な概念はグラフだ。そうだ,会話をイメージしよう。あなたが薬に詳しい日本人で,相手が薬に詳しい外国人だったとする。あなたの頭のなかには,その薬の化合物名,薬効,どの会社が出しているのか,現在販売されているのか,などなどといった超詳しい情報を持っていたとする。そして,同様の情報を外国人も持っていたとする。会話をする。そもそもある化合物名の外国名をあなたが知らなかったら,アウトだ。生真面目なコンピューターなら,なおさらアウトだ。ただ,この化合物が同一のものであることが分かり,あなたの頭の中の構造と相手の頭のなかの構造が超似ているとする。どちらかの言語が分かってしまえば,超話が通じる(きっと)。なんか,この例えは,図が無いとすごく辛いけど,頭のなかのグラフが似ていて,言語を統一してしまえば,かなりやりやすくなるというイメージはついた(と,思う。)

f:id:maoring:20130801173125p:plain

↑まさかの手書き(だって,PCで書くと時間かかるんだもん。そして,私の字の汚さが露呈する瞬間)

RDF化しよう

そんなこんなで,これらのデータをRDF化したいと思って,調査を開始している。我々のデータをRDF化すると,外国の希少疾病用医薬品についてRDF化していたり,それらの情報を得たいと思っている人に役に立つ。我々も頑張って工夫すれば,上記の質問を日本語で投げられるようになる。そのために身近なデータをRDF化していく。長くなったので続くっ。(このエントリはすぐ続きます!ごめんなさい。直感! microdata!! は,構成中です。)

OWLIM-Liteのインストール&設定方法 (Linux)

ものすごくざっくりとしたRDFの説明

世の中のデータを全部意味のあるグラフにしてしまえという,プロジェクトがあるのですが(乱暴かつ語弊あり)それを実現するための1つの手段としてデータのRDF化があります。(余裕があったら,理解したことをもう少し丁寧に書きます。)正しくRDFに出来ると,同じようにグラフ化されたデータと次々と繋がることが出来,壮大な意味のあるグラフが形成されます。ただ,それらのグラフを保存したり,取り出したりするための場所が必要で,それをRDFストアと言います。幾つか代表的なものがあるようで,最近良く使われているのはOWLIMとVirtuosoのようですが,今回はOWLIMをLinuxにインストールしてみましょう。

OWLIMをLinux にインストール

Tomcat 7をインストール

  • tomcat6との共存が必要だったため,一部修正しました。(2013-07-26)
    最初のOWLIMを動かすためのコンテナとしてApache Tomcat7が必要とのことなので,ozumaさんのページを参照に入れます。もう既に入っている場合には必要ありません。Javaのバージョン1.6以上が必要とのことなので,入っていない場合には,下記のサイトを参照に入れてください。←こういうの芋づる式にインストールが必要になって(*ノωノ) イヤンってなりますが,ファイトです!
    参照:(http://homepage1.nifty.com/y-osumi/works/code/tomcat7/)
    補足:もう既に,そちらの環境にTomcat 6等が入っているかもしれません。そんな場合は,
cd /etc/init.d
ls tomcat*

等でtomcatさんを探し(そこにいるとは限らないけど,多分,起動時に起動するように設定してあるはずなので,きっといる。〜といいなぁ)そこにある,tomcat関連のスクリプトをコピーして,tomcat7用に書き換えると良いかもしれません。確かめていませんが,ozmaさん方式でもきっといけるはずです。あ,既にあなたの3次元リアル環境に,以前tomcatを入れた方がいらしたら,彼or彼女に聞くのが早いかもしれませんっ 起動スクリプトをスタートさせます。

/etc/init.d/tomcat7 start

起動時&終了時にtomcat7の起動&終了が必要なら(きっと必要)

chkconfig --add tomcat7

等で追加します。 これでhttp://インストール先URL:8080で以下の画像のようにtomcatが起動出来れば,インストールOKです(≧∇≦)/

f:id:maoring:20130725144820p:plain

ちなみに,もう既に,8080番ポートが使用済みの場合には,
tomcatをインストールしたディクトリ/conf/sever.xml上で

  <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

等,8080から変更して,tomcatを再起動すれば,OKのようです。

OWLIM-Liteをダウンロード

この記事を今日見て,今日OWLIM-Liteインストールしたいと思っている皆さん!
残念なお知らせがあります。無理かもしれません。工エエェェ(´д`)ェェエエ工
OWLIMには,幾つかのタイプ(OWLIM-SE,OWLIM-Enterpriseなど)があって,OWLIM-Liteは無料版なのですが,事前にちょいとした審査をしているようで,申請する必要があります。ちょっとそれに時間がかかるので(どのくらいかかるのか忘れてしまったのですが,多分2日はかかっていなかったと思います。というわけで,”こちら”からご登録の上,メールの返信を気長に待って,ゲットしてください。しばらくすると,ダウンロードURLが記載されたメールが届くはずです。

tomcatのアプリにOWLIM-Liteのアプリを入れよう。

先ほどのダウンロードURLを使って任意のディレクトリ内でファイルをダウンロードします。解凍したファイル内のsesame_owlimフォルダ内にあるopenrdf-sesame.war & openrdfworkbench.warの2つのファイルをtomcatのwebappsフォルダにコピーします。 参考:Webインテリジェンス論 Linked Dataチュートリアル(インストール)

wget http:// http://download.ontotext.com/owlim/なにか/owlim-lite-5.3.6226.zip
unzip owlim-lite-5.3.6226.zip
cd owlim-lite-5.3.6226/sesame_owlim/
cp *.war /usr/local/tomcat/webapps/

一度,tomcatを止め,再度起動します。

/etc/init.d/tomcat7 stop
/etc/init.d/tomcat7 start

その後http://インストール先URL:8080/openrdf-workbench/で下の画像のように表示されれば,インストール完了です!お疲れさまでした!゚+.(◕ฺ ω◕ฺ )゚+.!!

f:id:maoring:20130725150143p:plain