概要

本章では、ジャパンサーチのRDFストアに対して、更新日およびプロバイダ別にアイテム数を集計するSPARQLクエリを紹介します。前章までは更新日のみ、またはプロバイダのみに着目した集計を行いましたが、本章ではこれら2つの軸を組み合わせた多次元集計を行います。この手法により、「いつ」「どのプロバイダから」データが更新されたかを一覧で把握できます。

多次元集計の意義

ジャパンサーチには複数のプロバイダからデータが提供されています。各プロバイダは独自のスケジュールでデータを更新しているため、更新日とプロバイダの2つの軸で集計を行うことで、以下のような分析が可能になります。

  • 各プロバイダの更新頻度や更新パターンの把握
  • 大量データ更新があったプロバイダと日付の特定
  • プロバイダ間のデータ更新タイミングの比較

SPARQLクエリ

基本的なクエリ

以下のクエリは、更新日とプロバイダの2つの軸でアイテム数を集計します。

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 ?provider ?providerLabel (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:dateModified ?date .
  ?sourceInfo schema:provider ?provider .
  ?provider rdfs:label ?providerLabel .
}
GROUP BY ?date ?provider ?providerLabel
ORDER BY DESC(?date) DESC(?count)

クエリの解説

  1. ?cho jps:sourceInfo ?sourceInfo: CHOからソース情報を取得します。
  2. ?sourceInfo schema:dateModified ?date: ソース情報から更新日を取得します。
  3. ?sourceInfo schema:provider ?provider: ソース情報からプロバイダのURIを取得します。
  4. ?provider rdfs:label ?providerLabel: プロバイダの表示名(ラベル)を取得します。結果を読みやすくするために、URIだけでなくラベルも取得しています。
  5. GROUP BY ?date ?provider ?providerLabel: 更新日とプロバイダの組み合わせでグループ化します。GROUP BYに複数の変数を指定することで、多次元的な集計が可能になります。?providerLabelもGROUP BYに含めているのは、SELECT句で使用しているためです。
  6. ORDER BY DESC(?date) DESC(?count): まず日付の降順で、同じ日付内では件数の降順でソートします。

特定の日付範囲に絞り込むクエリ

データ量が多い場合は、日付範囲を指定して絞り込むと実行時間を短縮できます。

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 ?date ?provider ?providerLabel (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:dateModified ?date .
  ?sourceInfo schema:provider ?provider .
  ?provider rdfs:label ?providerLabel .
  FILTER(?date >= "2023-01-01"^^xsd:date && ?date <= "2023-12-31"^^xsd:date)
}
GROUP BY ?date ?provider ?providerLabel
ORDER BY DESC(?date) DESC(?count)

この例では2023年のデータに限定しています。

年月単位での集計

日単位の集計では結果が細かくなりすぎる場合は、年月単位で集計することも可能です。

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

SELECT ?yearMonth ?provider ?providerLabel (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:dateModified ?date .
  ?sourceInfo schema:provider ?provider .
  ?provider rdfs:label ?providerLabel .
  BIND(CONCAT(STR(YEAR(?date)), "-", IF(MONTH(?date) < 10, CONCAT("0", STR(MONTH(?date))), STR(MONTH(?date)))) AS ?yearMonth)
}
GROUP BY ?yearMonth ?provider ?providerLabel
ORDER BY DESC(?yearMonth) DESC(?count)

BINDCONCATを使って、YEAR関数とMONTH関数から年月文字列(例: 2023-08)を生成しています。月が1桁の場合にゼロ埋めを行うためにIF関数を使用しています。

出力結果の例

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

dateproviderproviderLabelcount
2023-08-15https://jpsearch.go.jp/entity/provider/cobasColBase(国立博物館所蔵品統合検索システム)5000
2023-08-15https://jpsearch.go.jp/entity/provider/ndl-bib国立国会図書館書誌データ3200
2023-08-14https://jpsearch.go.jp/entity/provider/arc-nishikieARC浮世絵ポータルデータベース1500

各行は、特定の日付における特定のプロバイダのアイテム更新数を示しています。

結果の可視化について

この多次元集計の結果は、以下のような方法で可視化すると効果的です。

ヒートマップによる可視化

横軸に日付、縦軸にプロバイダを取り、セルの色の濃淡でアイテム数を表現するヒートマップは、更新パターンの全体像を一目で把握するのに適しています。Pythonのseabornライブラリなどを使って作成できます。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# SPARQLクエリの結果をDataFrameに格納した後
pivot_df = df.pivot_table(
    index='providerLabel',
    columns='date',
    values='count',
    fill_value=0
)
plt.figure(figsize=(20, 10))
sns.heatmap(pivot_df, cmap='YlOrRd')
plt.title('更新日×プロバイダ別アイテム数')
plt.show()

積み上げ棒グラフによる可視化

日付ごとの合計件数と、その内訳(プロバイダ別)を同時に表示する積み上げ棒グラフも有効な可視化手法です。YASGUIのチャート機能では限定的ですが、PythonやJavaScriptを使えば柔軟に作成できます。

Cultural JapanのRDFストアとの比較

Cultural JapanのRDFストアにも同様のデータモデルが存在するため、ジャパンサーチとCultural Japanで同じ種類の集計クエリを実行し、結果を比較することで、データ連携の状況をより詳細に把握することも可能です。

関連記事