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推奨
    広告ここから
    広告ここまで
    Home
    Search
    Bookmark