初投稿です。よろしくお願いします。
大学の卒研ゼミでSPARQLの検索演習をしたときに、「自分の興味のある内容を取得する」クエリを作成するという課題がありまして、その時に作成したクエリを紹介したいと思います。
ついでに、Wikidataにある数値と実際の数値とで、誤差とは言えない違いを発見しましたので、そのことについても書いていきます。
#Wikidataとは
Wikidataは、誰でも編集できる無料のナレッジベース。Wikimediaプロジェクトの一つで、Wikipediaのデータベース版といったところでしょうか。Wikidata Query Serviceのページからクエリ言語SPARQLを用いて問い合わせをすることで、Wikidata項目にあるデータを取得することができます。
#目標
Wikidataから鉄道会社ごとの総路線距離を取得しランキングする。
当初の目標は、日本の鉄道路線を路線距離の長い順にランキングすることでしたが、演習結果を提出したところ、「会社ごとの総路線距離を出せたら面白そうだね」ということで手直ししてもらいました。
#日本の鉄道路線を路線距離の長い順にランキングしてみる
Wikidata Query Serviceにアクセスし、以下のクエリを作成して実行しました。
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wd: <http://www.wikidata.org/entity/>
select ?s ?sLabel ?o
where {
?s wdt:P31 wd:Q728937 .
?s wdt:P17 wd:Q17.
?s wdt:P2043 ?o.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],ja". }
}order by desc(?o)
##解説
- ?s wdt:P31 wd:Q728937 → 変数?sに「分類」が「鉄道路線」であるデータを取得
- ?s wdt:P17 wd:Q17 → 変数?s(=鉄道路線)のうち、「国」が「日本」であるデータを取得
- ?s wdt:P2043 ?o → 変数?s(=鉄道路線)の「全長」のデータを変数?oに取得
- order by descで降順にソート
##実行結果
実行結果の確認はこちら
ランキングは以下のようになりました。
山陰本線がトップのようですね。京都~幡生間を日本海側をずーっと通っているので長いのは想像できますが、トップとは…w
山陰本線のwikipediaを見てみると、京都~幡生間は673.8kmで、ここに仙崎支線の2.2kmが加わって676.0kmのようです。
ID | 路線名 | 路線距離[km] |
---|---|---|
wd:Q1135170 | 山陰本線 | 676 |
wd:Q900665 | 東北新幹線 | 674.9 |
wd:Q1190152 | 東海道本線 | 589.5 |
wd:Q681190 | 東北本線 | 575.7 |
wd:Q615964 | 山陽新幹線 | 553.7 |
wd:Q1193436 | 山陽本線 | 537.1 |
wd:Q660895 | 東海道新幹線 | 515.4 |
wd:Q386495 | 奥羽本線 | 484.5 |
wd:Q1052288 | 日豊本線 | 467.2 |
wd:Q1151119 | 函館本線 | 458.4 |
私が自力でやったのはここまでです。
#鉄道会社ごとの総路線距離を取得しランキングしてみる
ここからは手直しして頂いたところになります。
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wd: <http://www.wikidata.org/entity/>
select (SUM(?o) as ?total) ?op ?opLabel
where {
?s wdt:P31 wd:Q728937 .
?s wdt:P17 wd:Q17.
?s wdt:P2043 ?o.
?s wdt:P137 ?op.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],ja". }
}GROUP BY ?op ?opLabel
order by desc(?total)
##解説
先ほどのクエリに、「鉄道会社ごと」に「路線距離」を「合計」する部分を追加してあります。
- select (SUM(?o) as ?total) ?op ?opLabel → SUMで路線距離を合計し変数?totalに代入
- ?s wdt:P137 ?op → 変数?s(=鉄道路線)の「運営者」すなわち所有する会社を変数?opに取得
- GROUP BY ?op ?opLabel → GROUP BYで「鉄道会社ごと」にまとめる
- order by desc(?total) → selectに記述したとおり、会社ごとの総路線距離(?total)を降順にソート
##実行結果
実行結果の確認はこちら
総路線距離[km] | ID | 会社名 |
---|---|---|
6744.9 | wd:Q499071 | 東日本旅客鉄道 |
5217 | wd:Q502125 | 西日本旅客鉄道 |
2785.2 | wd:Q498930 | 北海道旅客鉄道 |
2663.4 | wd:Q513679 | 東海旅客鉄道 |
2013.6 | wd:Q498366 | 九州旅客鉄道 |
1289.1 | wd:Q1190669 | 日本貨物鉄道 |
683.3 | wd:Q50187147 | 嵯峨野観光鉄道 |
496.3 | wd:Q496531 | 四国旅客鉄道 |
330 | wd:Q1531085 | 近畿日本鉄道 |
208.1 | wd:Q1332242 | 東京急行電鉄 |
此方の結果については、wikidata上はこの数値になっていますが、別に調べたところ、東日本旅客鉄道公式のデータでは営業キロ 7,457.3km(2017年4月1日現在)、近畿日本鉄道は501.1km(wikipediaより)のようで、大きな誤差があることがわかりました。
嵯峨野観光鉄道に至っては683.3kmなわけないし、どこから取得したんだこれ…。と思ったら、これ山陰本線の距離もプラスされているな?!wikidataの嵯峨野観光線の項目には本来の7.3kmってデータがちゃんと登録されていますし、たぶんそういうことでしょうね。
#考察
各路線の路線距離を取得するところまではよかったですが、その次の段階でwikidataの不正確さを実感しました。いや、自分が編集したわけじゃないのにこういうこと言うのは失礼ですね、すみません。
今回発見した誤差について、ウィキデータの登録内容に不備があるのか、まだウィキデータ項目が作成されていない路線があるか、いずれにしろ整合性をチェックする必要がありそうです。
Wikidataの編集方法については**こちら**をご覧ください。