わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

SPARQLを試す

昨日は大阪駅前第2ビルのキャンパスポート大阪へ行き,Linked Open Dataの基礎とこれからの情報活用と題するお話を聞いてきました.講師は東京芸術大学の嘉村哲郎先生です.
持ち帰った資料(スライドのコピー)と聞いた記憶をもとに,振り返っておくと,主要な項目は次の4つでした.

  1. Open Data
  2. Linked Open Data
  3. クエリ言語SPARQL
  4. Linked Open Dataの利用事例

スライドの構成として,「クエリ言語SPARQL」は「Linked Open Data」に含まれていましたが,お話の流れという面のほか,本日,記事にするという意図もあって,SPARQLは別項目としています.
ともあれ,各用語について少々書いておきましょう.Open Dataとは,文字どおりオープンにされたデータのことです.そのためのフォーマットは,「公開する人の事情で何でもあり」というのが一つの考え方ですが,データ共有5つのステップによって,方法(フォーマットなど)ごとのコストと利益が示されています.
しかしLinked Open Dataでは,何でもありというわけにもいかず,Resource Description Framework (RDF)が標準的なデータフォーマットとなっています.そしてRDFの問い合わせ言語が,SPARQLというわけです.関係データベースにおいて,単一または複数のテーブルをもとに,条件式などを記述して,ほしい情報を得るための問い合わせ言語SQLと,RDFのためのSPARQLとを対比させた表も,配付資料に入っていました.
SPARQLの処理系は,Rubyで動くものでも,PerlでもPythonでも他の言語でも,探せば簡単に見つかります.ですが,そういったソフトウェアをわざわざ手元に入れなくても,ブラウザを使って,URIを指定してアクセスするだとか,フォームに入力して実行するだとかいった機構も広く採用されており,それらは「SPARQL Endpoint」と呼ばれます.SPARQL Endpointの一つに,次のサイトがあります.

その入力フォームで,配付資料にある「夏目漱石の出生地はどこですか?」を試してみました.WHEREの中の行末がカンマかピリオドか,迷いましたが,いずれもピリオドとすれば,うまくいきました.

# 成功
PREFIX dbp:<http://ja.dbpedia.org/resource/>
PREFIX dbp-owl:<http://dbpedia.org/ontology/>

SELECT ?seichi ?label

WHERE {
  dbp:夏目漱石 dbp-owl:birthPlace ?seichi .
  ?seichi rdfs:label ?label .
}

http://goo.gl/mSUsRwは,このクエリの短縮URLです.なお,入力フォームではなく,いきなり結果が出ます.
DBpedia Japaneseのサイトトップには,「SPARQL例」がいくつか書かれていました,順に試してみると,「ロック音楽のリスト」の問い合わせでエラーが出ました.

# 失敗
SELECT DISTINCT ?label ?depiction
WHERE {
  ?s dbpprop-ja:genre <http://ja.dbpedia.org/resource/ロック_(音楽)> ;
    rdfs:label ?label .
  OPTIONAL { ?s foaf:depiction ?depiction .  }
}

エラーメッセージのうち,「'dbpprop-ja' before '<http://ja.dbpedia.org/resource/ロック_(音楽)>'」に着目してhttp://ja.dbpedia.org/page/%E3%83%AD%E3%83%83%E3%82%AF_(%E9%9F%B3%E6%A5%BD)にアクセスし,見ていったところ,「dbpprop-ja:genre」ではなく「prop-ja:genre」としないといけないようです.
書き換えて再実行…うまくいきました.

# 成功
select DISTINCT ?label ?depiction
where {
  ?s prop-ja:genre <http://ja.dbpedia.org/resource/ロック_(音楽)> ;
    rdfs:label ?label .
  OPTIONAL { ?s foaf:depiction ?depiction .  }
}

http://goo.gl/C7mph2は,このクエリの短縮URLです.
このエラーですが,かつてはdbpprop-jaだったのが,ある時点でprop-jaになったのでしょう.配付資料を見直したところ,SPARQL Endpointを用いたRDFデータの利用のスライドのところに,「メタデータの仕様を確認していかなければならない」と手書きしていました.


補足1:「SPARQL Endpoint」という言葉について.DBpedia Japaneseでは,「SPARQL Endpoint」というリンクがあり,そこをクリックすると,入力フォームに移ります.なので,入力フォームのみをEndpointと言うのかと迷い,少し調査してみました.
SPARQL Endpoint | 東日本大震災アーカイブ Fukushimaには「本SPARQLエンドポイントのAPI機能を利用して」と書かれていました.
他の情報とも合わせて,どうやら,資料の「RDF StoreへのSPARQLクエリを受け付けるURI」が,SPARQL Endpointの説明として妥当であり,入力フォームについては「備えている場合がある」という追加説明で,良さそうです.
補足2:「# 成功」「# 失敗」は,SPARQL言語のコメントです.http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html#grammarCommentsに記されています.なお,クエリのURIには,コメントもエンコードされて入っています.改行は,"%0D%0A"です.
補足3:RDFとSPARQLの記述例,そして有向グラフによる図示を取り入れ,分かりやすく解説しているスライドを見つけました.