DBPediaから日本の都道府県情報を取り出すSPARQLサンプル
ちょっと試したいことがあったので、色々クエリ書いてました。以下覚書です。 都道府県の名前を取得する 実行結果 dbpedia.orgでは、https://dbpedia.org/resource/Category:Pre […]
目次
ちょっと試したいことがあったので、色々クエリ書いてました。以下覚書です。
都道府県の名前を取得する
PREFIX dcterms:<https://purl.org/dc/terms/>
PREFIX dbo: <https://dbpedia.org/ontology/>
SELECT DISTINCT ?name
FROM <https://dbpedia.org>
WHERE {
?link dcterms:subject <https://dbpedia.org/resource/Category:Prefectures_of_Japan>;
rdfs:label ?name.
FILTER ((REGEX(str(?link), 'Prefecture) || REGEX(str(?link), 'Hokkaido)))
}
dbpedia.orgでは、https://dbpedia.org/resource/Category:Prefectures_of_Japan
から都道府県の情報を引っ張ってこれます。ただしグローバルなので、これだけだと全言語のデータが取れてしまうという問題もあります。
また(REGEX(str(?link), 'Prefecture$') || REGEX(str(?link), 'Hokkaido$'))
を入れないと、統計データのWikiなども取れてしまうので要注意です。
都道府県の名前を指定言語だけで取得する
FILTERで絞ればOKです。ja
の部分を取りたい言語に変えましょう。
PREFIX dcterms:<https://purl.org/dc/terms/>
SELECT DISTINCT ?name
FROM <https://dbpedia.org>
WHERE {
?link dcterms:subject <https://dbpedia.org/resource/Category:Prefectures_of_Japan>;
rdfs:label ?name.
FILTER ((REGEX(str(?link), 'Prefecture) || REGEX(str(?link), 'Hokkaido)) && LANG(?name)='ja')
}
OR検索にすると、指定した言語だけとってこれます。
PREFIX dcterms:<https://purl.org/dc/terms/>
SELECT DISTINCT ?name
FROM <https://dbpedia.org>
WHERE {
?link dcterms:subject <https://dbpedia.org/resource/Category:Prefectures_of_Japan>;
rdfs:label ?name.
FILTER ((REGEX(str(?link), 'Prefecture) || REGEX(str(?link), 'Hokkaido)) && LANG(?name)='ja' || LANG(?name)='en')
}
県庁所在地をとる
https://dbpedia.org/ontology/capital
にデータが入っているので、これをとります。
PREFIX dcterms:<https://purl.org/dc/terms/>
PREFIX dbo: <https://dbpedia.org/ontology/>
SELECT DISTINCT ?name ?capital
FROM <https://dbpedia.org>
WHERE {
?link dcterms:subject <https://dbpedia.org/resource/Category:Prefectures_of_Japan>;
dbo:capital ?capital;
rdfs:label ?name.
FILTER ((REGEX(str(?link), 'Prefecture) || REGEX(str(?link), 'Hokkaido)) && LANG(?name)='ja')
}
ただし実行結果をみるとわかるのですが、リソースのURIが返ってくるためこのままでは使えません。名前を取るには、以下のようにJOINさせる必要があります。
PREFIX dcterms:<https://purl.org/dc/terms/>
PREFIX dbo: <https://dbpedia.org/ontology/>
SELECT DISTINCT ?name ?capitalName
FROM <https://dbpedia.org>
WHERE {
?link dcterms:subject <https://dbpedia.org/resource/Category:Prefectures_of_Japan>;
dbo:capital ?capital;
rdfs:label ?name.
OPTIONAL { ?capital rdfs:label ?capitalName.}
FILTER ((REGEX(str(?link), 'Prefecture) || REGEX(str(?link), 'Hokkaido)) && LANG(?name)='ja')
}
長野市のデータが英語でしか登録されていないらしく、FILTERでLANG(?capitalName)='ja'
を入れると長野県が消えますのでご注意ください。(2018年10月時点)
説明文も一緒にとってくる
abstractを追加して、説明文も入れましょう。
PREFIX dcterms:<https://purl.org/dc/terms/>
PREFIX dbo: <https://dbpedia.org/ontology/>
SELECT DISTINCT ?name ?capitalName ?abstract
FROM <https://dbpedia.org>
WHERE {
?link dcterms:subject <https://dbpedia.org/resource/Category:Prefectures_of_Japan>;
dbo:capital ?capital;
dbo:abstract ?abstract;
rdfs:label ?name.
OPTIONAL { ?capital rdfs:label ?capitalName.}
FILTER ((REGEX(str(?link), 'Prefecture) || REGEX(str(?link), 'Hokkaido)) && LANG(?name)='ja'&& LANG(?capitalName)='ja' && LANG(?abstract)='ja')
}
日本語でフィルターした結果、長野県に続いて山梨県がいなくなりました。英語では全都道府県とれる様子です。
いろいろ取ってくる
せっかくなので、思いつく限り取ってきてみました。
PREFIX dcterms:<https://purl.org/dc/terms/>
PREFIX dbo: <https://dbpedia.org/ontology/>
SELECT DISTINCT ?name ?capitalName ?abstract ?areaTotal ?areaRank ?isoCode ?municipalities ?birdName ?romaji ?islandName
FROM <https://dbpedia.org>
WHERE {
?link dcterms:subject <https://dbpedia.org/resource/Category:Prefectures_of_Japan>;
dbo:capital ?capital;
dbo:areaTotal ?areaTotal;
dbp:arearank ?areaRank;
dbp:districts ?districts;
dbp:isocode ?isoCode;
dbp:island ?island;
dbp:municipalities ?municipalities;
dbp:bird ?bird;
dbo:abstract ?abstract;
dbp:rōmaji ?romaji;
rdfs:label ?name.
?island rdfs:label ?islandName.
?bird rdfs:label ?birdName.
?capital rdfs:label ?capitalName.
FILTER ((REGEX(str(?link), 'Prefecture) || REGEX(str(?link), 'Hokkaido)) && LANG(?name)='ja' &&LANG(?abstract)='ja' && LANG(?islandName)='ja' && LANG(?capitalName)='ja' && LANG(?birdName)='ja')
}
ISOコードや面積ランキング・都道府県の鳥の名前なども取ってきています。なお、ここまでガリガリにやると、半分くらいの都道府県はデータが揃わない状態になります。簡易的に差分を見る限りでは、以下の都道府県は上記のSPARQLの結果から除外されます。
- 神奈川県
- 高知県
- 愛知県
- 三重県
- 大阪府
- 青森県
- 北海道
- 茨城県
- 宮城県
- 佐賀県
- 福井県
- 群馬県
- 広島県
- 兵庫県
- 石川県
- 宮崎県
- 長野県
- 岡山県
- 徳島県
- 東京府
- 富山県
- 和歌山県
- 山梨県
- 大分県
と、東京府・・・?
まとめ
- DBPediaを使うことで、都道府県のいろんなデータがとれる
- 言語別にデータがとれるので、多言語化する際に捗りそう
- ただしクエリが複雑になると、レスポンスが遅くなるので要対応(小分けにGETする / キャッシュさせるなど)
- たまにかわいそうなことになっている都道府県があるので、日本語だけならDBPedia Japanese推奨