ジャパンサーチとは

ジャパンサーチ(Japan Search、https://jpsearch.go.jp/)は、国立国会図書館が運営する日本の分野横断型統合ポータルです。全国の図書館、博物館、美術館、公文書館、大学、研究機関などが公開するメタデータを集約し、横断検索を提供しています。

ジャパンサーチの大きな特徴は、集約したメタデータをLinked Open Dataとして公開していることです。SPARQLエンドポイントを通じて、構造化されたメタデータに対する柔軟な検索・取得が可能です。

SPARQLエンドポイント: https://jpsearch.go.jp/rdf/sparql/

筆者はジャパンサーチのSPARQLエンドポイントを活用した記事を多数執筆しています。Google Colabを使った実行方法やYASGUIでの利用方法なども紹介してきました。本章では、これらの経験をもとにジャパンサーチSPARQLの実践的な活用方法を解説します。

ジャパンサーチのデータモデル

ジャパンサーチでは、独自のデータモデル(利活用スキーマ)に基づいてメタデータを構造化しています。主要な概念を理解しておきましょう。

主要なクラス

クラスURI説明
CHOtype:CHOCultural Heritage Object(文化財オブジェクト)
Agenttype:Agent人物・団体
Timetype:Time時間
Placetype: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としてモデリングするための設計手法を学びます。

関連記事