ウィキデータ(Wikidata)であそぼう:データとデータの関連(グラフ)を使って検索の幅を広げる

ウィキデータで遊ぼう企画の続きです。今回は、データ同士の関係を使ってちょっとウィキデータっぽい検索をしてみます。

前回のエントリこちらで読めます。

suisui.hatenadiary.jp

前回までのエントリでは、橋のデータを橋に登録しているデータでそのまま検索したものを中心に紹介していました。そして、それがExcelのフィルタとほぼ同じとも説明しました。

今回は少しだけ背伸びして、ウィキデータっぽくデータとデータの関係(グラフ)を使った検索の例を紹介します。今回は説明が多目ですが、とても単純なものなので安心してください。

グラフ(ネットワークグラフ)とは何か?を川で見てみる

ここでいうグラフは中学や高校の数学で習ったグラフとは少し違って、[[グラフ理論]]で使うグラフで、日本語ではネットワークグラフという呼び方がやや一般的なようです。ここでは、小難しい説明はやめて具体例を紹介します。

具体例として、川の名前について書いてみます。大阪の川は場所によって色々な名前が付いています。大阪市の北の方を流れている川は、淀川から分岐した大川を水源とする旧淀川と呼ばれる河川群です。この辺りの説明は[[旧淀川]]にあります。川の名前の構成が[[旧淀川#支流と分流]]に書かれているので、分流の方を見てください。

f:id:Suisui:20190507212346p:plain
:w:ja:旧淀川より旧淀川の名称(テーブル)

表の右に書いてある通り、大阪の北の方を流れている川が上流から下流に向けて分岐する川(派流)が順に記載されています。(ただし、若干省略があります。)

表だけでは難解かもしれません。Commonsにある模式図を見てみましょう。

f:id:Suisui:20190507214455p:plain
淀川の模式図 from

File:Kyu-Yodo River.svg - Wikimedia Commons

赤枠で囲った範囲が上記のテーブルに記載されています。絵と見比べてみて、テーブルの読み方はわかったでしょうか。

これをもっと単純化して、文字と線で書いてみたのが以下です。図が大きくなってしまうので寝屋川、住吉川は省略します。

 大川━━━━━┳━堂島川━安治川┳━━━━━━┳大阪湾
       寝屋川 ┗土佐堀川━┛      ┃
             ┃┗木津川━━━━━┳┛
             ┗東横堀川━道頓堀川┛

左側が上流、右側が下流になります。また、川の名前の右側の線は川の名前を延長していると形で記載しています。

各川の名前から、左へ線を辿るとその川の水源(の川)に当たります。 右に辿ると河口(どこに流れ込むか)がわかります。例えば、以下のようなことがわかります。

川の名前と名前をつなぐ線は、川と川の関係のうちの一つ(水源と河口)を表しています。また、線でつながっている同士のデータの関係(水源か、河口か)はわかりますが、直接線でつながっていない同士、例えば木津川と東横堀川はどちらがより上流か、ということはわかりません。

このようにデータとデータの関連を点(名前)と線で示したものをグラフ(ネットワークグラフ)と呼びます。単純なテーブルでは表しにくく、図で書くのは大変な物同士の関連を表す時に使われています。一度くらいは目にしたことがある方もいらっしゃるでしょう。

データとデータの関係をグラフで表せる例は無数にあります。例えば

  • 川の支流と派流
  • 鉄道駅の隣の駅
  • 現職総理大臣の先代の総理大臣
  • ある人物の父親と母親、あるいは子
  • 絵画の所有者とその前の所有者
  • スポーツ選手のコーチ、あるいは弟子
  • ある政党から派生した政党、統合した政党
  • 隣接する自治

など、一対一、一対複数、複数対一、複数対複数と色々なデータ間の関連が存在します。

ウィキデータでは*1、データ間の関連たどって関連あるものを芋づる式に検索することが比較的簡単にできます。ウィキペディアを編集されている方であれば思い当たるものがたくさんあるでしょう。そうです。あの何に使えるのかほとんど分からなかった先代次代、隣接する行政区分などのデータがここでものすごく生きてくるのです。*2

ウィキデータでグラフを表示してみる

ウィキデータでは、データ間の関連からネットワークグラフを作成できます。早速やってみましょう。

データとしては、水源(P885)と河口(P403)をつないで、大川(旧淀川)から大阪湾までをグラフにしてみます。

f:id:Suisui:20190507224558p:plain
旧淀川のグラフ
なんとなく図のような表示になったでしょうか。*3川の名前をクリックしたり、ドラッグしたり、拡大縮小などして適当に遊んでみてください。データ間の関連を示す図であり、間の距離やまとまりはある程度変更できます。しかしデータ間の関連は変わりません。

表示されたページ上部にボタンが並んでいるので、順にクリックしてみてください。

f:id:Suisui:20190507224808p:plain
グラフ上部に表示されているボタン
これはグラフの関連を維持しつつ、配置を変えることができます。川の場合、真ん中にある「上から下への階層レイアウト」が少しわかりやすいかもしれません。

f:id:Suisui:20190508205940p:plain
大阪市の川のグラフ(上から下への階層レイアウト)

データ間の関連を使った検索(のようなもの)

この、データ同士の関連を使って、大川の派流にかかっている橋をすべて検索して地図に表示してみます。

f:id:Suisui:20190508210554p:plain
大川の下流すべての川の橋

複数回検索にかかると、少し丸が大きく表示され*4ます。

実際には次のように二段階で検索しています。

  • 水源を辿ると大川にたどり着く川を検索して川の一覧を作成(グラフで関連があるものを芋づる式に検索(川の水源->川の水源->...->大川))
  • 見つけたそれぞれの川に掛かる橋の位置情報を取得(出てきた川の一覧に含まれるものを対象とした検索)

この結果を地図に表示しています。

この検索をExcelでやる場合かなり手間がかかります。特に水源を複数回かつ不定回数辿ったもので一覧を作るのはなかなか大変です。*5

また、便宜上今回初めてこのデータ間の関連を使ったような書き方をしていますが、結構初めのほうから以下のように類似の検索方法を使っています。

  • 橋を検索する際に、上位クラス(P279)を辿ると橋にたどり着くもの
  • 川を検索する際に運河を含めるため、上位クラスを辿ると水路にたどり着くもの

こういった、データとデータの関連を使った検索は、ウィキデータ*6が得意とするものです。また、従来データベースと言われていたRDBMSExcelでは、できなくはないけれども、大抵は面倒な再帰SQLやサブクエリを使った処理の重たい検索になります。*7その代わり、Wikidataでは普通の一覧のフィルタ処理もそこそこ重たい処理になります。

また、データ間の関連を使用した検索は、データが増えれば増えるほど楽しい*8結果が得られるものになります。そんなこともあって、世界中のみなさんがウィキデータに頑張ってデータを登録しているのだと思います。

応用クエリ

応用といいつつも、グラフになるようなデータ間の関連を直接使った例はありませんね。。精進します。

*1:またはRDFでは

*2:正しくはテンプレートの値すべてが貴重なデータではあります。15年前ぐらいに、この辺を夢見てあのフォーマットを考えていた人たちがいたわけです

*3:全く同じ表示になる可能性はとても低いです

*4:るようなのですがよくわかっていません

*5:やるのであればVBAのマクロで再帰を作って対象となる川の一覧を作成し、その後はピボットテーブルやINDEX,MATCHで実現することになるしょう。

*6:もとい、その元になっているRDF

*7:Rを使ってがんばればできるでしょう。

*8:意外な、あるいは意図通りの