概要

本章では、ジャパンサーチのRDFストアに対して、指定されたプロバイダ(データ提供機関)の更新日に基づく集計を行うSPARQLクエリを紹介します。ジャパンサーチには、国立国会図書館、国立博物館、各地方自治体の図書館・博物館など、多数のプロバイダからデータが集約されています。特定のプロバイダに着目して、そのデータがいつ更新されたかを把握することは、データ連携の状況を理解する上で重要です。

プロバイダとソース情報の関係

ジャパンサーチのデータモデルにおいて、各CHO(Cultural Heritage Object)はjps:sourceInfoを通じてソース情報に関連付けられています。ソース情報には、schema:provider(プロバイダ)とschema:dateModified(更新日)が含まれます。

データの関連構造は以下のようになります。

?chojps:sourceInfo?surceIssnccfhhoeemmaa::pdraotveiMdoedrified?prov"i2d0e2r3-08-01"

schema:providerはプロバイダのURIを指し、そのプロバイダのラベル(名称)はrdfs:labelで取得できます。

SPARQLクエリ

基本的なクエリ

以下のクエリは、特定のプロバイダに属するアイテムを更新日ごとに集計します。

PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX schema: <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?date (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:provider ?provider .
  ?sourceInfo schema:dateModified ?date .
  ?provider rdfs:label ?providerLabel .
  FILTER(?provider = <https://jpsearch.go.jp/entity/provider/cobas>)
}
GROUP BY ?date
ORDER BY DESC(?date)

クエリの解説

  1. ?cho jps:sourceInfo ?sourceInfo: CHOからソース情報を取得します。
  2. ?sourceInfo schema:provider ?provider: ソース情報からプロバイダ情報を取得します。
  3. ?sourceInfo schema:dateModified ?date: ソース情報から更新日を取得します。
  4. ?provider rdfs:label ?providerLabel: プロバイダの名称を取得します(結果表示用)。
  5. FILTER(?provider = <https://jpsearch.go.jp/entity/provider/cobas>): プロバイダを指定してフィルタリングします。この例ではcobas(国立博物館所蔵品統合検索システム、ColBase)を指定しています。
  6. GROUP BY ?date: 更新日ごとにグループ化し、各日のアイテム数を集計します。
  7. ORDER BY DESC(?date): 最新の日付から順に表示します。

プロバイダ名による絞り込み

プロバイダのURIが分からない場合は、rdfs:labelを使って名称でフィルタリングすることもできます。

PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX schema: <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?date (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:provider ?provider .
  ?sourceInfo schema:dateModified ?date .
  ?provider rdfs:label ?providerLabel .
  FILTER(CONTAINS(?providerLabel, "国立国会図書館"))
}
GROUP BY ?date
ORDER BY DESC(?date)

CONTAINS関数を使用することで、プロバイダ名に特定の文字列が含まれるかどうかで部分一致検索が可能になります。

プロバイダの一覧を取得するクエリ

どのようなプロバイダが存在するかを確認するために、以下のクエリでプロバイダの一覧を取得できます。

PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX schema: <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?provider ?providerLabel (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo/schema:provider ?provider .
  ?provider rdfs:label ?providerLabel .
}
GROUP BY ?provider ?providerLabel
ORDER BY DESC(?count)

このクエリを先に実行することで、FILTERに指定すべきプロバイダのURIを特定できます。

実践例: 特定プロバイダの更新推移を分析する

例として、国立博物館所蔵品統合検索システム(ColBase)のデータ更新推移を分析してみましょう。

PREFIX jps: <https://jpsearch.go.jp/term/property#>
PREFIX schema: <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?yearMonth (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:provider <https://jpsearch.go.jp/entity/provider/cobas> .
  ?sourceInfo schema:dateModified ?date .
  BIND(CONCAT(STR(YEAR(?date)), "-", IF(MONTH(?date) < 10, CONCAT("0", STR(MONTH(?date))), STR(MONTH(?date)))) AS ?yearMonth)
}
GROUP BY ?yearMonth
ORDER BY ?yearMonth

このクエリでは、BINDCONCATを使って日付から年月を抽出し、月ごとの更新件数を集計しています。このように月単位で集計することで、データ更新の傾向やパターンをより明確に把握できます。

出力結果の例

クエリの実行結果として、以下のような形式のデータが得られます。

datecount
2023-08-152500
2023-07-201800
2023-06-103200

各行は、指定されたプロバイダに属するアイテムの更新日と、その日に更新されたアイテム数を示しています。この結果をグラフ化することで、データ更新の頻度やタイミングの傾向を視覚的に把握できます。

結果の可視化

YASGUIのチャート機能を使って、結果を棒グラフや折れ線グラフとして表示することで、プロバイダごとのデータ更新状況を視覚的に把握できます。特に時系列データの場合、折れ線グラフを使用すると更新の推移が分かりやすくなります。

また、Google Colabなどを使ってPythonのmatplotlibやplotlyで可視化することも有効です。

関連記事