ジャパンサーチとは
ジャパンサーチ(Japan Search、https://jpsearch.go.jp/)は、国立国会図書館が運営する日本の分野横断型統合ポータルです。全国の図書館、博物館、美術館、公文書館、大学、研究機関などが公開するメタデータを集約し、横断検索を提供しています。
ジャパンサーチの大きな特徴は、集約したメタデータをLinked Open Dataとして公開していることです。SPARQLエンドポイントを通じて、構造化されたメタデータに対する柔軟な検索・取得が可能です。
SPARQLエンドポイント: https://jpsearch.go.jp/rdf/sparql/
筆者はジャパンサーチのSPARQLエンドポイントを活用した記事を多数執筆しています。Google Colabを使った実行方法やYASGUIでの利用方法なども紹介してきました。本章では、これらの経験をもとにジャパンサーチSPARQLの実践的な活用方法を解説します。
ジャパンサーチのデータモデル
ジャパンサーチでは、独自のデータモデル(利活用スキーマ)に基づいてメタデータを構造化しています。主要な概念を理解しておきましょう。
主要なクラス
| クラス | URI | 説明 |
|---|---|---|
| CHO | type:CHO | Cultural Heritage Object(文化財オブジェクト) |
| Agent | type:Agent | 人物・団体 |
| Time | type:Time | 時間 |
| Place | type:Place | 場所 |
主要なプレフィックス
PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX chname: <https://jpsearch.go.jp/entity/chname/>
主要なプロパティ
| プロパティ | 説明 |
|---|---|
rdfs:label | ラベル(タイトル) |
schema:name | 名称 |
schema:image | サムネイル画像 |
schema:provider | 提供機関 |
schema:url | 元データのURL |
jps:sourceInfo | 連携元情報 |
jps:accessInfo | アクセス情報 |
dcterms:creator | 作成者 |
dcterms:date | 日付 |
dcterms:spatial | 場所 |
dcterms:subject | 主題 |
jps:agential | 関連人物・団体(Agent) |
jps:temporal | 関連時間(Time) |
jps:spatial | 関連場所(Place) |
筆者は利活用スキーマを使ったデータの探索方法も実践しています。Japan Search利活用スキーマを使ったentity-lookupの試作では、利活用スキーマの構造を活用したエンティティ検索の仕組みを紹介しています。
SPARQLエンドポイントの利用方法
YASGUIでの利用
筆者はジャパンサーチのSPARQLエンドポイントをYasguiで使ってみるで、YASGUIを使ってジャパンサーチにSPARQLクエリを実行する方法を詳しく紹介しています。YASGUIは構文ハイライトや補完機能が充実しており、初学者にも扱いやすいインターフェースです。
Google Colabでの利用
Pythonでの利用方法については、Google Colabを用いたジャパンサーチRDFストアに対するSPARQLの実行例で詳しく解説しています。環境構築が不要で、ブラウザだけで手軽にSPARQLクエリを実行・分析できます。
grlcによるAPI化
SPARQLクエリをREST APIとして公開したい場合は、grlcが便利です。grlc (git repository linked data API constructor)を試すで、ジャパンサーチのSPARQLクエリをAPI化する手順を紹介しています。
基本的なクエリ
最初のクエリ:アイテムの検索
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX schema: <http://schema.org/>
SELECT ?item ?label ?thumbnail
WHERE {
?item a type:CHO ;
rdfs:label ?label .
OPTIONAL { ?item schema:image ?thumbnail . }
FILTER(CONTAINS(?label, "源氏物語"))
}
LIMIT 20
筆者は「教科書の中の源氏物語LOD」を使った探索も実践しています。「教科書の中の源氏物語LOD」を使ってみるでは、ジャパンサーチとは別のRDFストア(Dydra)に格納された源氏物語関連のLODデータをSnorqlやYASGUIで探索する方法を紹介しています。
特定の作者による作品
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX schema: <http://schema.org/>
SELECT ?item ?label ?thumbnail ?providerLabel
WHERE {
?item a type:CHO ;
rdfs:label ?label ;
jps:agential/rdfs:label "葛飾北斎" .
OPTIONAL { ?item schema:image ?thumbnail . }
OPTIONAL {
?item schema:provider ?provider .
?provider rdfs:label ?providerLabel .
}
}
LIMIT 50
提供機関別のアイテム数
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX schema: <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?providerLabel (COUNT(?item) AS ?count)
WHERE {
?item a type:CHO ;
schema:provider ?provider .
?provider rdfs:label ?providerLabel .
}
GROUP BY ?providerLabel
ORDER BY DESC(?count)
LIMIT 30
実践クエリ集
特定の時代に関連する資料
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX schema: <http://schema.org/>
SELECT ?item ?label ?thumbnail ?timeLabel
WHERE {
?item a type:CHO ;
rdfs:label ?label ;
jps:temporal ?time .
?time rdfs:label ?timeLabel .
FILTER(CONTAINS(?timeLabel, "江戸"))
OPTIONAL { ?item schema:image ?thumbnail . }
}
LIMIT 30
特定の場所に関連する資料
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX schema: <http://schema.org/>
SELECT ?item ?label ?thumbnail ?placeLabel
WHERE {
?item a type:CHO ;
rdfs:label ?label ;
jps:spatial ?place .
?place rdfs:label ?placeLabel .
FILTER(CONTAINS(?placeLabel, "京都"))
OPTIONAL { ?item schema:image ?thumbnail . }
}
LIMIT 30
更新年ごとのアイテム数の分析
筆者はジャパンサーチ利活用スキーマについて、最新の更新年ごとのアイテム数を視覚化するで、SPARQLのGROUP BY句を使ってデータの時系列分析を行う方法を紹介しています。このようなデータの傾向分析はSPARQLの集約機能の重要な活用例です。
外部リンク(Wikidata等)を持つアイテム
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX schema: <http://schema.org/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT ?item ?label ?externalLink
WHERE {
?item a type:CHO ;
rdfs:label ?label ;
owl:sameAs ?externalLink .
FILTER(CONTAINS(STR(?externalLink), "wikidata"))
}
LIMIT 20
RDFストアのデータ構造を把握する
ジャパンサーチのRDFストアにどのようなデータが格納されているかを把握するために、トリプル数のカウントや述語の一覧取得が有効です。筆者はRDFストアのトリプル数を数えるやRDFストアのトリプル数を数える2: 共起頻度で、この手法を紹介しています。
# 述語の一覧と使用回数を取得
SELECT ?p (COUNT(?p) AS ?count)
WHERE {
?s ?p ?o .
}
GROUP BY ?p
ORDER BY DESC(?count)
LIMIT 50
ジャパンサーチAPIとの連携
ジャパンサーチは、SPARQLエンドポイントに加えて、REST APIも提供しています。SPARQLとAPIを組み合わせることで、より柔軟なデータ活用が可能です。
SPARQLで取得したURIをAPIで詳細取得
SPARQLで目的のアイテムのURIを取得し、そのURIに対してAPI経由で詳細情報やサムネイル画像を取得するという連携パターンがよく使われます。
from SPARQLWrapper import SPARQLWrapper, JSON
import requests
# Step 1: SPARQLで北斎の作品のIDを取得
sparql = SPARQLWrapper("https://jpsearch.go.jp/rdf/sparql/")
sparql.setQuery("""
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX jps: <https://jpsearch.go.jp/term/property#>
SELECT ?item ?label
WHERE {
?item a type:CHO ;
rdfs:label ?label ;
jps:agential/rdfs:label "葛飾北斎" .
}
LIMIT 10
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
for result in results["results"]["bindings"]:
item_uri = result["item"]["value"]
label = result["label"]["value"]
print(f"{label}: {item_uri}")
IIIFとの連携
ジャパンサーチに集約されているメタデータの中には、IIIFマニフェストURLを含むものがあります。SPARQLでIIIFマニフェストURLを取得し、IIIFビューアで表示するという連携が可能です。
筆者はCultural Japanで集約したIIIFマニフェストをまとめたIIIFコレクションのご紹介で、Cultural Japanのデータを活用したIIIF連携の事例を紹介しています。
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <https://jpsearch.go.jp/term/type/>
PREFIX schema: <http://schema.org/>
PREFIX jps: <https://jpsearch.go.jp/term/property#>
SELECT ?item ?label ?manifest
WHERE {
?item a type:CHO ;
rdfs:label ?label ;
jps:accessInfo ?access .
?access schema:relatedLink ?manifest .
FILTER(CONTAINS(STR(?manifest), "manifest"))
FILTER(CONTAINS(?label, "源氏物語"))
}
LIMIT 20
クエリ作成のコツ
1. まずDESCRIBEで構造を把握する
未知のデータを探索する際は、まず DESCRIBE でアイテムの構造を確認します。
DESCRIBE <https://jpsearch.go.jp/data/nij-nij_nihon_23>
2. LIMITを活用する
ジャパンサーチには大量のデータが含まれているため、最初は LIMIT を小さく設定してクエリの動作を確認してから、徐々に件数を増やしていくことをお勧めします。
3. FILTERの前にパターンで絞り込む
テキスト検索の FILTER(CONTAINS(...)) は処理コストが高いため、可能な限りトリプルパターンで先に候補を絞り込んでから FILTER を適用します。
# 非効率(全CHOを走査してからフィルタリング)
SELECT ?item ?label
WHERE {
?item a type:CHO ;
rdfs:label ?label .
FILTER(CONTAINS(?label, "北斎"))
}
# 効率的(先にagentialで絞り込み)
SELECT ?item ?label
WHERE {
?item a type:CHO ;
rdfs:label ?label ;
jps:agential/rdfs:label "葛飾北斎" .
}
4. Snorqlでの探索
筆者が公開しているSnorqlを使えば、ジャパンサーチを含む複数のSPARQLエンドポイントをブラウザで手軽に探索できます。Snorql for Japan Searchのカスタマイズ方法の調査では、ジャパンサーチ向けにSnorqlをカスタマイズする方法を紹介しています。
まとめ
本章では、ジャパンサーチのSPARQLエンドポイントの活用方法を学びました。重要なポイントを振り返ります。
- ジャパンサーチは日本の文化資源のメタデータを集約した統合ポータル
- SPARQLエンドポイント(https://jpsearch.go.jp/rdf/sparql/)で構造化メタデータに直接アクセスできる
type:CHOが文化財オブジェクト、jps:agentialで関連人物、jps:temporalで時代、jps:spatialで場所を扱う- PythonやJavaScriptからプログラム的にデータを取得・活用できる
- IIIFマニフェストURLとの連携で、ビューアでの画像表示も可能
次章では、自身のデータをRDFとしてモデリングするための設計手法を学びます。
関連記事
- ジャパンサーチのSPARQLエンドポイントをYasguiで使ってみる
- Google Colabを用いたジャパンサーチRDFストアに対するSPARQLの実行例
- grlc (git repository linked data API constructor)を試す
- RDFストアのトリプル数を数える
- RDFストアのトリプル数を数える2: 共起頻度
- ジャパンサーチ利活用スキーマについて、最新の更新年ごとのアイテム数を視覚化する
- Japan Search利活用スキーマを使ったentity-lookupの試作
- Snorql for Japan Searchのカスタマイズ方法の調査
- 「教科書の中の源氏物語LOD」を使ってみる
- Cultural Japanで集約したIIIFマニフェストをまとめたIIIFコレクションのご紹介