データベースのRDF化
提供:TogoWiki
ショートカット: /mw/index.php/BH10.10
目次 |
参加者
- 金城玲 (PDBj)
- 村上勝彦 (JBiC)
開始前の状況
PDBj と H-inv DBのRDF化
PDBj に関してはほぼ出来上がっている。
H-inv DBはこれから調べて考える。
やるべきことのリスト
- OWL でオントロジーを定義する
- データベースのデータをRDFに変換する。
- RDF store にデータをロードする。
- 適当なクエリを投げてみる。
以上。
PDBj の場合
- PDBMLのスキーマ pdbx-v32.xsd がある。
- スタイルシートを作って、pdbx-v32.xsd から pdbx-v32.owl (OWLオントロジー)を作る。
- pdbx-v32.xsd -> (pdbx2owl.xsl) -> pdbx-v32.owl
- スタイルシートを作って、pdbx-v32.xsd から RDFをつくるためのスタイルシートを作る。
- pdbx-v32.xsd -> (pdbx2pdbml2rdf.xsl) -> PDBML2rdf.xsl
- 前段階で生成されたスタイルシートをつかって、PDBMLをRDFに変換する。
- 1gof.xml (一例) -> (PDBML2rdf.xsl) -> 1gof.rdf
H-invDB の場合
- XML スキーマがないので、手でOWLオントロジーを書く必要がある?
- とりあえず、HIPのXMLファイルを直接RDFに変換するXSLを書くことにする。
Use case
H-invDBとPDBをつないで面白いクエリを作る。
- ある染色体領域にコードされている蛋白質でで構造が決定されているものをリストする。
- あるいはその逆。
ちょっとした注意点
- H-invDBではPDBのIDがchain IDやSCOPのドメイン IDを連結して書かれている(例:1a00A, 2bduA1など)。これは困る。
- H-invDBのXMLにはバグがある。特殊文字がエスケープされていない。"&" とか "<" とか ">" とか"<gamma>" がある。
SPARQL クエリの例
H-invDB のとある染色体領域(CHROMOSOME-BAND)にある蛋白質でPDBエントリが存在するものを探して、PDBのアノテーションと一緒に列挙する
prefix PDBo: <http://www.pdbj.org/schema/pdbx-v32.owl#> prefix Hinv: <http://hinv.jp/hinv.owl#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> select ?band ?pdbid ?title where { ?s Hinv:CHROMOSOME-BAND ?band . ?s Hinv:STRUCTURE_DB-REFERENCE_PDB ?pdbid . ?pdbidU rdfs:sameAs ?pdbid . ?pdbidU PDBo:structCategory ?struct . ?struct PDBo:struct.title ?title . }
21番染色体上にある構造既知蛋白質
prefix PDBo: <http://www.pdbj.org/schema/pdbx-v32.owl#> prefix Hinv: <http://hinv.jp/hinv.owl#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> select ?s ?band ?pdbidU ?title where { ?s Hinv:CHROMOSOME-NUMBER '21' . ?s Hinv:CHROMOSOME-BAND ?band . ?s Hinv:STRUCTURE_DB-REFERENCE_PDB ?pdbid . ?pdbidU rdfs:sameAs ?pdbid . ?pdbidU PDBo:structCategory ?struct . ?struct PDBo:struct.title ?title . }
各染色体上にある酵素の種類と数
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix PDBo: <http://www.pdbj.org/schema/pdbx-v32.owl#> prefix Hinv: <http://hinv.jp/hinv.owl#> select ?cn ?ec count(*) where { ?s Hinv:CHROMOSOME-NUMBER ?cn . ?s Hinv:STRUCTURE_DB-REFERENCE_PDB ?pdbid . ?pdbidU rdfs:sameAs ?pdbid . ?pdbidU PDBo:entityCategory ?entity . ?entity PDBo:link_to_enzyme ?ec . } group by ?cn ?ec order by ?cn ?ec
解像度が2.0Åより良い構造が解けている蛋白質とそれが存在する染色体領域
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> prefix PDBo: <http://www.pdbj.org/schema/pdbx-v32.owl#> prefix Hinv: <http://hinv.jp/hinv.owl#> select ?cn ?s ?pdb ?res { ?s Hinv:CHROMOSOME-NUMBER ?cn . ?s Hinv:STRUCTURE_DB-REFERENCE_PDB ?pdb . ?pdbU rdfs:sameAs ?pdb . ?pdbU PDBo:refineCategory ?refine . ?refine PDBo:refine.ls_d_res_high ?res . FILTER(xsd:decimal(?res) < xsd:decimal(2.0)) } order by ?cn xsd:decimal(?res)
- FILTER中で数値を比較する際、xsd:decimal に注意!
- order by の挙動が変?
脳で発現している構造既知の酵素
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix PDBo: <http://www.pdbj.org/schema/pdbx-v32.owl#> prefix Hinv: <http://hinv.jp/hinv.owl#> select ?s ?cn ?tissue ?pdbid ?ec where { ?s Hinv:CHROMOSOME-NUMBER ?cn . ?s Hinv:TISSUE-TYPE-ORIGIN_ORIGINAL ?tissue . FILTER regex(?tissue, "brain") ?s Hinv:STRUCTURE_DB-REFERENCE_PDB ?pdbid . ?pdbidU rdfs:sameAs ?pdbid . ?pdbidU PDBo:entityCategory ?entity . ?entity PDBo:link_to_enzyme ?ec . }
結果
- H-invDB の蛋白質データの一部 XPROTEIN_1 をとってきた。
- XPROTEIN_1 のバグを取った。
- XPROTEIN_1 全部のデータ(50000件)をロードした場合は transaction time out で結果が得られず。
- XPROTEIN_1 の一部(1264件)をロードした。それに含まれるPDBエントリは574エントリ。
- この程度は楽に検索できる。
- 次の日に、より多くのデータをロードしてみた。H-invDB→2539エントリ、PDB→1017エントリ。これでも一瞬で検索できる。
参考文献
- セマンティック・ウェブのためのRDF/OWL入門 神崎 正英 (著)
- RDFとOWLの分かりやすい説明。
- Semantic Web for the Working Ontologist: Effective Modeling in RDFS and OWL Dean Allemang (著), James Hendler (著)
- セマンティックWeb プログラミング Toby Segaran (著), Colin Evans (著), Jamie Taylor (著),
- より実践的な解説
- 記述論理とWebオントロジー言語 兼岩 憲 (著)
- 理論的背景
- Database Systems: The Complete Book (2nd Edition) Hector Garcia-Molina (著), Jeffrey D. Ullman (著), Jennifer Widom (著)
- データベースとXMLの関係、マッピングの仕方
付録
H-invDB のHIPのXMLをRDFに変換するスタイルシート(一部アイテムのみ対応)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:PDBx="http://pdbml.pdb.org/schema/pdbx-v32.xsd" xmlns:Hinv="http://hinv.jp/hinv.owl#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" > <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/H-Inv"> <rdf:RDF> <xsl:apply-templates/> </rdf:RDF> </xsl:template> <xsl:template match="HIP"> <rdf:Description rdf:about="http://www.h-invitational.jp/hinv/protein/protein_view.cgi?hip_id={H-INVITATIONAL-PROTEIN-ID}"> <xsl:apply-templates/> </rdf:Description> </xsl:template> <xsl:template match="H-INVITATIONAL-PROTEIN-ID"> <Hinv:H-INVITATIONAL-PROTEIN-ID> <xsl:value-of select="."/> </Hinv:H-INVITATIONAL-PROTEIN-ID> </xsl:template> <xsl:template match="H-INVITATIONAL-ID"> <Hinv:H-INVITATIONAL-ID> http://www.h-invitational.jp/hinv/spsoup/transcript_view?hit_id=<xsl:value-of select="."/> </Hinv:H-INVITATIONAL-ID> </xsl:template> <xsl:template match="CLUSTER-ID"> <Hinv:CLUSTER-ID> http://www.h-invitational.jp/hinv/spsoup/locus_view?hix_id=<xsl:value-of select="."/> </Hinv:CLUSTER-ID> </xsl:template> <xsl:template match="CDNA_DB-REFERENCE_ENSEMBL"> <Hinv:CDNA_DB-REFERENCE_ENSEMBL> http://www.ensembl.org/Homo_sapiens/Transcript/Transcript?t=<xsl:value-of select="."/> </Hinv:CDNA_DB-REFERENCE_ENSEMBL> </xsl:template> <xsl:template match="CDNA_DB-REFERENCE_UNIPROT-PROTEIN-ID"> <Hinv:CDNA_DB-REFERENCE_UNIPROT-PROTEIN-ID> http://purl.uniprot.org/uniprot/<xsl:value-of select="."/> </Hinv:CDNA_DB-REFERENCE_UNIPROT-PROTEIN-ID> </xsl:template> <xsl:template match="CDNA_DB-REFERENCE_PUBMED"> <Hinv:CDNA_DB-REFERENCE_PUBMED> http://www.ncbi.nlm.nih.gov/pubmed/<xsl:value-of select="."/> </Hinv:CDNA_DB-REFERENCE_PUBMED> </xsl:template> <xsl:template match="CHROMOSOME-NUMBER"> <Hinv:CHROMOSOME-NUMBER> <xsl:value-of select="."/> </Hinv:CHROMOSOME-NUMBER> </xsl:template> <xsl:template match="CHROMOSOME-BAND"> <Hinv:CHROMOSOME-BAND> <xsl:value-of select="."/> </Hinv:CHROMOSOME-BAND> </xsl:template> <xsl:template match="STRUCTURE_DB-REFERENCE_PDB"> <Hinv:STRUCTURE_DB-REFERENCE_PDB rdf:resource="http://www.pdbj.org/xpath/{substring(.,1,4)}"/> </xsl:template> <xsl:template match="TISSUE-TYPE-ORIGIN_ORIGINAL"> <Hinv:TISSUE-TYPE-ORIGIN_ORIGINAL> <xsl:value-of select="."/> </Hinv:TISSUE-TYPE-ORIGIN_ORIGINAL> </xsl:template> <xsl:template match="*"> <xsl:apply-templates/> </xsl:template> <xsl:template match="text()"/> </xsl:stylesheet>
Virtuoso tips
データのロード
/tmp/kk.ttl にturtle formatのデータがあるとする。 "http://www.pdbj.org" という名前のグラフに三つ組みを 入れる。
isql 1111 dba dba <<EOF DB.DBA.TTLP_MT(file_to_string_output('/tmp/kk.ttl'), '' ,'http://www.pdbj.org',0); checkpoint; EOF
データの削除
"http://www.pdbj.org" という名前のグラフにあるデータをすべて削除する。
isql 1111 dba dba <<EOF sparql clear graph <http://www.pdbj.org>; EOF
まとめ
実際やったこと
- PDBjのRDFをつくるXSLを一部修正した。
- H-invDB (protein) のデータの一部をXMLからRDFに変換するXSLスタイルシートを作った。
- H-invDB (protein) の2539エントリとそれに対応するPDBエントリ (1017) を Virtuoso にロードした。
- いくつかのSPARQL クエリを試した。
苦労した点
- H-invDB の XML ファイルがvalidでなかった。(特殊文字のエスケープ)
- 全部のデータは8GBのメモリには載らないので、検索が"transaction time out" になってしまった。
それでも思ったよりすんなり検索のデモまでできた。
残された課題
- H-invDB のOWLオントロジーの定義、完全なRDF化
- 全データを実際にロードして検索を実行すること。
H-invDBのXML形式について(改良の要望)
- 何はともあれ特殊文字のエスケープ "&"→"&" "<" → "<" ">" → ">"
- H-invDB のXMLファイルには属性(attribute)がない。
- →データの項目のPrimary key に相当するようなアイテムは属性にすべき。
- その利点は、字面からどれがprimary key になるかが分かるので、各エントリのデータ項目毎にURIが定義できて、より細かい粒度のRDFトリプルが定義できて、その変換が簡単になること(XSLスタイルシートが規則的に書ける)。
RDBとXMLの関係については、上記参考文献中のDatabase Systems: The Complete Book を参照のこと。
案
H-invの実情を知らないので、ちょっとアレですが、たとえば、
<HIP> <H-INVITATIONAL-PROTEIN-ID>HIP000000308</H-INVITATIONAL-PROTEIN-ID> <H-INVITATIONAL-PROTEIN-ID-VERSION>HIP000000308.1</H-INVITATIONAL-PROTEIN-ID-VERSION> <DATE-LAST-UPDATE>16-Feb-2010</DATE-LAST-UPDATE> <DATE-LAST-MODIFIED>16-Feb-2010</DATE-LAST-MODIFIED> <CDNA_H-INV-DB-RELEASE>7.5</CDNA_H-INV-DB-RELEASE> <PROTEIN_DATE-LAST-UPDATE>16-Feb-2010</PROTEIN_DATE-LAST-UPDATE> <PROTEIN_DATE-LAST-MODIFIED>16-Feb-2010</PROTEIN_DATE-LAST-MODIFIED> <HIP-RELEASE>7.3</HIP-RELEASE> <REPRESENTATIVE> <H-INVITATIONAL-ID>HIT000036345</H-INVITATIONAL-ID> <H-INVITATIONAL-ID-VERSION>HIT000036345.16</H-INVITATIONAL-ID-VERSION> <CLUSTER-ID>HIX0013821</CLUSTER-ID> ....
となっているところを、
<HIP ID="HIP000000308"> <H-INVITATIONAL-PROTEIN-ID-VERSION>HIP000000308.1</H-INVITATIONAL-PROTEIN-ID-VERSION> <DATE-LAST-UPDATE>16-Feb-2010</DATE-LAST-UPDATE> <DATE-LAST-MODIFIED>16-Feb-2010</DATE-LAST-MODIFIED> <CDNA_H-INV-DB-RELEASE>7.5</CDNA_H-INV-DB-RELEASE> <PROTEIN_DATE-LAST-UPDATE>16-Feb-2010</PROTEIN_DATE-LAST-UPDATE> <PROTEIN_DATE-LAST-MODIFIED>16-Feb-2010</PROTEIN_DATE-LAST-MODIFIED> <HIP-RELEASE>7.3</HIP-RELEASE> <REPRESENTATIVE ID="HIT000036345"> <H-INVITATIONAL-ID-VERSION>HIT000036345.16</H-INVITATIONAL-ID-VERSION> <CLUSTER-ID>HIX0013821</CLUSTER-ID> ....
とするとか("HIP"タグと"REPRESENTATIVE"タグに注目)。 そうすると、たとえば、
- http://hinv.jp/protein/HIP000163250 (fake です)
のみならず、
みたいなURLがXMLデータの字面だけから推定できます。現状だと、XMLファイルの意味を人間が理解した上で、RDFやURLへの変換ルールを 書く必要があります。さらに、
<http://hinv.jp/protein/HIP000163250> <http://hinv.jp/hinv.owl#DATE-LAST-MODIFIED> "16-Feb-2010" .
のようなエントリ単位のトリプルのみならず、
<http://hinv.jp/protein/HIP000163250> <http://hinv.jp/hinv.owl#hasRepresentative> <http://hinv.jp/protein/HIP000163250/representative/HIT000036345> . <http://hinv.jp/protein/HIP000163250/representative/HIT000036345> <http://hinv.jp/hinv.owl#CLUSTER-ID> "HIX0013821" .
のようなエントリ内の項目単位のトリプルも可能になります。