DBpediaを使った都道府県別ランキング


[DBpedia](http:dbpedia.org)はWikipediaの情報を元にLOD（Linked Open Data)を作成・公開するコミュニティプロジェクトです．
この記事では，[DBpedia Japanese](http://ja.dbpedia.org)を使ったSPARQLクエリの例として，**「都道府県別ランキング」**の作り方を説明します．

※2016/09/20 DBpedia Japaneseのバージョンアップ（2016-04-28版）に伴いクエリを修正
旧）?pref dcterms:subject category-ja:日本の都道府県.
新）?pref dbpedia-owl:wikiPageWikiLink category-ja:日本の都道府県.

##DBpedia JapaneseのSPARQLエンドポイント
DBpedia JapaneseのSPARQLエンドポイントには，[http://ja.dbpedia.org/sparql](http://ja.dbpedia.org/sparql)からアクセスできます．
以下の紹介するクエリを実際に試したい時は，このサイトをご利用下さい．

##都道府県別の一覧を取得するクエリ
DBpedia Japaneseから日本の都道府県の一覧を取得するクエリは下記のようになります．（**[実行結果](http://ja.dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fja.dbpedia.org&query=PREFIX+dbpedia-owl%3A++%3Chttp%3A%2F%2Fdbpedia.org%2Fontology%2F%3E%0D%0APREFIX+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0D%0APREFIX+category-ja%3A+%3Chttp%3A%2F%2Fja.dbpedia.org%2Fresource%2FCategory%3A%3E%0D%0A%0D%0Aselect+distinct+%3Fpref+where+%7B%0D%0A++%3Fpref+rdf%3Atype+dbpedia-owl%3APlace.%0D%0A++%3Fpref+dbpedia-owl%3AwikiPageWikiLink+category-ja%3A%E6%97%A5%E6%9C%AC%E3%81%AE%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C.%0D%0A%7D%0D%0A&format=text%2Fhtml&timeout=0&debug=on)**）

```
PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX category-ja: <http://ja.dbpedia.org/resource/Category:>

select distinct ?pref where {
  ?pref rdf:type dbpedia-owl:Place.
  ?pref dbpedia-owl:wikiPageWikiLink category-ja:日本の都道府県.
}
```

`?pref dbpedia-owl:wikiPageWikiLink category-ja:日本の都道府県.`は，Wikipedia上で**「日本の都道府県
に分類されている」記事**に相当するデータを取得するためのグラフパターンです．しかし，これだけでは，
<http://ja.dbpedia.org/resource/全国地方公共団体コード>や<http://ja.dbpedia.org/resource/内陸県>のように，**「都道府県以外のデータ」**が検索結果に含まれてしまいます．
そこで，`?pref rdf:type dbpedia-owl:Place.`のように，**「場所のインスタンスである」**ことをAND条件として追加することで，47都道府県の一覧が正しく取れるように工夫しています．


##都道府県別の○○○○一覧を作成するクエリ
次に，先ほどのクエリで取得した都道府県の一覧を使い，**「指定したデータの都道府県別の一覧」**を得るクエリを書いてみましょう．
まずは，下記のクエリをご覧下さい．これは，**「政治家の出生地を，都道府県毎にソート」**したものです．（**[実行結果](http://ja.dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fja.dbpedia.org&query=PREFIX+dbpedia-owl%3A++%3Chttp%3A%2F%2Fdbpedia.org%2Fontology%2F%3E%0D%0APREFIX+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0D%0APREFIX+category-ja%3A+%3Chttp%3A%2F%2Fja.dbpedia.org%2Fresource%2FCategory%3A%3E%0D%0A%0D%0Aselect+distinct+%3Fpref+%3Fs+where+%7B%0D%0A++%3Fpref+rdf%3Atype+dbpedia-owl%3APlace.%0D%0A++%3Fpref+dbpedia-owl%3AwikiPageWikiLink+category-ja%3A%E6%97%A5%E6%9C%AC%E3%81%AE%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C.%0D%0A++%3Fs+rdf%3Atype+dbpedia-owl%3APolitician%3B%0D%0A++++++dbpedia-owl%3AbirthPlace+%3Fpref.%0D%0A%7DORDER+BY+%3Fpref&format=text%2Fhtml&timeout=0&debug=on)**）

```
PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX category-ja: <http://ja.dbpedia.org/resource/Category:>

select distinct ?pref ?s where {
  ?pref rdf:type dbpedia-owl:Place.
  ?pref dbpedia-owl:wikiPageWikiLink category-ja:日本の都道府県.
  ?s rdf:type dbpedia-owl:Politician;
      dbpedia-owl:birthPlace ?pref.
}ORDER BY ?pref
```

先ほどのクエリで得た都道府県の一覧に加えて，

 - 政治家（dbpedia-owl:Politician）の一覧を得る（`?s rdf:type dbpedia-owl:Politician`）
 - 出生地（dbpedia-owl:birthPlace）を得る（`?s dbpedia-owl:birthPlace ?pref`）※


をAND条件として追加しています．（※上記サンプルでは，`?s`が共通となるので，主語の省略表現（主語を省略し，`.`の代わりに`;`でつなぐ）を利用しています．）
`ORDER BY ?pref`は検索結果を都道府県（このクエリでは?prefという変数で表しています）でソートする指定です．

##都道府県別のランキングを作成するクエリ
最後に，都道府県別の一覧で得た結果の数をカウントして，**「都道府県別のランキングを得るクエリ」**を書いてみましょう．
先ほどのクエリを下記のように変更すると，**「政治家の出生地の都道府県別ラインキング」**を得ることができます．（**[実行結果](http://ja.dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fja.dbpedia.org&query=PREFIX+dbpedia-owl%3A++%3Chttp%3A%2F%2Fdbpedia.org%2Fontology%2F%3E%0D%0APREFIX+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0D%0APREFIX+category-ja%3A+%3Chttp%3A%2F%2Fja.dbpedia.org%2Fresource%2FCategory%3A%3E%0D%0A%0D%0Aselect+distinct+%3Fpref+%28count%28%3Fs%29+AS+%3Fc%29+where+%7B%0D%0A++%3Fpref+rdf%3Atype+dbpedia-owl%3APlace.%0D%0A++%3Fpref+dbpedia-owl%3AwikiPageWikiLink+category-ja%3A%E6%97%A5%E6%9C%AC%E3%81%AE%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C.%0D%0A++%3Fs+rdf%3Atype+dbpedia-owl%3APolitician%3B%0D%0A++++++dbpedia-owl%3AbirthPlace+%3Fpref.%0D%0A%7DGROUP+BY+%3Fpref%0D%0AORDER+BY+%3Fc&format=text%2Fhtml&timeout=0&debug=on)**）

```
PREFIX dbpedia-owl:  <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX category-ja: <http://ja.dbpedia.org/resource/Category:>

select distinct ?pref (count(?s) AS ?c) where {
  ?pref rdf:type dbpedia-owl:Place.
  ?pref dbpedia-owl:wikiPageWikiLink category-ja:日本の都道府県.
  ?s rdf:type dbpedia-owl:Politician;
      dbpedia-owl:birthPlace ?pref.
}GROUP BY ?pref
ORDER BY ?c
```

変更した箇所は，以下の通りです．

- 検索結果を都道府県にグループ化する（`GROUP BY ?pref`）
- 検索結果となる政治家の数をカウントして?cに代入する（`(count(?s) AS ?c)`）
- カウントした都道府県毎の数（?c）でソートする（`ORDER BY ?c`）

数のカウントは，都道府県毎にグループ化した上で行っていますので，**「都道府県毎の数」**となります．

##その他のランキングへの応用
このクエリのおもしろいところは，少しクエリを変更するだけで，「様々な都道府県ランキング」が簡単につくれることです．
例えば，先のクエリの政治家（`Politician`）の部分を，下記のような職業に置き換えると，その職業の都道府県別ランキングができます．
`Artist Writer ComicsCreator Politician Athlete Wrestler Model Scientist SoccerPlayer Actor VoiceActor Presenter FigureSkater BaseballPlayer Architect Comedian MusicalArtist Philosopher Royalty`
※これらは，DBpedia Japaneseで出生地（dbpedia-owl:birthPlace）のデータ存在するものを上げています．DBpediaの英語版（本家）では，より多くのデータ存在しているので，様々なランキングの作成ができると思われます．

なお，このクエリで得られるデータは，あくまでも「DBpediaのデータ内」，すなわち，「Wikipediaで記述されている情報」の範囲での結果ですので，**必ずしも，正確なデータであるとは限らない**という点にご注意下さい．
また，よりDBpediaを用いた様々なクエリや，クエリの結果をグラフなどで可視化する方法については，下記を参考にして下さい．

- [SPARQLクエリ集＠LODハッカソン関西](http://wp.lodosaka.jp/tool/sparqlquery/)
- [第4回Linked Open Dataとオントロジー勉強会(SPARQL勉強会)](http://wp.lodosaka.jp/other/lod20151027/)
- [SPARQLでマッシュアップ](http://uedayou.net/sparql-mashup/)
- [オープンデータ時代の標準Web API SPARQL](http://sparqlbook.jp/)