データベースの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" .
のようなエントリ内の項目単位のトリプルも可能になります。