SPARQL

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推奨

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts