ウィキデータ(Wikidata)であそぼう:画像を検索する

ウィキデータで遊ぼう企画の続きです。今回は、ウィキデータに登録されている画像=大体はウィキペディアに表示されている画像を検索してみます。

前回の記事はこちらで読めます。

suisui.hatenadiary.jp

ウィキデータの項目には、ウィキペディアと同じくウィキメディア・コモンズにある画像を追加することができて、人物の肖像や、項目のものの全体像、ロゴマークなど、様々な画像を見ることができます。

ウィキメディア・コモンズの簡単な紹介

ご存知ない方のために、ウィキメディア・コモンズについて簡単に紹介しておきます。ウィキメディア・コモンズは、ウィキペディア(全言語)で表示される画像の大部分を保存、分配しているサイトです。画像だけではなく、音声やビデオ、プレゼンテーション、PDFなどのメディアファイルを保持し、ウィキペディアや、他のウィキメディアのプロジェクトサイトからは、ファイル名を指定するだけでウィキメディア・コモンズにあるファイルを表示、使用できるようになっています。

f:id:Suisui:20190516063922p:plain
ウィキメディア・コモンズ from https://commons.wikimedia.org/wiki/File:Commons-logo.svg

ファイルのアップロードには、明示的なライセンスの付与と最低限のタグ付けを必要としているため、ウィキメディア・コモンズはなんとなくカテゴリで検索できるフリーっぽいライセンスのファイルが6000万ほど使用できる巨大なサイトになっています。

また、もともとは百科事典的な写真やイラストが多くありましたが、次第に美しい写真も多く集まるようになっており、2010年から[[:w:ja:Wiki Loves Monuments]]という世界最大の写真コンテストの開催もされています。

大阪の橋の画像を出してみる

ウィキデータとコモンズの関係の前に、ウィキデータにある画像を検索してみましょう。これまでと同じく、大阪市にある橋の画像を検索してみます。

f:id:Suisui:20190513221838j:plain
ImageGrid 大阪の橋

Googleでの画像検索のような結果が表示されたはずです。Googleの画像検索とちょっとだけ違うのは、表示された画像は(今の所)大阪の橋の物だけである、ということです。

画像の検索でも、これまで紹介してきたのと同じく、様々な条件で検索結果の絞り込みができます。

いずれも、条件に合うものがぴったり出てきます。

ここでちょっと調子にのって、大阪市の条件を外してみましょう。

世界の橋の画像を検索する

条件としては、大阪市にある、というのを外すだけです。数が多いので100個に制限しています。

というように、場所の条件を外すと全世界が対象となります。

ウィキデータとウィキメディア・コモンズの関係

ウィキデータはウィキペディアと同じく、ウィキメディア・コモンズの画像や音声のファイルを使用しています。一方、コモンズはその各画像のメタデータのうち、例えば作者や所蔵館などの情報をウィキデータから使用していて、両者は互いに補完しあう関係となっています。

ウィキメディア・コモンズは長い間検索が不便、かつメタデータの管理に膨大な手間が割かれています。その改善のため、2017年からwikibaseというウィキデータで採用しているデータベースのシステムをつかったタグ付けのシステムに移行しつつあります。

現在のウィキデータからの検索は、その新しいシステムをほんの少し先取りして体験できるものと言えるでしょう。

ウィキデータで絵画を検索する

せっかくの画像の検索なのでもっと画像的なものを検索してみます。

ウィキメディア・コモンズにはGoogle アートプロジェクトなどの大きなものを含め大量に西洋絵画の画像とそのメタデータが登録されています。

f:id:Suisui:20190513233333j:plain
ラファエロの絵画
など、いずれかの言語版に記事があるある程度昔の画家の絵であればだいたい出てきます。

さらに、これらの画像は様々なプロパティで検索できます。以下にその例を示します。結果を眺めるだけでも興味深いので是非次々開いてみてください。また、以前紹介した条件の変更方法でお好みの検索をしてみてください。*1

いつもに比べて、だいぶたくさんの例を紹介しました。

*1:クエリ・ヘルパーについては後ほどもう少し説明を書く予定でいます

*2:作者、今ある場所、制作地など

ウィキデータ(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:意外な、あるいは意図通りの

ウィキデータ(Wikidata)であそぼう : 検索できるもので検索してみる

ウィキデータの紹介三回目になります。前回のエントリはこちらで読めます。

suisui.hatenadiary.jp

前回は、何が検索できるのか、を知るためにウィキデータのページの読み方を紹介しました。今回は、いろいろな検索をしてそのまま表示してみます。

橋のデータに登録したもの

検索するときに、ウィキデータ全体だと話がややこしくなるので、前々回紹介した大阪市の橋全部の中から検索します。大阪市の橋のそれぞれ、に私が登録していったのはだいたい以下のプロパティ(P)です。

  • 日本語のラベル - 橋の名前
    • 別名
  • 橋の種類 (P31) - 構造での分類、用途での分類など、粒度はまちまち
  • 国 (P17) - 日本
  • 位置する (P131) - 橋のある市町村(区レベル)
  • 位置座標 (P625) - 緯度経度
  • 交差物 (P177) - 橋が交差している川や道路
  • 以下が通る (P2505) - 橋を通る道や鉄道
  • 全長 (P2043) - 橋の長さ
  • 幅 (P2049) - 橋の幅
  • 読み仮名 (P1814) - 名前の読み仮名
  • 開設 (P526) - 橋が開通した日

全てに全てを登録したわけではなく、大部分はウィキペディアにあるものを登録していったので、ないものはなかったりします。また、数個しか登録していないものは省いています。さまざまな要因*1ウィキペディアにあっても登録していなものなどもあります。 それは後で探せるので、あまり気にしなくても大丈夫です。

ウィキデータいろいろ検索やってみよう

その1 特定の川に架かっている橋

大阪駅辺りの川についてはややこしいことになっていて、地形的にまっすぐ繋がっている川でも場所によって名前が変わっています。[[:w:ja:旧淀川]]に書いてあります。

他のものも例として載せておきます。東横堀川道頓堀川木津川

その2 橋ができた時代

紹介のため複数年指定していますが、単年度や、複数(1992年と1980年等)でももちろん指定できます。 今の所、同じところに昔あった橋についてはデータを作っていません。

その3 橋の種類

この辺りはまだデータが弱いのですがこういったものでも検索できます。

橋の種類について、本来は上部、下部の建築様式、橋梁形式、用途分類など建築系のプロパティに含まれるべきものですが、今の所適当なものが見当たらないため現在は分類に登録されている橋がほとんどとなっています。

その4 名前(ラベル)

読みだけではなく、ラベルの漢字や、登録があればローマ字でも検索できます。

その5 橋の長さ

これらの検索はすべて、橋の項目に橋のデータとして登録したものを検索する形にしています。なるべく単純な検索をするようにしたためそうしており、やっている内容としては、(地図に表示するところ以外は)これらの橋のデータをExcelで表に並べて、オートフィルタをかけているのと同じことになります。ものによっては単にデータの並べ替えでも表現できます。

一覧表示

前々回、ウィキデータの検索はこんな感じといってこの図を紹介しました。

f:id:Suisui:20190423000645p:plain
ウィキデータ検索のイメージ

このうち、地図の表示にする手前では、表示する一覧を作成しています。 クリックして開く地図のページの左側の方にカーソルを持って行くとメニューが表示されます。

f:id:Suisui:20190428180658p:plain
地図左側のメニュー

これでTableを選択してみてください。

以前紹介したクエリへのリンク

f:id:Suisui:20190422233949p:plain
Queryサービスへのリンク
から実行ボタンを押して、表示形式のメニューを表示した場合も同じことができます。
f:id:Suisui:20190428181229p:plain
実行ボタンと表示形式メニュー

Tableを選択すると地図に表示している橋を一覧の状態で表示します。

f:id:Suisui:20190428181735p:plain
一覧表示
一覧表示は、Wikitableと同じように並べ替えができます。あと、画面右のほうをいじるとJSONCVSでダウンロードができます。

f:id:Suisui:20190428182020p:plain
ダウンロードメニュー

条件の変更

もう一つ、SPARQLを直接書かずに、条件を簡易的に変更する方法があります。画面左下のWIkidata Query Serviceをクリックしてから、画面上にあるiをクリックすると、クエリ・ヘルパーが表示されます。

f:id:Suisui:20190428182510p:plain
クエリサービスとクエリヘルパー

こちらのリンクはクエリ・ヘルパーで操作しやすいよう、条件を単純に絞っています。

大阪市、と書いてあるところをクリックして、表示されるテキストボックスに横浜市と書くと、候補が表示されます。

f:id:Suisui:20190428183526p:plain
クエリ・ヘルパー 大阪市と書いてあるところ

f:id:Suisui:20190428183647p:plain
表示候補

表示された中で一番上の横浜市を選び、左側の実行ボタンを押すと、横浜市の橋のうち一情報が登録されているものが表示されます。多少うまくいかない地域もありますし、結果が全く表示されない(全く登録されているものがない)地域もあります。

同様に橋を鉄道駅、役所、スタジアム、学校などに変更して、いろいろなところのいろいろなものを見ることができます(しかし日本国内ではまだまだ登録されているものが少ないです)

これらの位置情報は、ウィキペディアの各項目に登録されているものをベースに登録されています。上手に使えば抜けている場所がわかったりするので、興味ある範囲をあちこち覗いてみてください。そして面白いものが見えたら @suisui_wmまでおしえてください。

応用クエリ

ちょっと時間が足りずあまりたくさん用意できませんでした。後ほど追加しようと思います。

*1:眠かったとか

ウィキデータ(Wikidata)であそぼう : ウィキデータの項目ページの読み方(簡単編)

前回に引き続き、ウィキデータの紹介です。前回はここで読めます。suisui.hatenadiary.jp

前回の、ウィキデータでは検索した結果を地図に出せるよ、というところまではあちこちで紹介されいるため、すでに皆さんご存知だったと思います。今回は、検索例をお休みして、より楽しむために次に進む前にウィキデータのページの読み方を紹介します。

今回の説明がざっくりでも理解できれば、次回以降、紹介する検索条件をいじったりできるようになります。単に検索結果の紹介を見たいだけであれば今回は飛ばしてもらっても問題ありません。

ウィキデータじゃなくても

ところで、取り出したデータを地図に表示するだけであれば、Google先生のマイマップのほうが簡単で綺麗にできます。例えばこんな風にです。同様にAPIをつかえばOSMやGeonamesでも同じようなことが可能だと思います。じゃあウィキデータでできることはなんだ?というのを感じて欲しいと色々紹介していこうとしているのですが、目指しているものがカンタンキレイにできるもので十分であるならばどんどん使いましょう。人生は短いので、目的としたものを得られてより簡単にできるツールを選びましょう。

気を取り直して

次は、検索した結果からさらに検索してウィキデータっぽく使って行こうかと思ってます*1

しかし、何が検索できるのかがわかれば、自由にいじくり回してより楽しんでいただけるはずです。そのために、ウィキデータのページ読み方を紹介します。

ウィキデータのページのよみかた簡単編(①、②の③でウィキデータ)

ウィキデータの戎橋の項目を見てみてください。よく人が飛び込んでいるあの橋です。ログインしていると掲載している画像と少し違う表示になりますが大体同じはずです。

まずページの先頭に、Wikipediaと同じように「戎橋」とページの名前が書かれています。しかしURLと比べてみるとわかる通り、ウィキデータでのページのタイトルに当たる項目ID (item)と呼ばれるのは、右側のQで始まる方の番号です。

f:id:Suisui:20190424190248p:plain
アイテムID(Q)とラベル

橋の名前や、その下の別名などは、タイトル行の下にあるラベルが並んだボックス(Termbox、たーむぼっくす)の中の値のうち、日本語に対応するものをそのまま目立つように表示しています。つまり、先頭に表示されている「戎橋」は、Q11495351についた日本語のラベルという扱いになっています。

f:id:Suisui:20190424190715p:plain
Termboxと各ラベル

トップには、今日本語の表示にしているために最初が日本語になっていて、同じページを韓国語UIで見ると Termboxの韓国語に書かれている内容が表示されます。そしてQはその項目を識別するIDであるため、どの言語で表示しても常に同じ値となります。

Termboxはすべてのウィキデータの項目に必ずあるものです。それだけにとても大事で、ウィキデータの特徴の一部が詰まっています。しかし重たくなるので今回はスルーします。

(いまやりたい)検索に関係あるのは、その下に大きな文字で「文」と書かれているところから下になります。

f:id:Suisui:20190424193009p:plain
文(Statement)

文というのは学校のマークではなく、ウィキデータに登録しているデータの一つ一つのことを指します*2。一つの箱が一つの文で、項目内のすべての文はその主語が先ほどみたTermboxのラベルの部分になっています。

QのPは値です(文の読み方)

ウィキデータのQで始まるページ内の文は全て、下の図のように①の②は③です(=QのPは値です)と読むと理解できるようになっています。*3

f:id:Suisui:20190424210951p:plain
文の読み方

大事なことなのでもう一度書きます

QのPは値です*4

ウィキデータのQに書く文は基本的に全てこの形になるよう制限されています。ウィキデータは、このQのPは値ですという文を大量に集めているサイトです。そのため、普通の文章を書くスペースは項目には存在しません。

値について

Pの種類によって値には様々なデータが入ります。しかし値の形式は以下のいずれかになります。

  • 別のQ
    • 戎橋のある国(P17)は日本(Q17)です
  • 文字列 + 言語
    • 戎橋の読み(P1814)は「えびすばし」です
  • 日付
    • 戎橋のできた年(P571)は2007年です
  • 数値 + 単位
    • 戎橋の全長(P2043)は18mです
  • 位置座標(緯度 + 軽度)
    • 戎橋の位置座標(P625)は34°40'8.602"N, 135°30'4.900"Eです

なお、画像やファイルはウィキメディア・コモンズに置くことになっていて、ファイル名の文字列で表現できます。また、数式楽譜表記も文字列でできるようになっています。

文(statement)で説明できるもの

この形式に限定すると、小説を書くことは出来ません*5。しかし、この世にあるものはほぼ全て*6文の組み合わせで表現できます。

どの程度細かな表現が現わせるかは、どのようなP/Qが存在するかにより決まります。当然ながら、現段階でのウィキデータではまだ表現できなものもあります。

そして、今表現できないものも表現できるようにするために、日々開発が続けられています。開発を進めている面々には、少なくとも百科事典に書かれている内容は全部この形で表現できるようにするぞ、という気迫を感じる開発状況となっているので、色々期待していいんじゃないかと思っています。

何を検索できるのか

ようやく目的の、検索に到達しました。

ウィキデータでは、QのPは値です、という文を大量に集めているので以下のような検索ができます。

  • Pが特定の値を持つQ
  • Pが特定の範囲の値を持つQ
  • 特定のPが存在しないQ

具体例の方が貧弱ですみません。2019年4月現在でPは6077種類、Qは63303000ほどあり、その組み合わせだけでも気が遠くなるほどの検索が可能です。また、これらの検索を組み合わせて絞り込んだり、複数の結果をマージ、あるいは差分を取ることなどができるため、無限の検索が可能となっています。

しかし無限無限といっていても仕方ないので、何ができるか紹介しようというのがこの遊ぼう企画です。今回は説明メインになりましたが、次回はこの説明も活かしてモリモリ検索していきます。

*1:正確には前回でもすでにやってはいます。

*2:文=Statement (すてーとめんと) といいます

*3:中には日本語が全く見えないページも多数存在するため理解できるかは言語能力にも左右されますが、言語がわからなくても同じ構造になっているのでかなり類推できます。

*4:この形式を、トリプル、あるいはトリプレットといいます

*5:断定はできません。。。しかし非常にむずかしいでしょう

*6:それが何であるかわかっている限り=百科事典のような記載ができるものである限りという条件がつきます。なお、わかっていないものでも不明という定義をつけたり、1300年ごろ、のように範囲だけ指定することはできます。

ウィキデータ(Wikidata)であそぼう : 基本の検索と地図表示

ウィキデータの基本的な使い方は、検索になります。

Google検索で皆さんが美味しいおうどんのお店を探したり、100年前に活躍した政治家についての情報を探したりするように、ウィキデータにあるデータから欲しいデータを探すのです。

しかし日本語のデータはまだあまり充実しておらず、お手軽に楽しさを実感できるものとそうでもないものの落差がとても激しい状態です。私が面白いと思うものが皆さんにも刺さるかどうかは全くわかりません。

そこで、特に興味がなくても馴染みがある一般的なもの、小さくある程度まとまったデータとして、大阪周辺にある橋のデータをそこそこ整備をしてみました。*1

橋、皆さんご存知だと思いますが、あの川とかに掛かっている橋です。

まずは検索してみる

ウィキデータで大阪市北区の橋を検索をクリックすると、赤い点の付いた大阪駅周辺の地図を表示します。

f:id:Suisui:20190422224940p:plain
大阪市北区の橋検索結果

クリックした先の地図はおおかたGoogleMapと同じように移動や拡大縮小できます。赤い点をクリックすると、橋の名前と位置が表示されます。

地図の表示があまり凝っていないのは、今の所はウィキデータは地図に特化したサイトじゃないのでそのへんあんまり頑張ってないんだぐらいに思っていただけるといいかと思います。

表示までの仕組み

この地図は、私があらかじめ作っておいたものではなく、クリックしてからウィキデータ内を検索して結果を地図に表示しています。そのため、ウィキデータにある位置情報を変更してもう一度クリックすると実際に位置が変わります。

リンクには、ウィキデータを検索するのに使うSPARQL(スパークル)という言語で、大阪市北区の橋を地図に表示してね、と書いています。言語でどう書くかはひとまず置いておいて、当たり前すぎて申し訳ないのですが、検索している様子は以下のような絵にできます。

f:id:Suisui:20190423000645p:plain
ウィキデータの検索のイメージ

後々SPARQLについてもかければ書いていこうと思うので、まだ焦る必要はありませんが、実際にどう書いているか興味のある方は、地図の画面左下にあるWikidata Query Serviceという文字をクリックしてみてください。コメントを読めば大したことが書いてないことがわかるかと思います。

f:id:Suisui:20190422233949p:plain
検索SPARQL表示のリンク

ウィキデータでは、橋や大阪市北区といったモノは、ラベルではなくQに数字が何桁か付いたIDで指定しています。また、Pに数字が続いているのはプロパティと呼んでいて、普通に表を書いたときに左側に並ぶ「なんであるか」の属性の定義です。ウィキペディアを編集される方であれば、infoboxの左側に並んでいるものがP、右側に並んでいるものがQと理解するのがわかりやすいかもしれません。今回は細かくは省きます。

f:id:Suisui:20190423000430p:plain
京橋よりinfoboxとウィキデータのPとQの関係

これから紹介する例でもSPARQLを使っていきますが、今わからなくても特に気にする必要はありません。触れたことのない人はみんな難しいと思っていて、多言語化など扱いやすくするため方法が今検討されています。今回は、ウィキデータ、検索するならSPARQL、とだけ覚えていただけると少し楽しくなるでしょう。

ちょっといじってみる

ウィキデータの面白いところは、検索での絞り込み条件をユーザーが自由自在に操れることです。

例えば、北区ではなく中央区の橋にする場合、検索で北区のIDにしていたところを中央区のIDに変更するだけです。そして、ちょっと工夫して、大阪市の区全部に登録されている橋というのもできます。*2

感覚としてはおうどんやさんを探してたけど、やっぱりピザ屋さんにしよう、ぐらいの感覚です。

こういった形で、データをいろいろな形で検索し、それをそれっぽい表示にすることができます。

今回の例に必要なデータ

応用クエリ

今回はほとんど同じ方法で、検索する場所や物を変えた物を紹介します。

*1:ほかにこんなものでやってみたい、というご希望などあれば教えていただけるとなんかできるかもしれません

*2:大阪市にある区を検索し、それらが所在地になっている橋を検索しています

ウィキデータ(Wikidata)であそぼう : はじめに

これから何度か、ウィキデータ(Wikidata)を使った遊び方を紹介しようと思います。

まず、少しだけウィキデータを紹介しておきす。ウィキペディアを運営しているウィキメディア財団がやっている名前のとおりデータを集めているサイトです。詳しくはWikidata:はじめにに説明があります。2012年に出来て、3月で全編集回数が英語版ウィキペディアを追い抜いたとても活発なサイトです。いまのところ日本語圏からの投稿者は少なく、とてものどかな雰囲気です。

とてもとても楽しいサイトですし、世界はすでにそれに気づいてすごい勢いで成長しています。そんなウィキデータでできることを、少しでも紹介して日本語の皆さんにも楽しんでもらおう、とこのエントリを書き始めました。

データの作り方についてはちょっと後回しにします。というのも、データを作るのに直接ウィキデータを編集する必要はないからです。ウィキデータにデータをつくりたい場合、ウィキペディアのinfoboxにデータを作っていくのが今の所一番お手軽です。

もちろんウィキデータの使い方を覚えてしまえさえすれば、早く、お手軽に、大量の処理も出来ます。しかしそのために覚えなければならないことが結構あり、それも分野とごとに異なります。使い方を覚えてからやりたいことが(まだ)できなかった、ちょっと思ってたのと違う、あるいは全然進まない。などのリスクを減らすお手伝いになれば良いなと思っています。

なお、編集方法についてどなたにでも、ほとんどの分野に当てはまるような書き方ができるものは、だいたいがすでにHelp:目次に書かれているので、急いで編集したい方はそちらを読んでみてください。

Wikidataにある日本語ラベル数のカウントができなくなってしまった話

一昨年かその前の年だと思いますが、日本語ラベルがついたものがいくつあるかをカウントするために、

select (count(*) as ?item) where {
    ?item rdfs:label ?l.
    Filter(lang(?l) = 'ja') 
}

というクエリで素直にカウントできていたように思います。

残念ながら結果を残せていないのですが、当時はjawpの記事数にちょっと盛ったぐらいで200万件なかった記憶があります。

こういうプロジェクトではレコード数が増えるに応じてitem間の関連が爆発的に増えていくため、サーバのスベックが変わらない限り徐々にできることが減っていくのは予想の範囲内なのですが、どうやら既に普通の方法ではカウントできなくなっていたようです。昨年タイムアウトが短くなった時に試しておけばよかったです。。

今日試したところ、上記のクエリではlimitをつけても100000までカウントできませんでした。

また、

select (count(*) as ?item) where{
  select ?item where {
  ?item rdfs:label ?l.
  Filter(lang(?l) = 'ja') 
  MINUS{
      ?article schema:about ?item ;
             schema:isPartOf <https://ja.wikipedia.org/> .
    }
  } limit 10000
}

こんな感じでjawpの数との差分を取るのもタイムアウトしてしまいました。

今実装されているクエリ・サービスでのクエリの最適化は、あまり性能が良くないようなので、裏技的にやる方法はあるのではないかと思ったりはしています。

しかし裏技的に頑張ってできてもスケールしないため、何か上手にカウントする方法ご存知の方は教えてください。(主に)わたしが喜びます。