SPARQLの練習で、乃木坂46メンバー一覧をwikidataから出力してみました。
現メンバーを把握するために、加入日、脱退日でソートします。
ただし当初、脱退日など元データに欠損値はありましたが、だんだんデータの補完が進んでいるようです。
SPARQLのプラットフォーム
wikidata を検索するには、
Wikidata Query Service https://query.wikidata.org/
を使うのが楽ですが、履歴を残すのが面倒なので、
python の SPARQLWrapper を jupyter notebook で使いました。
SPARQLWrapperは普通に以下で入りました。
pip install sparqlwrapper
詳細は、https://github.com/RDFLib/sparqlwrapper にあります。
SPARQLクエリ
以下のクエリを、Wikidata Query Service に貼り付ければ、一覧が表示されます。
https://w.wiki/538A
SELECT ?member ?memberLabel ?startyear ?endyear
WHERE
{
?member wdt:P463 wd:Q185226 .
?member p:P463 ?statement1 .
?statement1 ps:P463 wd:Q185226 .
OPTIONAL { ?statement1 pq:P580* ?startyear FILTER(BOUND(?startyear) && DATATYPE(?startyear) = xsd:dateTime).}
OPTIONAL { ?statement1 pq:P582* ?endyear FILTER(BOUND(?endyear) && DATATYPE(?endyear) = xsd:dateTime).}
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],ja". }
}
order by ?endyear ?startyear
SPARQLクエリの説明
- wd:Q185226(乃木坂46)の wdt:P463(所属メンバー)を変数?memberに代入
- ?member がp:P463(所属メンバー)のノードとなっている団体を変数?statement1に代入
- wd:Q185226(乃木坂46) が目的語となっている(ps:P463) ?statement1 を探す
- ?statement1 が修飾子 開始日(pq:P580)を持って入れば ?startyear に代入
- ?statement1 が修飾子 終了日(pq:P582)を持っていれば ?endyear に代入
- アスタリスク (*) をパス要素の後につけると、その要素のゼロ回以上の繰り返し
なお、p:,ps:,pq: は、ウィキデータ:SPARQLチュートリアルhttps://www.wikidata.org/wiki/Wikidata:SPARQL_tutorial/ja によると以下のとおりです。
接頭辞 p: は目的語を指し示すのではなく、「ある文というノード」を指し示します。そしてこのノードが他のトリプルの主語になります。接頭辞 ps: (property statement の略です) は文を目的語として指し示します。接頭辞 pq: (property qualifier) は修飾子を指し示し、
SPARQLWrapper
これを、SPARQLWrapperで実行するには、以下のようにしました。
from SPARQLWrapper import SPARQLWrapper, JSON
sparql_wikidata = SPARQLWrapper("https://query.wikidata.org/sparql", returnFormat='json')
sparql_wikidata.setQuery("""
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX pq: <http://www.wikidata.org/prop/qualifier/>
SELECT ?member ?memberLabel ?startyear ?endyear
WHERE
{
?member wdt:P463 wd:Q185226 .
?member p:P463 ?statement1 .
?statement1 ps:P463 wd:Q185226 .
OPTIONAL { ?statement1 pq:P580* ?startyear FILTER(BOUND(?startyear) && DATATYPE(?startyear) = xsd:dateTime).}
OPTIONAL { ?statement1 pq:P582* ?endyear FILTER(BOUND(?endyear) && DATATYPE(?endyear) = xsd:dateTime).}
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],ja". }
}
order by ?endyear ?startyear
""")
sparql_wikidata.setReturnFormat(JSON)
results = sparql_wikidata.query().convert()
print(results)
SPARQLWrapper では、出力フォーマットを、XML,JSON,CSV,json-ldなどが選べ、pandasのDataFrameに変換することも簡単なので、再利用には便利だと思います。
おまけ
FILTER("2011-08-22"^^xsd:dateTime <= ?endyear && ?endyear < "2020-01-01"^^xsd:dateTime).
というクエリを加えるといつからいつまでに脱退したメンバーをフィルタできます。