ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Wikidata Query Service:SPARQLで探る知識グラフ活用ガイド

Wikidata Query Service:SPARQLで探る知識グラフ活用ガイド

はじめに デジタル・ヒューマニティーズの研究において、構造化されたデータは極めて重要なリソースです。人物、場所、作品、出来事などの情報が機械可読な形で整理されていれば、大規模なデータ分析や異なるデータセット間の連携が可能になります。 Wikidata は、ウィキメディア財団が運営する自由な知識ベースで、1億件以上の項目(アイテム)を収録しています。そして Wikidata Query Service は、このデータベースに対してSPARQLクエリを実行し、結果をさまざまな形式で可視化できる無料のWebサービスです。 Wikidata Query Serviceの特徴 1. SPARQLによる柔軟な検索 SPARQL(スパークル)は、RDF(Resource Description Framework)データを検索するためのクエリ言語です。SQLに似た構文で、Wikidataの知識グラフに対して複雑な条件での検索を行えます。 例えば、「日本出身で、ノーベル賞を受賞した人物の一覧」や「17世紀にヨーロッパで出版された書籍のうち、現在デジタル化されているもの」といった、複数の条件を組み合わせた高度な検索が可能です。 2. 多様な結果表示 クエリの結果は、以下のような形式で表示できます。 テーブル: 標準的な表形式での表示 地図: 座標データを含む結果を地図上にプロット タイムライン: 時間情報を持つデータの時系列表示 バブルチャート: 数値データの比較 折れ線グラフ / 棒グラフ: 統計的な可視化 ツリーマップ: 階層的データの表示 画像グリッド: 画像URLを含むデータのギャラリー表示 3. 豊富なサンプルクエリ Wikidata Query Serviceには、多数のサンプルクエリ(Examples)が用意されています。SPARQLに不慣れな方でも、サンプルを参考にしながら自分のクエリを組み立てることができます。 4. Linked Open Data との連携 Wikidataは Linked Open Data(LOD)の中核的なハブとして機能しています。各アイテムは一意のURI(例:Q42 = ダグラス・アダムズ)を持ち、他の知識ベース(DBpedia、VIAF、GNDなど)とのリンク情報を含んでいます。 SPARQLの基本 基本的なクエリ構造 SPARQLクエリの基本構造は以下の通りです。 SELECT ?item ?itemLabel WHERE { ?item wdt:P31 wd:Q5 . # instance of: human ?item wdt:P27 wd:Q17 . # country of citizenship: Japan ?item wdt:P166 wd:Q35637 . # award received: Nobel Prize SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . } } wdt:P31 はプロパティ「分類(instance of)」 wd:Q5 はアイテム「人間(human)」 SERVICE wikibase:label は自動的にラベル(名称)を取得する構文 よく使うプロパティ プロパティ 意味 例 P31 分類(instance of) Q5(人間)、Q515(都市) P17 国 Q17(日本) P27 国籍 P569 生年月日 P570 没年月日 P625 座標 P18 画像 P106 職業 DH研究での活用例 歴史人物の分析 特定の時代・地域の人物データを抽出し、職業分布や活動地域を分析できます。 ...

Content Negotiationを使って、PythonでURIからRDFを取得する

Content Negotiationを使って、PythonでURIからRDFを取得する

概要 WikidataのエンティティのURIからRDFデータを取得する機会がありましたので、備忘録です。 Content Negotiationを使用しない まず以下のように、headersを空のままリクエストします。 import requests # URL for the Wikidata entity in RDF format url = "http://www.wikidata.org/entity/Q12418" headers = { } # Sending a GET request to the URL response = requests.get(url, headers=headers) # Checking if the request was successful if response.status_code == 200: text = response.text print(text[:5000]) else: print("Failed to retrieve RDF data. Status code:", response.status_code) この場合、以下のように、json形式のテキストデータを取得することができます。 {"entities":{"Q12418":{"pageid":14002,"ns":0,"title":"Q12418","lastrevid":2176343952,"modified":"2024-06-11T11:43:44Z","type":"item","id":"Q12418","labels":{"fr":{"language":"fr","value":"La Joconde"},"es":{"language":"es","value":"La Gioconda"},"en":{"language":"en","value":"Mona Lisa"},"af":{"language":"af","value":"Mona Lisa"},"am":{"language":"am","value":"\u121e\u1293 \u120a\u12db"},"ar": ... ただし、求めているRDFデータは取得できません。 Content Negotiationを使用する 次にheadersにRDF/XMLを指定します。 import requests from lxml import etree # URL for the Wikidata entity in RDF format url = "http://www.wikidata.org/entity/Q12418" # Headers to request RDF/XML format headers = { 'Accept': 'application/rdf+xml' } # Sending a GET request to the URL response = requests.get(url, headers=headers) # Checking if the request was successful if response.status_code == 200: tree = etree.fromstring(response.content) # Convert _Element to _ElementTree tree = etree.ElementTree(tree) # Now you can use the write method tree.write("output.xml", pretty_print=True, xml_declaration=True, encoding='UTF-8') else: print("Failed to retrieve RDF data. Status code:", response.status_code) 結果、以下のようにRDFデータを取得することができました。 ...

https://wikidata.reconci.link/の一部を試す

https://wikidata.reconci.link/の一部を試す

概要 調査の過程で、以下のようなAPIが存在することを知りました。 https://wikidata.reconci.link/ 使い方に関する備忘録です。 suggest 以下のようなURLにより、suggestの値を得られるようでした。 https://wikidata.reconci.link/en/suggest/entity?prefix=中村覚 preview 以下のようなURLにより、previewの結果を取得できました。 https://wikidata.reconci.link/en/preview?id=Q107095935 まとめ OpenRefineと一緒に使われるようですが、また機会をみて調べてみたいと思います。 https://qiita.com/yayamamo/items/eade3e5788e6f359bce7

cwrcのwikidata-entity-lookupを試す

cwrcのwikidata-entity-lookupを試す

概要 以下の記事の続きです。 LEAF-WRITERの特徴として、以下が挙げられています。 the ability to look up and select identifiers for named entity tags (persons, organizations, places, or titles) from the following Linked Open Data authorities: DBPedia, Geonames, Getty, LGPN, VIAF, and Wikidata. この機能は、以下のようなライブラリが使用されています。 https://github.com/cwrc/wikidata-entity-lookup この機能を試しています。 使い方 以下などで、npmパッケージが公開されています。 https://www.npmjs.com/search?q=cwrc 上記のリストにはありませんが、今回は以下を対象にします。 https://www.npmjs.com/package/wikidata-entity-lookup 以下でインストールします。 npm i wikidata-entity-lookup wikidataLookup.findPersonは、以下のように実行することができました。 <script lang="ts" setup> // @ts-ignore import wikidataLookup from "wikidata-entity-lookup"; interface Entity { id: string; name: string; description: string; uri: string; } const query = ref<string>(""); const results = ref<Entity[]>([]); const search = () => { wikidataLookup.findPerson(query.value).then((result: Entity[]) => { results.value = result; }); }; </script> デモ Nuxtでの実装例を用意しました。 ...

wikibase.cloudでQuickStatementsを試す

wikibase.cloudでQuickStatementsを試す

概要 wikibase.cloudでQuickStatementsを試してみましたので、その備忘録です。 以下の記事を参考にさせていただきました。 https://qiita.com/higa4/items/10affb47215def42d8e0 追加 上記の記事の通り、csvファイルをインポートしています。 ところが、以下のようなエラーが発生しました。 原因は、独自に立てたwikibaseインスタンスに、必要なプロパティが未登録だったことが原因でした。 Property [[Property:P1814|P1814]] not found WikibaseSyncなどを使って、事前に(特にwikidataと同じIDの)プロパティを登録しておく必要があることがわかりました。 そのため、ラベルに関する情報のみを登録する以下のようなデータを登録してみました。 qid,Lja,Len,Dja,Den,qal1545 ,タイトル,title,""""説明,desc,1 結果、以下のようにデータの新規登録ができました。 更新 次のコマンドで、上記で登録したQ59の更新を試みました。 qid,Lja,Len,Dja,Den,qal1545 Q59,変更後のタイトル,updated title,""""変更後の説明,updated desc,1 結果、以下のように、いずれの値も更新することができました。 まとめ ほんの一例ですが、QuickStatementsを試してみました。APIでの登録例を以下の記事で紹介していますが、CSVによる登録はユーザフレンドリーな機能だと感じました。 他の方の参考になりましたら幸いです。

WikibaseSyncを試す

WikibaseSyncを試す

概要 以下のWikibaseSyncを試す機会がありましたので、その備忘録です。 https://github.com/the-qa-company/WikibaseSync 以下の論文で、上記のツールを知りました。 https://doi.org/10.11517/jsaisigtwo.2022.SWO-056_04 インストール ソースコードや関連ライブラリをインストールします。 !get clone https://github.com/the-qa-company/WikibaseSync cd WikibaseSync !pip install -r requirements.txt Bot Accountの作成 事前に用意したWikibaseにアクセスし、「Special pages」から、「Bot passwords」をクリックします。 以下の画面で、「Bot name」を入力します。 次の画面で、以下の3つにチェックを入れます。 Give him the follwing rights: “High-volume editing”, “Edit existing pages” and “Create, edit, and move pages” 結果、以下のようなメッセージが表示され、パスワードを取得することができます。 The bot password for bot name "WikidataUpdater" of user "Nakamura" was created. The new password to log in with Nakamura@WikidataUpdater is xxxxxxxxxxxxxx. Please record this for future reference. (For old bots which require the login name to be the same as the eventual username, you can also use Nakamura as username and WikidataUpdater@xxxxxxxxxxxxxx as password.) Return to Special:BotPasswords. そして、以下の説明にしたがって、インストールしたソースコードの設定ファイルに、上記のBotに関する情報を入力します。 ...

Wikidataから人物の生没年を取得する

Wikidataから人物の生没年を取得する

Wikidataから人物の生没年を取得するノートブックを作成しました。 参考になりましたら幸いです。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/Wikidataから人物の生没年を取得する.ipynb