SPARQL advanced山本 泰智 (@yayamamo)
ライフサイエンス統合データベースセンター
a bit
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
お題
プロパティパス
代入 (BIND/VALUES)
Federated Queries (SERVICE)
CONSTRUCT、ASK、DESCRIBE
(更新系)
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
始めに
データサンプルは Turtle 形式で記述します
スペースの都合上、多くのprefixを記述していなかったり、元テキストからの変更を行ったりしています
オープンデータ時代の標準WEB API SPAQL (インプレス刊)の図やクエリを利用しています
http://www.w3.org/TR/sparql11-query/
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
プロパティパス(p118)
SPARQLならではの強力な検索機能
述語のパターンを柔軟に表現可能
複雑なグラフパターンをシンプルに表現可能
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
プロパティパス例
:taro foaf:knows / foaf:interest ?t .
?t ^foaf:interest :taro .
:taro foaf:interest ?t .
:taro foaf:interest | foaf:publications ?t .
:taro foaf:knows+ ?p .
同じ
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
プロパティパス例2
?l
?tp1p3 p2
?t ^p3 / ^p2 / p1 ?l .
以上のような構造のグラフパターンのうち、?tと?lの関係だけに焦点をあてて検索する
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
代入: BINDとVALUES(p116)
クエリ中の変数に演算結果や定数値などを代入できる
BINDは一変数に対する一つの値の代入が可能
VALUESは複数変数それぞれに対して複数値の代入が可能
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
BIND
?p * (1 - ?discount) を ?price に代入SELECT ?title ?price { ?x ns:price ?p . ?x ns:discount ?discount BIND (?p * (1 - ?discount) AS ?price) FILTER(?price < 20) ?x dc:title ?title . }
http://www.w3.org/TR/sparql11-query/より
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
VALUES
?book に :book1 と :book3 を順に代入するSELECT ?book ?title ?price { VALUES ?book { :book1 :book3 } ?book dc:title ?title ; ns:price ?price . }
WHEREの外側でも書けるが、対応している実装は少ないSELECT ?book ?title ?price { ?book dc:title ?title ; ns:price ?price . } VALUES (?book ?title){ (UNDEF "SPARQL Tutorial") (:book2 UNDEF) }
http://www.w3.org/TR/sparql11-query/より
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
Federated Queries: SERVICE(p114)
一つのSPARQLクエリで複数のSPARQLエンドポイントにクエリを発行して結果をまとめて取得
従来はプログラムを組んで行う必要があった
分散データベース環境に適した仕組みといえる
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
サブクエリとSERVICE
クエリの中にクエリ(サブクエリ)を書ける
SERVICEキーワードで問合せ先エンドポイントを指定
SELECT ?p ?o WHERE { SERVICE <http://ja.DBpedia.org/sparql> { SELECT ?p ?o WHERE { dbpedia:東京 ?p ?o .}
}}
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
CONSTRUCT(p92)
検索結果とテンプレートに基づく新たなRDFデータを生成する
既存RDFデータに対して、SPARQLが提供する様々な演算を適用した結果をRDFとして取得できる
SERVICEと併用することで複数データセットから必要なデータを収集して新たなRDFデータセットを構築できる
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
CONSTRUCTで新たなトリプルを生成
SELECTの代わりにCONSTRUCTを用いて結果をトリプルにCONSTRUCT { :taro :knows ?who . ?who foaf:birthday ?birth_date . }WHERE { :taro :likes ?who . SERVICE <http://DBpedia.org/sparql> { SELECT ?who ?birth_date WHERE { ?who dbpedia-owl:birthDate ?birth_date . }}}
パターンとテンプレートが同じ場合は短縮表記が可能CONSTRUCT WHERE { ?x foaf:name ?name }
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
ASK(p93)
パターンにマッチするトリプルの有無をみる
結果は真偽値
ASK WHERE {?s foaf:knows ?o }
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
DESCRIBE(p93)
特定のリソースに関する情報をRDFで取得する
対象リソースが主語か目的語のトリプル一覧が得られることが多い
リソースIRIを参照解決可能(dereferenceable)にするため利用される
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
DESCRIBE例
DESCRIBE <http://ja.dbpedia.org/resource/東京都>
DESCRIBE ?who WHERE { :taro faof:knows ?who .}
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
参照解決(dereferenceable)例$ curl -stderr /dev/null -LH 'Accept: application/rdf+xml' 'http://ja.dbpedia.org/resource/%E6%9D%B1%E4%BA%AC%E9%83%BD' <?xml version="1.0" encoding="utf-8" ?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:prop-ja="http://ja.dbpedia.org/property/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:prov="http://www.w3.org/ns/prov#" xmlns:dbpedia-owl="http://dbpedia.org/ontology/" > <rdf:Description rdf:about="http://ja.dbpedia.org/resource/Colorvariation"> <dbpedia-owl:wikiPageWikiLink rdf:resource="http://ja.dbpedia.org/resource/東京都" /> </rdf:Description> <rdf:Description rdf:about="http://ja.dbpedia.org/resource/KM-MARKIT"> <dbpedia-owl:wikiPageWikiLink rdf:resource="http://ja.dbpedia.org/resource/東京都" /> </rdf:Description> <rdf:Description rdf:about="http://ja.dbpedia.org/resource/Ryoko"> <dbpedia-owl:wikiPageWikiLink rdf:resource="http://ja.dbpedia.org/resource/東京都" /> </rdf:Description> <rdf:Description rdf:about="http://ja.dbpedia.org/resource/おかわりシスターズ"> <dbpedia-owl:wikiPageWikiLink rdf:resource="http://ja.dbpedia.org/resource/東京都" /> </rdf:Description> <rdf:Description rdf:about="http://ja.dbpedia.org/resource/たまらん坂"> <dbpedia-owl:wikiPageWikiLink rdf:resource="http://ja.dbpedia.org/resource/東京都" /> </rdf:Description> <rdf:Description rdf:about="http://ja.dbpedia.org/resource/ふぁみ魂家郎"> <dbpedia-owl:wikiPageWikiLink rdf:resource="http://ja.dbpedia.org/resource/東京都" /> </rdf:Description> ...
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
更新系クエリ(p94~)
SPARQL1.1ではデータベースの値を更新する様々な仕様が追加された
LOAD / CLEAR / DROP / ADD / COPY / MOVE / CREATE / INSERT DATA / DELETE DATA / INSERT / DELETE
実践SPARQL 5/17 @ 日本オラクル株式会社 山本 泰智
IRIを一部置換してデータ更新(p194)
クラス http://dbpedia.org/ontology/City のインスタンスIRIについて、http://ja.dbpedia.org/resource/ に当たる部分を、http://sparqlbook.jp/city/ に置換して対象DBを更新WITH <http://sparqlbook.jp/graph> DELETE { ?old_iri a <http://dbpedia.org/ontology/City> . } INSERT { ?new_iri a <http://dbpedia.org/ontology/City> . } WHERE { ?old_iri a <http://dbpedia.org/ontology/City> . BIND(STR(?old_iri) AS ?old_iri_string) BIND("http://ja.dbpedia.org/resource/", AS ?old_prefix) BIND("http://sparqlbook.jp/city/", AS ?new_prefix) BIND(IRI(REPLACE(?old_iri_string, ?old_prefix, ?new_prefix)) AS ?new_iri) }