Posted at

DBpediaから緯度経度を持つ世界遺産データだけを取得する

More than 1 year has passed since last update.


はじめに

日頃、世界遺産データを集めたDBを作りたいと思っています



そこで今回は、wikipediaをLOD(Linked Open Data)化したDBpediaをデータソースとして、世界遺産のデータを取得したいと思います。

取得したいデータ項目については以下にまとめました。

概要・画像は必須としたいところですが、データとして紐付いていない世界遺産が覗かれてしまうことを防ぐため、必須としません。


  • 取得したいデータ


    • 世界遺産名

    • 緯度

    • 経度

    • 概要(あれば)

    • 画像(あれば)




SPARQL

PREFIXのURIを調べるには、prefix.ccを使うのがオススメです。

DBpediaのSPARQL Endpointは、こちら

Endpointを開いたら、Query TextにSPARQLを入力して、Run QueryをクリックすればOK。

ちなみに、Result Formatで、HTML, XML, JSON, Turtleなど出力フォーマットをお好みで選択できます。

PREFIX geo:  <http://www.w3.org/2003/01/geo/wgs84_pos#>

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>

select distinct ?name ?lat ?long ?abstract where {
?s rdf:type dbo:WorldHeritageSite.
?s rdfs:label ?name.
?s geo:lat ?lat.
?s geo:long ?long.

optional {
?s foaf:depiction ?depict.
?s dbo:abstract ?abstract.
}
FILTER ( lang(?name) = "en" )
FILTER ( lang(?abstract) = "en" )
}

今回の肝となる世界遺産データの判定には、dbo:WorldHeritageSite.を用いました。

?s rdf:type dbo:WorldHeritageSite.の通り、rdf:typedbo:WorldHeritageSite.であるsubjectを取得しています。

基本的には、これで一発でDBpediaから世界遺産データだけを取得することができます。

このフィルター後、世界遺産名、緯度、経度を順に?name?lat?longの変数に当てます。

orが表現できるoptional句を用いて、概要、画像を順に?depict?abstractの変数に当てます。

最後にFILTER句を用いて、世界遺産名・概要データは英語表記であるものだけに絞りました。

これをつけておかないと、多言語表記のデータも取得してしまいます。

lang関数を用いて、表記言語を判定しています。


おまけ:どれくらい網羅しているの?

PREFIX geo:  <http://www.w3.org/2003/01/geo/wgs84_pos#>

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>

select distinct count(?name) where {
?s rdf:type dbo:WorldHeritageSite.
?s rdfs:label ?name.

FILTER ( lang(?name) = "en" )
}

こちらのSPARQLを投げてみたところ、取得できた世界遺産データは、713件でした。

日本ユネスコ協会のこちらのページによると、登録されている世界遺産は1052件(2016年12月現在)。

このデータを参考にすると、DBpediaの世界遺産データの網羅率は、約68%。 (2017年5月)

DBpediaの情報元はwikipediaであるので、情報の更新/LODへの変換等の理由のためにすべてを網羅できていないのでしょう。

または、今回はdbo:WorldHeritageSiteを用いたが別のresourceを使うと違った結果になるだろう。

どんなschemeでどんな属性がついているかぱっとわからないことは、LODの難しさだとは思う。