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)」と呼びます。ステートメントは、単純なトリプルを超えた構造を持っています。
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の活用を紹介しています。
- wikibase.cloudでQuickStatementsを試す: CSVデータからWikibaseにデータを投入する方法
- WikibaseSyncを試す: WikidataとローカルWikibaseのデータ同期
Content Negotiation
Wikidataのエンティティに対して、Content Negotiationを使ってプログラムからRDFデータを直接取得することも可能です。筆者がContent Negotiationを使って、PythonでURIからRDFを取得するで紹介した方法は、Wikidataを含むさまざまなLinked Dataソースに対して応用できます。
Wikidataでよく使うプロパティ
| プロパティ | ID | 説明 |
|---|---|---|
| instance of | P31 | 〜のインスタンスである |
| subclass of | P279 | 〜のサブクラスである |
| country | P17 | 国 |
| located in | P131 | 所在する行政区画 |
| country of citizenship | P27 | 国籍 |
| date of birth | P569 | 生年月日 |
| date of death | P570 | 没年月日 |
| place of birth | P19 | 出生地 |
| occupation | P106 | 職業 |
| author | P50 | 著者 |
| publication date | P577 | 出版日 |
| image | P18 | 画像 |
| coordinate location | P625 | 座標 |
| official website | P856 | 公式Webサイト |
| population | P1082 | 人口 |
| inception | P571 | 設立日 |
| genre | P136 | ジャンル |
| award received | P166 | 受賞歴 |
プロパティやアイテムの検索方法
クエリを書く際に、目的のプロパティやアイテムのIDが分からないことがよくあります。以下の方法で検索できます。
- Wikidata検索: https://www.wikidata.org/ の検索ボックスに日本語で入力する
- Wikidata Query Service の補完機能: クエリエディタで
wdt:と入力した後に Ctrl+Space を押すと、プロパティの検索補完が使える - 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エンドポイントの活用方法を学びます。