SPARQLthon46-hands-on-workshop

提供:TogoWiki

2016年7月26日 (火) 05:37時点におけるYokookbp (トーク | 投稿記録)による版
移動: 案内, 検索

目次

Fusekiのインストール


SPARQL 体験:DBPedia

  • DBpedia は、Wikipediaから構造化データを抽出してLinked Open Dataとして再公開しているコミュニティプロジェクト。主にWikipediaのInfoboxやリンク関係等を扱っている。
    • DBpediaと同様に、日本語Wikipeidaから、構造化データを抜き出してLOD化するプロジェクト DBpedia Japanse もある。

SPARQL 体験:UniProt

  • UniProt RDFにSPARQLで問い合わせを行う。
    • UniProt の SPARQLエンドポイントに対してSPARQL検索を行うか、または、 ダウンロードしてきた適当なサイズのUniProt RDFをFusekiにロードしたものに対してSPARQL検索を行うか、状況に応じて、いずれかを行う。


Example 1

  • ローカル環境向けSPARQL
 PREFIX core: <http://purl.uniprot.org/core/>
 
 SELECT ?protein
 WHERE {
   ?protein a core:Protein
 }
 LIMIT 25
  • エンドポイント向けSPARQL
 PREFIX core: <http://purl.uniprot.org/core/>
 
 SELECT ?protein
 WHERE {
   ?protein a core:Protein .
   ?protein core:organism <http://purl.uniprot.org/taxonomy/83333> .
 }
 LIMIT 25

Example 2: COUNT

  • 大腸菌K-12株の、 <http://purl.uniprot.org/core/Protein> のインスタンス(=UniProt の エントリー)の数を数える。
  • ローカル環境向けSPARQL(ローカル環境には、E.coli RDFのみ入っている状態)
 PREFIX core: <http://purl.uniprot.org/core/>
 
 SELECT (COUNT(?subject) AS ?EntryNumber)
 WHERE {
   ?subject ?predicate core:Protein
 }
  • エンドポイント向けSPARQL
    • UniProt SPARQLエンドポイントには、E.coli だけでなく全てのデータが入っているので、検索対象の生物種を指定するトリプルパターンを追記する必要がある(以下の例でも同じ)。
 PREFIX core: <http://purl.uniprot.org/core/>
 
 SELECT (COUNT(?protein) AS ?EntryNumber)
 WHERE {
   ?protein a core:Protein .
   ?protein core:organism <http://purl.uniprot.org/taxonomy/83333> .
 }

Example 3

  • Gene Ontology (GO) の GO_0003700 "nucleic acid binding transcription factor activity" 以下のGOがアノテーションされているタンパク質を取得する
  • ローカル環境向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein ?go
WHERE {
  ?protein a core:Protein .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf* ?go2 .
  ?go2 rdfs:label "nucleic acid binding transcription factor activity" .
}
  • エンドポイント向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein ?go
WHERE {
  ?protein a core:Protein .
  ?protein core:organism <http://purl.uniprot.org/taxonomy/83333> .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf* ?go2 .
  ?go2 rdfs:label "nucleic acid binding transcription factor activity" .
}

Example 4: 集約関数 GROUP BY

  • Gene Ontology (GO) の GO_0003700 "nucleic acid binding transcription factor activity" 以下のGOがアノテーションされているタンパク質のユニークな一覧を取得する
  • ローカル環境向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein
WHERE {
  ?protein a core:Protein .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf* ?go2 .
  ?go2 rdfs:label "DNA binding" .
} GROUP BY ?protein
  • エンドポイント向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein
WHERE {
  ?protein a core:Protein .
  ?protein core:organism <http://purl.uniprot.org/taxonomy/83333> .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf* ?go2 .
  ?go2 rdfs:label "DNA binding" .
} GROUP BY ?protein

Example 5: BIND, GROUP_CONCAT, STRAFTER

  • Gene Ontology (GO) の GO_0003700 "nucleic acid binding transcription factor activity" 以下のGOがアノテーションされているタンパク質のユニークな一覧に、アノテーションされたGO IDを併記する。
  • ローカル環境向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein (GROUP_CONCAT(DISTINCT ?goid; SEPARATOR=",") AS ?goids)
WHERE {
  ?protein a core:Protein .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf+ ?go2 .
  ?go rdfs:label ?label .
  ?go2 rdfs:label "DNA binding" .
  BIND(STRAFTER(STR(?go), "obo/") AS ?goid)
} GROUP BY ?protein
  • エンドポイント向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein	 (GROUP_CONCAT(DISTINCT ?goid; SEPARATOR=",") AS ?goids)
WHERE {
  ?protein a core:Protein .
  ?protein core:organism <http://purl.uniprot.org/taxonomy/83333> .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf+ ?go2 .
  ?go rdfs:label ?label .
  ?go2 rdfs:label "DNA binding" .
  BIND(STRAFTER(STR(?go), "obo/") AS ?goid)
} GROUP BY ?protein

Example 6: CONCAT

  • Gene Ontology (GO) の GO_0003700 "nucleic acid binding transcription factor activity" 以下のGOがアノテーションされているタンパク質のユニークな一覧に、アノテーションされたGO IDおよびそのラベルを併記する。
  • ローカル環境向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein	 (GROUP_CONCAT(DISTINCT ?goid; SEPARATOR=", ") AS ?goids)
WHERE {
  ?protein a core:Protein .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf+ ?go2 .
  ?go rdfs:label ?label .
  BIND(CONCAT(CONCAT('"', ?label), '"')AS ?quoted_label)
  ?go2 rdfs:label "nucleotide binding" .
  BIND(CONCAT(CONCAT(STRAFTER(STR(?go), "/obo/"), ":"), ?quoted_label) AS ?goid)
} GROUP BY ?protein
  • エンドポイント向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein	 (GROUP_CONCAT(DISTINCT ?goid; SEPARATOR=", ") AS ?goids)
WHERE {
  ?protein a core:Protein .
  ?protein core:organism <http://purl.uniprot.org/taxonomy/83333> .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf+ ?go2 .
  ?go rdfs:label ?label .
  BIND(CONCAT(CONCAT('"', ?label), '"')AS ?quoted_label)
  ?go2 rdfs:label "nucleotide binding" .
  BIND(CONCAT(CONCAT(STRAFTER(STR(?go), "/obo/"), ":"), ?quoted_label) AS ?goid)
} GROUP BY ?protein

Example 7

  • ローカル環境向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein (GROUP_CONCAT(?goid; SEPARATOR=", ") AS ?goids)
WHERE {
  ?protein a core:Protein .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf+ ?go2 .
  ?go rdfs:label ?label .
  BIND(CONCAT(CONCAT('"', ?label), '"')AS ?quoted_label)
  ?go2 rdfs:label "nucleic acid binding transcription factor activity" .
  BIND(CONCAT(CONCAT(STRAFTER(STR(?go), "/obo/"), ":"), ?quoted_label) AS ?goid)
} GROUP BY ?protein
  • エンドポイント向けSPARQL
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX core: <http://purl.uniprot.org/core/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?protein (GROUP_CONCAT(?goid; SEPARATOR=", ") AS ?goids)
WHERE {
  ?protein a core:Protein .
  ?protein core:organism <http://purl.uniprot.org/taxonomy/83333> .
  ?protein core:classifiedWith ?go .
  ?go rdfs:subClassOf+ ?go2 .
  ?go rdfs:label ?label .
  BIND(CONCAT(CONCAT('"', ?label), '"')AS ?quoted_label)
  ?go2 rdfs:label "nucleic acid binding transcription factor activity" .
  BIND(CONCAT(CONCAT(STRAFTER(STR(?go), "/obo/"), ":"), ?quoted_label) AS ?goid)
} GROUP BY ?protein

質疑

GO IDをDISTINCTする必要性について

Example5 で?go_idに対してDISTINCTを使って重複を省いているが、fusekiで実行したクエリではDISTINCTを書かなくてもそもそも重複データが出てこないのはなぜか?

  • FusekiでExample5のDISTINCTを書かなかった場合の結果(一部)
<http://purl.uniprot.org/uniprot/P04152>    |   "GO_0003684"
  • uniprot(Virtuoso)の結果
<http://purl.uniprot.org/uniprot/P04152>    |   GO_0003684,GO_0003684


<原因>

プロパティパスを使用した場合にFusekiの場合はパス(経路)が異なる場合にも始点終点の結果が同じ重複データを自動的に取り除き、Virtuosoの場合は重複していても出力する模様。 SPARQLの仕様としては重複データを出力する方が正しい9.3 Property Paths and Equivalent Patterns