Wikidataとは

Wikidata(ウィキデータ)は、ウィキメディア財団が運営する自由な知識ベースです。Wikipediaが人間向けの百科事典であるのに対し、Wikidataは機械向けの構造化されたデータベースとして設計されています。2012年にプロジェクトが開始され、現在では1億を超えるアイテム(データ項目)が登録されています。

Wikidataの最大の特徴は、多言語対応の構造化データが誰でも編集可能な形で公開されていることです。そして、Wikidata Query Service(https://query.wikidata.org/)を通じて、SPARQLでデータにアクセスできます。

筆者はWikidataを活用したさまざまな実践を行ってきました。たとえば、人物の生没年を取得するクエリ、Wikidata Reconciliation Serviceの活用、Wikibase環境でのデータ管理などです。本章では、これらの経験をもとにWikidata Query Serviceの実践的な活用方法を解説します。

Wikidataのデータモデル

アイテム(Item)

Wikidataにおけるデータの基本単位は「アイテム(Item)」です。アイテムは Q で始まるIDで識別されます。

  • Q1195 — 夏目漱石
  • Q17 — 日本
  • Q7725634 — 文学作品
  • Q515 — 市

プロパティ(Property)

アイテム間の関係やアイテムの属性を記述するために「プロパティ(Property)」が使われます。プロパティは P で始まるIDで識別されます。

  • P31 — instance of(〜のインスタンスである)
  • P279 — subclass of(〜のサブクラスである)
  • P17 — country(国)
  • P569 — date of birth(生年月日)
  • P570 — date of death(没年月日)
  • P50 — author(著者)
  • P27 — country of citizenship(国籍)
  • P106 — occupation(職業)
  • P18 — image(画像)
  • P625 — coordinate location(座標)

ステートメント(Statement)

Wikidataでは、アイテムとプロパティの組み合わせを「ステートメント(Statement)」と呼びます。ステートメントは、単純なトリプルを超えた構造を持っています。

QRueafleirfeinecre

Wikidataの名前空間

プレフィックス名前空間用途
wd:http://www.wikidata.org/entity/アイテムやプロパティの識別
wdt:http://www.wikidata.org/prop/direct/直接的なプロパティ値(最もよく使う)
wikibase:http://wikiba.se/ontology#Wikibase固有の語彙
p:http://www.wikidata.org/prop/ステートメントノードへのリンク
ps:http://www.wikidata.org/prop/statement/ステートメントの値
pq:http://www.wikidata.org/prop/qualifier/修飾子の値

最初は wd:wdt: の2つだけ覚えれば十分です。

Wikidata Query Service

Wikidata Query Service(https://query.wikidata.org/)は、WikidataのSPARQLエンドポイントにアクセスするためのWebインターフェースです。

ラベルサービス

Wikidataでは、アイテムIDだけでは人間には意味が分かりません。ラベルサービスを使うと、自動的にアイテムの人間可読なラベルを取得できます。

SELECT ?item ?itemLabel
WHERE {
  ?item wdt:P31 wd:Q6256 .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}

SERVICE wikibase:label ブロックを追加すると、?item に対応する ?itemLabel という変数が自動的に生成されます。

実践クエリ集

人物の生没年を取得する

筆者はWikidataから人物の生没年を取得するで、特定の人物の生没年を取得するクエリを紹介しています。基本的なクエリは以下のとおりです。

SELECT ?person ?personLabel ?birthDate ?deathDate
WHERE {
  VALUES ?person { wd:Q1195 wd:Q272877 wd:Q313041 }
  OPTIONAL { ?person wdt:P569 ?birthDate . }
  OPTIONAL { ?person wdt:P570 ?deathDate . }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}

日本の世界遺産一覧

#defaultView:Map
SELECT ?site ?siteLabel ?coord ?image
WHERE {
  ?site wdt:P31 wd:Q9259 .
  ?site wdt:P17 wd:Q17 .
  OPTIONAL { ?site wdt:P625 ?coord . }
  OPTIONAL { ?site wdt:P18 ?image . }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
ORDER BY ?siteLabel

このクエリの結果を「Map」表示に切り替えると、世界遺産の所在地が地図上にプロットされます。

日本の作家と代表作

SELECT ?author ?authorLabel ?work ?workLabel ?pubDate
WHERE {
  ?author wdt:P31 wd:Q5 .
  ?author wdt:P27 wd:Q17 .
  ?author wdt:P106 wd:Q36180 .
  ?work wdt:P50 ?author .
  ?work wdt:P31 wd:Q7725634 .
  OPTIONAL { ?work wdt:P577 ?pubDate . }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
ORDER BY ?authorLabel ?pubDate
LIMIT 100

日本の美術館・博物館

SELECT ?museum ?museumLabel ?coord ?image ?websiteUrl
WHERE {
  {
    ?museum wdt:P31/wdt:P279* wd:Q33506 .
  }
  UNION
  {
    ?museum wdt:P31/wdt:P279* wd:Q207694 .
  }
  ?museum wdt:P17 wd:Q17 .
  OPTIONAL { ?museum wdt:P625 ?coord . }
  OPTIONAL { ?museum wdt:P18 ?image . }
  OPTIONAL { ?museum wdt:P856 ?websiteUrl . }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
ORDER BY ?museumLabel

作品数が多い日本の作家ランキング

SELECT ?author ?authorLabel (COUNT(?work) AS ?workCount)
WHERE {
  ?author wdt:P31 wd:Q5 .
  ?author wdt:P27 wd:Q17 .
  ?author wdt:P106 wd:Q36180 .
  ?work wdt:P50 ?author .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
GROUP BY ?author ?authorLabel
ORDER BY DESC(?workCount)
LIMIT 30

修飾子の取得

修飾子(Qualifier)にアクセスするには、wdt: ではなく p: / ps: / pq: の名前空間を使います。

SELECT ?person ?personLabel ?positionLabel ?start ?end
WHERE {
  ?person wdt:P31 wd:Q5 .
  ?person p:P39 ?statement .
  ?statement ps:P39 wd:Q274948 .
  OPTIONAL { ?statement pq:P580 ?start . }
  OPTIONAL { ?statement pq:P582 ?end . }
  BIND(wd:Q274948 AS ?position)
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
ORDER BY ?start

画像ギャラリーとタイムライン

Wikidata Query Serviceでは、#defaultView: コメントで結果の表示形式を指定できます。

#defaultView:ImageGrid
SELECT ?item ?itemLabel ?image
WHERE {
  ?item wdt:P31 wd:Q3305213 .
  ?item wdt:P170 wd:Q5598 .
  ?item wdt:P18 ?image .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
#defaultView:Timeline
SELECT ?person ?personLabel ?birthDate ?deathDate ?image
WHERE {
  ?person wdt:P31 wd:Q5 .
  ?person wdt:P27 wd:Q17 .
  ?person wdt:P106 wd:Q36180 .
  ?person wdt:P569 ?birthDate .
  OPTIONAL { ?person wdt:P570 ?deathDate . }
  OPTIONAL { ?person wdt:P18 ?image . }
  FILTER(?birthDate >= "1850-01-01"^^xsd:dateTime)
  FILTER(?birthDate < "1950-01-01"^^xsd:dateTime)
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
ORDER BY ?birthDate
LIMIT 50

Wikidataのエコシステム

Reconciliation Service

Wikidataには、手元のデータとWikidataのアイテムを照合するReconciliation Serviceがあります。筆者はhttps://wikidata.reconci.link/の一部を試すで、このサービスの活用方法を紹介しています。テキスト形式の人名や地名をWikidataのIDに結びつける際に非常に便利です。

Entity Lookup

cwrcのwikidata-entity-lookupを使うと、テキストからWikidataのエンティティを検索できます。筆者はcwrcのwikidata-entity-lookupを試すで、TEIエンコーディングとの連携も含めて紹介しています。

Wikibase

Wikidataと同じソフトウェア基盤であるWikibaseを使えば、自分自身のナレッジベースを構築できます。筆者は以下の記事でWikibaseの活用を紹介しています。

Content Negotiation

Wikidataのエンティティに対して、Content Negotiationを使ってプログラムからRDFデータを直接取得することも可能です。筆者がContent Negotiationを使って、PythonでURIからRDFを取得するで紹介した方法は、Wikidataを含むさまざまなLinked Dataソースに対して応用できます。

Wikidataでよく使うプロパティ

プロパティID説明
instance ofP31〜のインスタンスである
subclass ofP279〜のサブクラスである
countryP17
located inP131所在する行政区画
country of citizenshipP27国籍
date of birthP569生年月日
date of deathP570没年月日
place of birthP19出生地
occupationP106職業
authorP50著者
publication dateP577出版日
imageP18画像
coordinate locationP625座標
official websiteP856公式Webサイト
populationP1082人口
inceptionP571設立日
genreP136ジャンル
award receivedP166受賞歴

プロパティやアイテムの検索方法

クエリを書く際に、目的のプロパティやアイテムのIDが分からないことがよくあります。以下の方法で検索できます。

  1. Wikidata検索: https://www.wikidata.org/ の検索ボックスに日本語で入力する
  2. Wikidata Query Service の補完機能: クエリエディタで wdt: と入力した後に Ctrl+Space を押すと、プロパティの検索補完が使える
  3. SPARQLで検索する:
SELECT ?property ?propertyLabel ?propertyDescription
WHERE {
  ?property a wikibase:Property .
  ?property rdfs:label ?propertyLabel .
  FILTER(lang(?propertyLabel) = "ja")
  FILTER(CONTAINS(?propertyLabel, "著者"))
}

まとめ

本章では、Wikidataの構造とWikidata Query Serviceを用いたSPARQLクエリの実践方法を学びました。重要なポイントを振り返ります。

  • Wikidataはアイテム(Q番号)とプロパティ(P番号)で構造化された自由な知識ベース
  • wd: はアイテムの識別、wdt: は直接的なプロパティ値の取得に使う
  • ラベルサービス(SERVICE wikibase:label)で人間可読なラベルを自動取得できる
  • 修飾子へのアクセスには p: / ps: / pq: の名前空間を使う
  • #defaultView: コメントで結果の表示形式(地図、タイムライン、画像グリッド等)を指定できる
  • Reconciliation ServiceやWikibaseなど、Wikidataを中心としたエコシステムが充実している

次章では、日本のデジタルアーカイブの統合ポータルであるジャパンサーチのSPARQLエンドポイントの活用方法を学びます。

関連記事