データベースのRDF化

提供:TogoWiki

移動: 案内, 検索

ショートカット: http://wiki.lifesciencedb.jp/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 .
} 

結果

  1. H-invDB の蛋白質データの一部 XPROTEIN_1 をとってきた。
  2. XPROTEIN_1 のバグを取った。
  3. XPROTEIN_1 全部のデータ(50000件)をロードした場合は transaction time out で結果が得られず。
  4. XPROTEIN_1 の一部(1264件)をロードした。それに含まれるPDBエントリは574エントリ。
    • この程度は楽に検索できる。
    • 次の日に、より多くのデータをロードしてみた。H-invDB→2539エントリ、PDB→1017エントリ。これでも一瞬で検索できる。

参考文献

  1. セマンティック・ウェブのためのRDF/OWL入門 神崎 正英 (著)
    • RDFとOWLの分かりやすい説明。
  2. Semantic Web for the Working Ontologist: Effective Modeling in RDFS and OWL Dean Allemang (著), James Hendler (著)
  3. セマンティックWeb プログラミング Toby Segaran (著), Colin Evans (著), Jamie Taylor (著),
    • より実践的な解説
  4. 記述論理とWebオントロジー言語 兼岩 憲 (著)
    • 理論的背景
  5. 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

まとめ

実際やったこと

  1. PDBjのRDFをつくるXSLを一部修正した。
  2. H-invDB (protein) のデータの一部をXMLからRDFに変換するXSLスタイルシートを作った。
  3. H-invDB (protein) の2539エントリとそれに対応するPDBエントリ (1017) を Virtuoso にロードした。
  4. いくつかのSPARQL クエリを試した。

苦労した点

  • H-invDB の XML ファイルがvalidでなかった。(特殊文字のエスケープ)
  • 全部のデータは8GBのメモリには載らないので、検索が"transaction time out" になってしまった。

それでも思ったよりすんなり検索のデモまでできた。

残された課題

  • H-invDB のOWLオントロジーの定義、完全なRDF化
  • 全データを実際にロードして検索を実行すること。

H-invDBのXML形式について(改良の要望)

  • 何はともあれ特殊文字のエスケープ "&"→"&amp;" "<" → "&lt;" ">" → "&gt;"
  • 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"タグに注目)。 そうすると、たとえば、

のみならず、

みたいな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" .

のようなエントリ内の項目単位のトリプルも可能になります。

個人用ツール