SPARQLthon/pdbj query

提供:TogoWiki

移動: 案内, 検索

このページはPDBjのRDFに対してSPARQLを書くにあたってのヒントをOKBPが記述しています。 注:PDB/RDF作者には未確認のため内容に誤りがあるかもしれません

目次

PDB/RDFへのSPARQLの書き方

はじめに

  • PDB/RDFはRDF portalでエンドポイントが公開されているがスキーマ図がなくSPARQLが書きにくい
  • リソースの型(rdf:type)の種類は708個、predicateも2000種類以上あり、構造が複雑すぎるためスキーマ図は書けない模様(バージョン:release_20160706)
  • PDB/RDFはPDBMLからRDFDownload XSLTでRDF/XML形式に変換している XSLTダウンロードページ
  • PDBMLのスキーマに精通していればSPARQLは書きやすいはず。そうでない場合にはやや苦労するかも

predicateの見つけ方

PDB/RDFはPredicateの種類が非常に多く、Predicateを制するものがPDF/RDFを制すると言っても過言ではない(要確認) ということでPredicateの見つける方法をいくつか列挙する

PDBのページからpredicateを探す

PDBではRDFのデータを辿るためのWebページを設けている。 PDB/RDFページ
ここに任意のPDBエントリを入れてみると、そのエントリを表すURIのページが表示される。 例:1GOF
ページの「Subject」の欄に現在表示しているリソースのURIが表示され、そのリソースが持つ情報をテーブル(「Predicate」「Object」)で一覧表示している。
気になるPredicateがあり、その右のObjectがURIであれば、それをクリックする。 1GOFでPDBo:has_entityCategoryの値を選択したページ
選択したObjectのURIがSubjectとなるページに移動し、そのリソースが持つ「Predicate」「Object」が一覧で表示され、どんどん掘り下げて調べることができる。

ObjectがURIでなく数値やテキストであればそれ以上は掘り下げられない。もしそれが検索対象としたい値であればPDBエントリから辿ってきたPredicateでSPARQLを組み立てられる

SPARQLからpredicateを探す

件数調査クエリ

とりあえずどのぐらいのPDBエントリのデータがエンドポイントに含まれるのか調べる まず、RDF PortalのPDBページに記載されている一番目のSPARQLクエリ例では"PDBr:1GOF"というURIでPDBエントリの基本情報を取っているので、この"PDBr:1GOF"の型を調べる。結果から、PDBエントリを表すリソースURIはPDBo:datablock(←長いのでPrefix付きで表記)という型で表現されていることが推測される。

PREFIX PDBr: <http://rdf.wwpdb.org/pdb/>
PREFIX PDBo: <http://rdf.wwpdb.org/schema/pdbx-v40.owl#>

SELECT ?type
FROM <http://rdf.integbio.jp/dataset/pdbj>
WHERE {
  PDBr:1GOF a ?type
}

result
------
http://rdf.wwpdb.org/schema/pdbx-v40.owl#datablock

PDBエントリを表す型が分かったので、このエンドポイントに何個のPDBエントリが登録されているか調べてみる

PREFIX PDBr: <http://rdf.wwpdb.org/pdb/>
PREFIX PDBo: <http://rdf.wwpdb.org/schema/pdbx-v40.owl#>

SELECT (COUNT(?pdb_entry_uri) AS ?count)
FROM <http://rdf.integbio.jp/dataset/pdbj>
WHERE {
  ?pdb_entry_uri a PDBo:datablock 
}

result
------
108,539

RDFファイルからpredicateを探す

第一階層のCategoryを見ただけでは判断ができない場合、RDFファイルから探すという方法もある
例えば、分解能でPDBエントリをフィルタリングしたい場合を例に挙げる
エントリ1GOFの分解能をWebサイトで検索すると"1.7"という記述があるので、この"1.7"という記述がされている箇所をRDFから探す
RDFのデータは一括ダウンロードする他、各エントリページの"ダウンロード"タブから"RDF"を選択すれば1エントリのファイルが取得できる
ダウンロードしたファイルを解凍し、grepを書ければ、どこに記述があるか分かる

$ curl -o 1gof.rdf.gz http://rdf.wwpdb.org/download/1gof.rdf.gz
$ gunzip 1gof.rdf.gz
$ grep -n "1\.7" 1gof.rdf 

以下のようなgrep結果から"1.7"というデータとして記載されているのは37710行目の<PDBo:refine.ls_d_res_high>か37725行目の<PDBo:refine_hist.d_res_high>である
このXMLのタグがPredicateの候補であり、1gof.rdfのファイルを開いてどちらのPredicateが適切かを調べる

6:    <dc:title>NOVEL THIOETHER BOND REVEALED BY A 1.7 ANGSTROMS CRYSTAL STRUCTURE OF GALACTOSE OXIDASE</dc:title>
470:            <PDBo:citation.title>Novel thioether bond revealed by a 1.7 A crystal structure of galactose oxidase.</PDBo:citation.title>
37555:            <PDBo:pdbx_validate_torsion.phi>51.76</PDBo:pdbx_validate_torsion.phi>
37710:            <PDBo:refine.ls_d_res_high>1.7</PDBo:refine.ls_d_res_high>
37725:            <PDBo:refine_hist.d_res_high>1.7</PDBo:refine_hist.d_res_high>
37905:            <PDBo:struct.title>NOVEL THIOETHER BOND REVEALED BY A 1.7 ANGSTROMS CRYSTAL STRUCTURE OF GALACTOSE OXIDASE</PDBo:struct.title>

ここでは<PDBo:refine.ls_d_res_high>が分解能のPredicateと判断したとする(PDBMLに精通している方なら判断できる?)

37697     <PDBo:has_refineCategory> //★Predicate
37698       <PDBo:refineCategory rdf:about="http://rdf.wwpdb.org/pdb/1GOF/refineCategory"> //★aboutが書かれているので無視
37699         <PDBo:has_refine> //★Predicate
37700           <PDBo:refine rdf:about="http://rdf.wwpdb.org/pdb/1GOF/refine/1GOF,X-RAY_DIFFRACTION"> //★aboutが書かれているので無視
37701             <PDBo:of_datablock rdf:resource="http://rdf.wwpdb.org/pdb/1GOF"/>
37702             <PDBo:reference_to_entry>
37703               <rdf:Description rdf:about="http://rdf.wwpdb.org/pdb/1GOF/entry/1GOF">
37704                 <PDBo:referenced_by_refine rdf:resource="http://rdf.wwpdb.org/pdb/1GOF/refine/1GOF,X-RAY_DIFFRACTION"/>
37705               </rdf:Description>
37706             </PDBo:reference_to_entry>
37707             <PDBo:refine.entry_id>1GOF</PDBo:refine.entry_id>
37708             <PDBo:refine.pdbx_refine_id>X-RAY DIFFRACTION</PDBo:refine.pdbx_refine_id>
37709             <PDBo:refine.ls_R_factor_obs>0.177</PDBo:refine.ls_R_factor_obs>
37710             <PDBo:refine.ls_d_res_high>1.7</PDBo:refine.ls_d_res_high> //★取得したいPredicateとObject
37711             <PDBo:refine.ls_d_res_low>10.0</PDBo:refine.ls_d_res_low>

has_XXXXCategoryはPDBエントリに紐づくので、ここまで遡ればいい。
このケースでは、 <PDBo:has_refineCategory> -- <PDBo:has_refine> -- <PDBo:refine.ls_d_res_high>で取得できるとわかる。
これをSPARQLを記述して値が取得できるか確認する。


SPARQL例

分解能1.7未満のエントリを取得

PREFIX PDBr: <http://rdf.wwpdb.org/pdb/>
PREFIX PDBo: <http://rdf.wwpdb.org/schema/pdbx-v40.owl#>

SELECT ?pdb_entry_uri ?resolution
FROM <http://rdf.integbio.jp/dataset/pdbj>
WHERE {
  ?pdb_entry_uri a PDBo:datablock .
  ?pdb_entry_uri PDBo:has_refineCategory ?refineCategory .
  ?refineCategory PDBo:has_refine ?refine .
  ?refine PDBo:refine.ls_d_res_high ?resolution .
  BIND((xsd:decimal(?resolution)) AS ?num_resolution)
  FILTER(?num_resolution < 1.7)
}

特定のエントリのαヘリックス、βシート、turnのpositionを取得する(チェーンとかシートの方向とかよく分からないので無視しているが考慮しないといけないかも)

PREFIX PDBr: <http://rdf.wwpdb.org/pdb/>
PREFIX PDBo: <http://rdf.wwpdb.org/schema/pdbx-v40.owl#>

SELECT DISTINCT ?struct_id ?start_pos ?end_pos
FROM <http://rdf.integbio.jp/dataset/pdbj>
WHERE
{
  VALUES ?pdb_id {PDBr:1GOF}
  {
    ?pdb_id PDBo:has_struct_sheet_rangeCategory/PDBo:has_struct_sheet_range ?struct_sheet .
    ?struct_sheet PDBo:struct_sheet_range.sheet_id ?struct_id .
    ?struct_sheet PDBo:struct_sheet_range.beg_auth_seq_id ?start_seq .
    ?struct_sheet PDBo:struct_sheet_range.end_auth_seq_id ?end_seq .
  }
  UNION
  {
    ?pdb_id PDBo:has_struct_confCategory/PDBo:has_struct_conf ?struct_conf .
    ?struct_conf PDBo:struct_conf.id ?struct_id .
    ?struct_conf PDBo:struct_conf.beg_auth_seq_id ?start_seq .
    ?struct_conf PDBo:struct_conf.end_auth_seq_id ?end_seq .
  }
  BIND((xsd:integer(?start_seq)) AS ?start_pos)
  BIND((xsd:integer(?end_seq)) AS ?end_pos)
} ORDER BY ?start_pos
個人用ツール