県名市名イニシャル表記のランキングを SPARQL でやってみた

[県名市名イニシャル表記で最も匿名性が高いのはS県K市](https://anond.hatelabo.jp/20170527201015) に触発されて、ひさびさに SPARQL を書いてみました。

# 方法

統計局の [統計LOD](https://data.e-stat.go.jp/lodw/) では [都道府県市区町村のコード情報](http://data.e-stat.go.jp/lodw/rdfschema/sacs/)を SPARQL Endpoint を通じて提供しています。コード情報だけでなく、英語名なんかも提供されているので、SPARQL をきちんと書ききることができれば、**S県K市** のようなリストと件数を取得できそうです。

<https://data.e-stat.go.jp/lod/sparql/> を表示すると以下のような SPARQL 実行フォームが表示されるので、ここに作成した SPARQL クエリーをペースト＞検索実行することで結果を取得できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82494/1b6be236-53be-3108-6d78-50805fe4d3a9.png)

# SPARQL

以下の SPARQL でうまくいきました。

```initial.rq
PREFIX sacs: <http://data.e-stat.go.jp/lod/terms/sacs#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX dcterms: <http://purl.org/dc/terms/>

SELECT ?result (count(?result) as ?count) WHERE {
  ?a owl:sameAs ?b .
  ?b sacs:administrativeClass ?clazz ; rdfs:label ?name_en ; rdfs:label ?name_ja .
  ?c sacs:administrativeClass sacs:Prefecture ; rdfs:label ?pref_en ; rdfs:label ?pref_ja ;dcterms:hasPart ?b .
  FILTER (
    ?clazz in (sacs:City, sacs:DesignatedCity, sacs:CoreCity, sacs:SpecialCity) &&
    lang(?pref_en) = "en" && lang(?pref_ja) = "ja" &&
    lang(?name_en) = "en" && lang(?name_ja) = "ja"
  )
  BIND ( CONCAT(SUBSTR(?pref_en,1,1),SUBSTR(?pref_ja,STRLEN(?pref_ja)),SUBSTR(?name_en,1,1),SUBSTR(?name_ja,STRLEN(?name_ja))) AS ?result)
} GROUP BY ?result ORDER BY DESC(count(?result))

```

# 結果

こんなかんじで出力されます。S県K市は元記事のようにちゃんと 18 件あるようですね。
全件の結果を [こちら](https://gist.github.com/frogcat/c09a926021d4b0d485a1b6138677d114) においておきます。

```20170622-sparql-result.json
{
  "head": {
    "vars": [ "result" , "count" ]
  } ,
  "results": {
    "bindings": [
      {
        "result": { "type": "literal" , "value": "S県K市" } ,
        "count": { "datatype": "http://www.w3.org/2001/XMLSchema#decimal" , "type": "typed-literal" , "value": "18" }
      } ,
      {
        "result": { "type": "literal" , "value": "K県K市" } ,
        "count": { "datatype": "http://www.w3.org/2001/XMLSchema#decimal" , "type": "typed-literal" , "value": "13" }
      } ,
      {
        "result": { "type": "literal" , "value": "I県K市" } ,
        "count": { "datatype": "http://www.w3.org/2001/XMLSchema#decimal" , "type": "typed-literal" , "value": "13" }
      } ,
      {
        "result": { "type": "literal" , "value": "S県S市" } ,
        "count": { "datatype": "http://www.w3.org/2001/XMLSchema#decimal" , "type": "typed-literal" , "value": "12" }
      } ,
      {
        "result": { "type": "literal" , "value": "N県S市" } ,
        "count": { "datatype": "http://www.w3.org/2001/XMLSchema#decimal" , "type": "typed-literal" , "value": "11" }
      } ,
      {
        "result": { "type": "literal" , "value": "A県T市" } ,
        "count": { "datatype": "http://www.w3.org/2001/XMLSchema#decimal" , "type": "typed-literal" , "value": "11" }
      } ,
      {
        "result": { "type": "literal" , "value": "A県K市" } ,
        "count": { "datatype": "http://www.w3.org/2001/XMLSchema#decimal" , "type": "typed-literal" , "value": "10" }
      } ...
    ]
  }
}
     
```

# まとめ

とりあえず望む結果が得られたのですが、クエリー結果が返ってくるまで数十秒かかります。あと SPARQL 久々に書くと脳がしびれますね。