内容が古くなっている可能性がありますのでご注意下さい。
昨年末に開催した第14回ウィキペディア街道「大山道」では、ウィキデータの勉強会も開催し、これまでにウィキペディア街道「大山道」で作成した記事に対応するウィキデータ項目への入力を行いました。
ダウンロード:記事を書いたらウィキデータに入力しよう!
そこで、Wikidata Query Serviceを使用してウィキデータ項目へのデータ入力の状況を確認してみます。
特定の主語に対する述語と目的語のペアは以下のような簡単なクエリで得ることができます。
SELECT ?p ?o WHERE { wd:Q46570989 ?p ?o. }
しかし、これでは、ウィキデータに文として入力した以外にも多くの述語と目的語のペアが返されてしまいます。
ウィキデータの文で使用するプロパティは特定の名前空間(wdt: <http://www.wikidata.org/prop/direct/>)に属しています。そこで、そのURIを使用してフィルタをかけます。
SELECT ?p ?o WHERE { wd:Q46570989 ?p ?o. FILTER(STRSTARTS(STR(?p), "http://www.wikidata.org/prop/direct/")) }
文のみを取り出すことができました。
しかし、wdt:P17と表示されても、それが何だか分かりません。連載の第1回に出てきたウィキデータ・クエリの拡張機能である Label service
SERVICE wikibase:label { bd:serviceParam wikibase:language "ja". }
を利用すると項目のラベルを取得することができます。
ただし、単純にプロパティのラベル(?pLabel)を表示するのではなく、
BIND( IRI(REPLACE( STR(?p),"prop/direct/","entity/" )) AS ?p2).
名前空間のプレフィクスを<http://www.wikidata.org/entity/>(wd:)に変更し、プロパティに対応する項目を取得し、そのラベルを表示します。
SELECT ?p ?p2Label ?o WHERE { wd:Q46570989 ?p ?o. FILTER(STRSTARTS(STR(?p), "http://www.wikidata.org/prop/direct/")) BIND( IRI(REPLACE( STR(?p),"prop/direct/","entity/" )) AS ?p2). SERVICE wikibase:label { bd:serviceParam wikibase:language "ja". } }
これで、特定のウィキデータ項目の文の一覧ができました。
ウィキペディア街道「大山道」では、これまでに37本の記事を執筆しました。そこで、これらの記事のすべてについて、主語・述語・目的語のトリプルを取得します。
主語となるウィキデータ項目が複数あることになりますが、そのような場合、主語を ?s と変数にした上で、VALUES を用いてその値を複数割り当てる事ができます。
?s ?p ?o. VALUES ?s {wd:Q46570989 wd:Q46572778 wd:Q40087216 wd:Q43594812 wd:Q38276497 wd:Q38276496 wd:Q30934100 wd:Q30934148 wd:Q29538076 wd:Q30926312 wd:Q28691730 wd:Q28691732 wd:Q28688692 wd:Q28688694 wd:Q28687098 wd:Q27955487 wd:Q28684938 wd:Q28682478 wd:Q28682477 wd:Q24859574 wd:Q24859564 wd:Q24875609 wd:Q24875968 wd:Q22120279 wd:Q24890318 wd:Q22129512 wd:Q22118554 wd:Q21480958 wd:Q21655246 wd:Q21652572 wd:Q22119183 wd:Q21019858 wd:Q22118929 wd:Q21019097 wd:Q20044217 wd:Q20043481 wd:Q20644559}
完全なクエリは以下のようになります。
SELECT ?sLabel ?p ?p2Label ?o WHERE { ?s ?p ?o. VALUES ?s {wd:Q46570989 wd:Q46572778 wd:Q40087216 wd:Q43594812 wd:Q38276497 wd:Q38276496 wd:Q30934100 wd:Q30934148 wd:Q29538076 wd:Q30926312 wd:Q28691730 wd:Q28691732 wd:Q28688692 wd:Q28688694 wd:Q28687098 wd:Q27955487 wd:Q28684938 wd:Q28682478 wd:Q28682477 wd:Q24859574 wd:Q24859564 wd:Q24875609 wd:Q24875968 wd:Q22120279 wd:Q24890318 wd:Q22129512 wd:Q22118554 wd:Q21480958 wd:Q21655246 wd:Q21652572 wd:Q22119183 wd:Q21019858 wd:Q22118929 wd:Q21019097 wd:Q20044217 wd:Q20043481 wd:Q20644559} FILTER(STRSTARTS(STR(?p), "http://www.wikidata.org/prop/direct/")) BIND( IRI(REPLACE( STR(?p),"prop/direct/","entity/" )) AS ?p2). SERVICE wikibase:label { bd:serviceParam wikibase:language "ja". } }
実行すると、37の項目について、主語のラベル、述語、述語のラベル、目的語を表示することができました。