Linked Open Data を使って自治体コード表を作ってみた

次世代統計利用システムで、都道府県・市区町村コード情報が LOD(Linked Open Data)で提供されるようになったので自治体コード表(市区町村コード表)を作ってみた。

都道府県を選択すると自治体コードが表示されます。

都道府県:



試行版のSPARQLエンドポイント: http://statdb.nstac.go.jp/lod/sparql

SPARQLサーバーがhttpsをサポートしていないため、サーバー側でデータを取得するように変更しています。市町村コードを取得するSPARQLについての解説は、creativeweb.jp市区町村コード情報がLODで公開されたので使ってみたにあります。使用しているコード例は以下のとおりで、C11000は埼玉県の場合で東京都の場合はC13000になります。

SELECT ?s ?name ?kana ?cd ?ad WHERE { 
  GRAPH ?g { ?s ?p ?o . ?s rdf:type sacs:CurrentStandardAreaCode.
    {
      ?o dcterms:isPartOf sac:C11000-19700401.
    }UNION{
      ?o dcterms:isPartOf ?district.
      ?district dcterms:isPartOf sac:C11000-19700401.
      OPTIONAL {?district dcterms:valid ?valid.}
    }
    ?o sacs:administrativeClass ?ad.
    ?o rdfs:label ?name. ?o rdfs:label ?kana. ?o sacs:checkDigit ?cd.
  }
  FILTER( lang(?name) = "ja")
  FILTER( lang(?kana) = "ja-hrkt")
  FILTER(?ad = sacs:DesignatedCity || ?ad = sacs:CoreCity || ?ad = sacs:SpecialCity || ?ad = sacs:SpecialWard || ?ad = sacs:Ward || ?ad = sacs:City || ?ad = sacs:Town || ?ad = sacs:Village)
  FILTER (!BOUND(?valid))
}

2016年3月31日から、統計 LOD の方で公開されています。統計 LOD は、最高ランク(5スター)でデータを提供するというのが謳い文句ですが、どうやら最高ランクの複雑な処理をしているらしく、この処理だと結果が返ってくるのに1分以上かかりエラーになってしまう場合も多くて使いものにならない状態です。それで、試行版の方を依然として使っています。

SPARQLエンドポイント: http://data.e-stat.go.jp/lod/sparql/query

検索用画面: http://data.e-stat.go.jp/lod/sparql/

また、公式版では、試行版と違ってデータセットが事前に定義されていないので以下のように最初に定義を書いてやる必要があります。

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX org:<http://www.w3.org/ns/org#>
PREFIX dcterms:<http://purl.org/dc/terms/>
PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#>
PREFIX sac:<http://data.e-stat.go.jp/lod/sac/>
PREFIX sace:<http://data.e-stat.go.jp/lod/sace/>
PREFIX sacr:<http://data.e-stat.go.jp/lod/sacr/>
SELECT ?s ?name ?kana ?cd ?ad WHERE {
  GRAPH ?g {?s ?p ?o . ?s rdf:type sacs:CurrentStandardAreaCode.
    {
      ?o dcterms:isPartOf sac:C11000-19700401.
    }UNION{
      ?o dcterms:isPartOf ?district.
      ?district dcterms:isPartOf sac:C11000-19700401.
      OPTIONAL {?district dcterms:valid ?valid.}
    }
    ?o sacs:administrativeClass ?ad.
    ?o rdfs:label ?name. ?o rdfs:label ?kana. ?o sacs:checkDigit ?cd.
  }
  FILTER( lang(?name) = "ja")
  FILTER( lang(?kana) = "ja-hrkt")
  FILTER(?ad = sacs:DesignatedCity || ?ad = sacs:CoreCity || ?ad = sacs:SpecialCity || ?ad = sacs:SpecialWard || ?ad = sacs:Ward || ?ad = sacs:City || ?ad = sacs:Town || ?ad = sacs:Village)
  FILTER (!BOUND(?valid))
}