はじめに
日頃、世界遺産データを集めた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:type
がdbo: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の難しさだとは思う。