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

Wikidata

はじめに

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

他の記事

第3回:URIで得られたJSONの内容

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

今回のテーマ

今回は、APIを使った操作で返ってきたJSONテキストの内容と構造を解説します。

APIで得られたJSONの例

エンティティ

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

APIサンドボックスが提供されていますので、これも使って試しながらやってください。

例によって、まず毘沙ノ鼻で試します。パラメータは、この通りに設定します。
すると、以下のJSONが返ってきます。

「毘沙ノ鼻」の検索結果
{
    "searchinfo": {
        "search": "毘沙ノ鼻"
    },
    "search": [
        {
            "id": "Q11547503",
            "title": "Q11547503",
            "pageid": 12687429,
            "concepturi": "http://www.wikidata.org/entity/Q11547503",
            "repository": "wikidata",
            "url": "//www.wikidata.org/wiki/Q11547503",
            "display": {
                "label": {
                    "value": "毘沙ノ鼻",
                    "language": "ja"
                }
            },
            "label": "毘沙ノ鼻",
            "match": {
                "type": "label",
                "language": "ja",
                "text": "毘沙ノ鼻"
            }
        }
    ],
    "success": 1
}

これにざっくりとした説明をつけると、こんな感じです。

前回同様、検索にヒットしたエンティティの情報がリストで返ってきます。
(今回は1つだけヒットしましたが)

前回と違って、構造がかなりシンプルなので、そんなに苦労するところはないと思いますが、注意すべきなのは通称や別名での検索です。

match

実は、今回はラベルだけで検索をかけているわけではないんですね。
例えば、「潮岬」で検索をかけると、以下のエンティティがヒットします。

「潮岬」で検索したときの「Q11417658」の情報
(前略)
        {
            "id": "Q11417658",
            "title": "Q11417658",
            "pageid": 12556384,
            "concepturi": "http://www.wikidata.org/entity/Q11417658",
            "repository": "wikidata",
            "url": "//www.wikidata.org/wiki/Q11417658",
            "display": {
                "label": {
                    "value": "和歌山県道41号",
                    "language": "ja"
                },
                "description": {
                    "value": "和歌山県の道路",
                    "language": "ja"
                }
            },
            "label": "和歌山県道41号",
            "description": "和歌山県の道路",
            "match": {
                "type": "alias",
                "language": "ja",
                "text": "潮岬周遊線"
            },
            "aliases": [
                "潮岬周遊線"
            ]
        },
(後略)

「潮岬周遊線」という文字列でヒットしていることがわかります。
なんかよくわからんリストが紛れ込んでます。

一方、ラベル名「和歌山県道41号」で検索をかけた結果は以下のようになります。

「和歌山県道41号」で検索したときの「Q11417658」の情報
{
    "searchinfo": {
        "search": "和歌山県道41号"
    },
    "search": [
        {
            "id": "Q11417658",
            "title": "Q11417658",
            "pageid": 12556384,
            "concepturi": "http://www.wikidata.org/entity/Q11417658",
            "repository": "wikidata",
            "url": "//www.wikidata.org/wiki/Q11417658",
            "display": {
                "label": {
                    "value": "和歌山県道41号",
                    "language": "ja"
                },
                "description": {
                    "value": "和歌山県の道路",
                    "language": "ja"
                }
            },
            "label": "和歌山県道41号",
            "description": "和歌山県の道路",
            "match": {
                "type": "label",
                "language": "ja",
                "text": "和歌山県道41号"
            }
        }
    ],
    "success": 1
}

このように、同じエンティティでも、複数の文字列がマッチすることがあります。
このとき、通称や別名(今の例だと、「潮岬周遊線」)でヒットした場合、$\verb|match|$の$\verb|type|$が$\verb|alias|$(英語で「別名」の意味)になり、$\verb|match|$の下に$\verb|aliases|$という、別名のリストが現れることに注意してください。

プロパティ

基本的に、プロパティも構造はさほど変わりません(プロパティの指定に切り替えるのを忘れないでください)。

以下は、ラベル名「生年月日」(P569)について、2通りの検索をかけた結果です。

「生年月日」で検索したときの結果
{
    "searchinfo": {
        "search": "生年月日"
    },
    "search": [
        {
            "id": "P569",
            "title": "Property:P569",
            "pageid": 15087781,
            "datatype": "time",
            "concepturi": "http://www.wikidata.org/entity/P569",
            "repository": "wikidata",
            "url": "//www.wikidata.org/wiki/Property:P569",
            "display": {
                "label": {
                    "value": "生年月日",
                    "language": "ja"
                },
                "description": {
                    "value": "主題の人物や動物が生まれた日付",
                    "language": "ja"
                }
            },
            "label": "生年月日",
            "description": "主題の人物や動物が生まれた日付",
            "match": {
                "type": "label",
                "language": "ja",
                "text": "生年月日"
            }
        }
    ],
    "success": 1
}
「生誕日」で検索したときの結果
{
    "searchinfo": {
        "search": "生誕日"
    },
    "search": [
        {
            "id": "P569",
            "title": "Property:P569",
            "pageid": 15087781,
            "datatype": "time",
            "concepturi": "http://www.wikidata.org/entity/P569",
            "repository": "wikidata",
            "url": "//www.wikidata.org/wiki/Property:P569",
            "display": {
                "label": {
                    "value": "生年月日",
                    "language": "ja"
                },
                "description": {
                    "value": "主題の人物や動物が生まれた日付",
                    "language": "ja"
                }
            },
            "label": "生年月日",
            "description": "主題の人物や動物が生まれた日付",
            "match": {
                "type": "alias",
                "language": "ja",
                "text": "生誕日"
            },
            "aliases": [
                "生誕日"
            ]
        }
    ],
    "success": 1
}

おんなじですね。

注意

これらの検索は、部分一致検索ではありません。前方一致検索です(たぶん)1
試しに、「県道41号2」で検索をかけてみます。

「県道41号」の検索結果
{
    "searchinfo": {
        "search": "県道41号"
    },
    "search": [],
    "success": 1
}

「Q11417658」がヒットしませんでした。

最後に

これでURIとAPIについてはざっくり触れるようになりました。
次回は実装の要点を解説します。


  1. もしかしたらそこを変更するパラメータがあるかもしれません ↩︎
  2. なんかジャンプ漫画みたいっすね ↩︎

コメント

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