これは SPARQL Advent Calendar 2015 9日目の記事です.

以前Wikidata Linked Dataという記事を書いた通り,Wikidata のデータ提供部分はLinked Dataです.これまでもサードパーティがそのRDFで勝手SPARQLエンドポイントを立てていたりしたのですが,今年9月にWikimediaが公式にWikidata Query ServiceというSPARQLエンドポイントをβ公開しました.今回はこれを使ってみようとおもいます.

サンプル例にアメリカ歴代大統領というのがあったので,試しに歴代の内閣総理大臣を開始年でソートするクエリを書いてみました(SPARQL例へのリンク).

PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/> 
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX psv: <http://www.wikidata.org/prop/statement/value/>
PREFIX pq: <http://www.wikidata.org/prop/qualifier/>
PREFIX pqv: <http://www.wikidata.org/prop/qualifier/value/>

SELECT ?primeMinister ?primeMinisterLabel ?startTime
WHERE {
   ?primeMinister p:P39 ?positionStatement .
   ?positionStatement ps:P39 wd:Q274948 ; 
                      pq:P580 ?startTime .
  
   SERVICE wikibase:label {
      bd:serviceParam wikibase:language "ja,en" .
   }
 }
ORDER BY ?startTime

結果は45件で,データとしてはかなり欠けています.明治・大正時代の人が全然いませんし,近年をみても麻生太郎と鳩山由紀夫が入っていません.皆で日本に関するデータを整備していく必要があります.

Wikidataのデータは多言語化前提になっていて,全てのリソースにIDベースのIRIが振られていて,そのIRIに対して多言語によるラベルを付与するというモデルになっています.そのため,リソースによってラベルがある言語がバラバラになるので,言語指定のフォールバックができる仕組みをSPARQLを拡張して用意しています.上記のクエリのSERVICE wikibase:label { ... }の部分がそれです.bd:serviceParam wikibase:language "言語名"の言語名の部分に複数の言語を指定すると,その順番でラベルを使用します.例えば”ja,en”であれば日本語が主で,日本語がない場合は英語を取得します.指定した言語がない場合はリソースのIRIになります.SELECTで指定する変数として,実際にラベルを取得したい変数の最後に”Label”を付けたものを指定することで,自動的にラベルを取得できます.上記例では,?president 変数のラベルとして?presidentLabelを指定しています.

この自動ラベル変換機能は一々言語毎にFILTERをするといった複雑なことをしなくて済むので便利ですが,いくつか制約があります.まず,OPTIONALで使っている変数は現在エラーになるようです(これはバグかもしれません).また,ラベルの中身に応じてフィルターしたいときのように,クエリ内で変数を参照したいときには使えません.その場合は,SERVICE句の中で直接rdfs:labelでラベル変数を指定すれば良いです.但し,自動変換機能と併用することはできないので,必要なラベルを全て指定する必要があります.

Wikidataまだまだこれからですが,色んなエンティティを結びつけるデータとしてどんどん整理されつつあるので,揃ってくればかなり期待できるサービスだとおもいます.

参考:

WikidataWikimediaのプロジェクトの一つで,人間と機械が同じように参照・編集可能なフリーな知識ベースです.誰もが簡単に構造化データを作れます.WikidataはすでにWikipediaの言語間リンク等に利用されています.

技術的に見ると,WikidataはLinked Dataを基盤としています.まず,http://ja.wikipedia.org/wiki/森薫のWikidataページはhttp://www.wikidata.org/wiki/Q433255になります.DBpediaと異なり,一つのアイテム毎にユニークなid (Qの後のXXXXX)があり,それに多言語のラベルが付くようになっています.WikipediaとWikidataの対応関係を知るためにはリゾルバがあります.リゾルバのURI設計はhttp://www.wikidata.org/wiki/Special:ItemByTitle/{site}/{title}です.森薫の例だと,http://www.wikidata.org/wiki/Special:ItemByTitle/jawiki/森薫となります.

一方で,アイテム自体を識別するためのURIはhttp://www.wikidata.org/entity/Q{id}となっています.Q433255を識別するためのURIはhttp://www.wikidata.org/entity/Q433255です.Linked DataとしてのURI設計は以下の通りになります.connegはhttp,https両方受け付けるみたい.

  • Item URI: http://www.wikidata.org/entity/Q{id}
  • データURI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}
  • HTMLページ URI: http://www.wikidata.org/wiki/Q{id}
  • JSON URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.json
  • Turtle URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.ttl
  • RDF/XML URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.rdf
  • N-Triples URI: http://www.wikidata.org/wiki/Special:EntityData/Q{id}.nt
$ curl -LH 'Accept: text/turtle' http://www.wikidata.org/entity/Q433255
@prefix data: <http://www.wikidata.org/wiki/Special:EntityData/> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix entity: <http://www.wikidata.org/entity/> .
@prefix cc: <http://creativecommons.org/ns#> .
@prefix wikibase: <http://www.wikidata.org/ontology#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

data:Q433255
  schema:version 103373967 ;
  schema:dateModified "2014-01-19T13:20:45Z"^^xsd:dateTime ;
  a schema:Dataset ;
  schema:about entity:Q433255 ;
  cc:license <http://creativecommons.org/publicdomain/zero/1.0/> .

entity:Q433255
  a wikibase:Item ;
rdfs:label "森薰"@zh-hans, "森薰"@zh-hant, "森薰"@zh-hk, "森薰"@zh-cn, "森薰"@zh-sg, "森薰"@zh-tw, "Kaoru Mori"@de, "森薫"@ja, "Kaoru Mori"@fr, "Мори, Каору"@ru, "모리 카오루"@ko, "Kaoru Mori"@en, "Kaoru Mori"@sv, "Kaoru Mori"@nl, "Kaoru Mori"@es, "Kaoru Mori"@pl, "森薰,"@zh ;
  skos:prefLabel "森薰"@zh-hans, "森薰"@zh-hant, "森薰"@zh-hk, "森薰"@zh-cn, "森薰"@zh-sg, "森薰"@zh-tw, "Kaoru Mori"@de, "森薫"@ja, "Kaoru Mori"@fr, "Мори, Каору"@ru, "모리 카오루"@ko, "Kaoru Mori"@en, "Kaoru Mori"@sv, "Kaoru Mori"@nl, "Kaoru Mori"@es, "Kaoru Mori"@pl, "森薰,"@zh ;
  schema:name "森薰"@zh-hans, "森薰"@zh-hant, "森薰"@zh-hk, "森薰"@zh-cn, "森薰"@zh-sg, "森薰"@zh-tw, "Kaoru Mori"@de, "森薫"@ja, "Kaoru Mori"@fr, "Мори, Каору"@ru, "모리 카오루"@ko, "Kaoru Mori"@en, "Kaoru Mori"@sv, "Kaoru Mori"@nl, "Kaoru Mori"@es, "Kaoru Mori"@pl, "森薰,"@zh ;
  schema:description "japanische Manga-Zeichnerin"@de, "japońska mangaka"@pl ;
  skos:altLabel "森薫"@zh, "Mori Kaoru"@de, "森薫"@de, "県文緒"@ja, "森薫"@fr, "Mori Kaoru"@fr, "Fumio Agata"@fr, "Agata Fumio"@fr, "県文緒"@fr, "Мори Каору"@ru, "Каору Мори"@ru, "모리 가오루"@ko, "Mori"@sv .

<http://zh.wikipedia.org/wiki/%E6%A3%AE%E8%96%B0>
  a schema:Article ;
  schema:about entity:Q433255 ;
  schema:inLanguage "zh" .
....

参考