2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

乃木坂46メンバー一覧をwikidataから出力する

Last updated at Posted at 2022-04-10

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).  

というクエリを加えるといつからいつまでに脱退したメンバーをフィルタできます。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?