API, URIとPythonを使って、Wikidataからデータを取得する (3) URIで得られたJSONの内容

Wikidata

はじめに

この記事は、Wikidataから「日本の首都は?」のように、「○○の××は何か?」ということを調べる方法についての記事です。

他の記事

第2回:Wikidata URIとAPI

このシリーズの他の記事は、「Wikidata」カテゴリーから飛んでください。
スマホの方は画面右下の「サイドバー」ボタンから、それ以外の方は画面右側のサイドバーから。

今回のテーマ

今回は、URIを使った操作で返ってきたJSONテキストの内容と構造を解説します。
例によってJSONとは何かはほぼ解説しません。何なら私もよくわかってません。

URIで得られたJSONの例

URIで得られたJSONの例を示します。
(必要であれば、第2回の内容も参照してください)

例えば、毘沙ノ鼻(本州最西端の岬です)のJSONなんかが短くていいでしょう。
以下がそのURIです。

https://www.wikidata.org/wiki/Special:EntityData/Q11547503.json

これを開くと、以下の画像のようになります。
そのままだと見づらいので、以下のように「プリティ プリント」にチェックを入れると、入れ子構造がインデントされて見やすいです。
(スマホから開くとチェックボックスがないはずなので、JSONきれいなどの整形ツールを使うと便利)

様々な情報が、中かっこ{}や、大かっこ[]でグループ化されているのがわかります。
中かっこは、マップ(pythonでは辞書)という構造で、大かっこは、リスト(あるいは配列)という構造になっています。
マップとリストについて特に説明はしません。悪しからず。

これにざっくりとした説明をつけると、以下のようになります。

青色で着色してある、エンティティ自体の情報には、$\verb|labels|$(エンティティ名)や、$\verb|descriptions|$(エンティティの説明文)などが各言語で書かれているのがわかります。

緑色で着色してある、プロパティのマップには、$\verb|claims|$というブロックの中に、赤色各プロパティの内容というブロックが複数置かれています。

各プロパティの情報

各プロパティの内容内部を見てみます。
まずは、一番上のP17(「国」のプロパティIDです)ブロックを参考に説明します。

いろいろな情報が格納されていますが、今シリーズで必要なのは、$\verb|mainsnak|$内の$\verb|datavalue|$と$\verb|datatype|$です。

datavalue

まず、$\verb|datavalue|$は、要素として$\verb|value|$と$\verb|type|$を持ちます。

$\verb|value|$には、第1回で説明したや、その関連情報がマップとして格納されています。
ただし、P2671(下から二番目の赤枠)のように、マップになっていない場合もあるので注意。

$\verb|type|$には、その値の型を示します。
後述する$\verb|datatype|$と混同しないようにしてください。
どちらかというと、$\verb|type|$はプログラミングでいうところの構造体名クラス名に近い印象です(個人的感想)。

P17では、$\verb|wikibase-entityid|$となっています。確かにエンティティのIDです。
他のプロパティを見ても、$\verb|wikibase-entityid|$を$\verb|type|$に持つものは、$\verb|value|$に全く同じキーを持っていることがわかると思います。

datatype

$\verb|datatype|$には、その値がどのような種類かを示しています。

赤枠のうち下2つを見てください。
これらのブロックの$\verb|datavalue|$は、どちらも$\verb|type|$が$\verb|string|$であるような$\verb|value|$を持ちます。つまり値の型は同じです。
しかし、その値は、片方は外部ID、もう片方は画像の名前と、内容は全く違います。

値が複数存在する場合

先ほどの例で、$\verb|claims|$というキーを持つ値の中に、プロパティIDをキーとしたマップが入っているということが分かったと思います。
そのマップの値それぞれがリストになっていて、そのリストにさらに別のマップが格納されていることを確認してください。

どうしてこのような構造になっているかというと、第1回で説明したように、値は複数存在し得るからです。

下に示すのは、潮岬(本州最南端の岬です)のJSONの抜粋です。

リストの中に、マップが2つ格納されているのが確認できます。

このように見ると、第1回の最後に説明した、エンティティ、プロパティ、値の階層構造がイメージしやすくなったのではないかと思います。

最後に

次回はAPIを用いた場合のJSONの構造を説明します。

コメント

タイトルとURLをコピーしました