LODとSPARQL入門(4)

この記事は1年以上前に書かれました。
内容が古くなっている可能性がありますのでご注意下さい。


先日Google Playで無償公開した地図と位置情報を利用した百科事典「ここペディア」(公開終了しましたWebで公開中)は、SPARQLクエリでDBpediaから情報を取得しています。
そこで今回は、ここペディアが発行するSPARQLクエリについて解説します。

FILTER
ここペディアの最大の(そして唯一の)特徴は、地図に表示された範囲内の事物に関する情報を表示することです。そのために緯度経度を使用しますので、まずは、事物の名称、概要、WikipediaのURLに加えて、緯度経度を取得してみます。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT distinct ?name ?abstract ?url ?lat ?lon WHERE {
  ?s rdfs:label ?name ;
  dbpedia-owl:abstract ?abstract ;
  foaf:isPrimaryTopicOf ?url ;
  geo:lat ?lat ;
  geo:long ?lon .
}
LIMIT 10

はじめに、URIの接頭辞をPREFIX句で宣言します。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

と宣言することによって、

<http://www.w3.org/2000/01/rdf-schema#label>

rdfs:label

と簡潔に記述することができます。
実は、rdfs、dbpedia-owl、foaf、geoは、DBpedia側であらかじめ定義されているため、PREFIX句で宣言しなくても使用することができます。DBpediaで定義済のプレフィクス一覧はこちらにあります。
次に、SELECT文で名称(rdfs:label)、概要(dbpedia-owl:abstract)、WikipediaのURL(foaf:isPrimaryTopicOf)、緯度(geo:lat)、経度(geo:long)を取得します。
WHERE節では、同じ主語が続くため、行末をセミコロンにして2行目以降では主語を省略しています。
最後に、LIMIT句で取得するデータを10件に制限しています。
DBpediaのSPARQLエンドポイントでクエリを発行すると、以下の結果が得られます。

次に、取得した緯度経度を使用して地理座標の範囲を制限します。
そのために用いるのはFILTER句です。WHERE節の中に、

FILTER ( 条件式 )

の書式で記述します。条件式で緯度経度の範囲を指定することにより、検索する事物の地理範囲を制限します。
横浜市の大さん橋周辺に範囲を絞るためのFILTER句を追加すると以下のようになります。今回はPREFIX句は省略しています。

SELECT distinct ?name ?abstract ?url WHERE {
  ?s rdfs:label ?name ;
  dbpedia-owl:abstract ?abstract ;
  foaf:isPrimaryTopicOf ?url ;
  geo:lat ?lat ;
  geo:long ?lon .
  FILTER ( ?lon > 139.636341 && ?lon < 139.654365 &&     ?lat > 35.442918 && ?lat < 35.455416 )
}
LIMIT 10

DBpediaのSPARQLエンドポイントでクエリを発行すると、以下の結果が得られます。

山下公園など、大さん橋周辺の事物についての情報のみ得られています。

OPTIONAL
ここペディアのバージョン1.0.4からは、事物に関して、Wikipediaへのリンクだけではなく、(公式)サイトがあればそのリンクも表示します。DBpediaでは、

foaf:homepage

を述語とするトリプルで、その事物に関するサイトへのリンクを得ることができます。そこで次のようなSPARQLクエリを発行すると、

SELECT distinct ?name ?abstract ?url ?link WHERE {
  ?s rdfs:label ?name ;
  dbpedia-owl:abstract ?abstract ;
  foaf:isPrimaryTopicOf ?url ;
  geo:lat ?lat ;
  geo:long ?lon ;
  foaf:homepage ?link .
  FILTER ( ?lon > 139.636341 && ?lon < 139.654365 &&     ?lat > 35.442918 && ?lat < 35.455416 )
}
LIMIT 10

以下の結果が得られます。

(公式)サイトへのリンクも取得できており良さそうです。しかし、このクエリには重大な問題があります。それは、foaf:homepageを述語とするトリプルを持っていない事物はヒットしないということです。
(公式)サイトへのリンクは必須ではなく、あれば表示するというオプション的なものです。
そこで、foaf:homepageを述語とするトリプルについては、OPTIONAL節の中に記述します。

SELECT distinct ?name ?abstract ?url ?link WHERE {
  ?s rdfs:label ?name ;
  dbpedia-owl:abstract ?abstract ;
  foaf:isPrimaryTopicOf ?url ;
  geo:lat ?lat ;
  geo:long ?lon .
  OPTIONAL {
    ?s foaf:homepage ?link
  }
  FILTER ( ?lon > 139.636341 && ?lon < 139.654365 &&     ?lat > 35.442918 && ?lat < 35.455416 )
}
LIMIT 10

こうすることによって、foaf:homepageを述語とするトリプルを持っていない事物もヒットするようになり、以下の結果が得られます。

コスモクロック21と横浜市役所の2件については、(公式)サイトへのリンクが表示されていません。実際に公式サイトがあるかどうかではなく、DBpediaには、これら2件に関してfoaf:homepageを述語とするトリプルが存在しないということです。
また、OPTIONAL節で指定したトリプルを持っていないと、ヒットする順番が後になるようです。

LODとSPARQL入門 1234