概要

本章では、ジャパンサーチのRDFストアに対して、特定のプロバイダおよび更新日を持つアイテムをタイプ別に集計するSPARQLクエリを紹介します。これは、プロバイダ、更新日、タイプという3つの軸を使った集計であり、本書の中で最も多次元的な分析となります。この手法により、特定のプロバイダが特定の日に更新したデータに、どのようなタイプのアイテムが含まれているかを把握できます。

rdfs:typeによるアイテムの分類

ジャパンサーチでは、各CHO(Cultural Heritage Object)に対してrdfs:type(またはrdf:type)プロパティを通じてタイプ情報が付与されています。タイプは、アイテムの種類を分類するための重要なメタデータです。

ジャパンサーチの利活用スキーマでは、以下のような独自のタイプ語彙が定義されています。

hhhhhhhttttttttttttttpppppppsssssss::::::://jjjjjjjpppppppssssssseeeeeeeaaaaaaarrrrrrrccccccchhhhhhh.......gggggggooooooo.......jjjjjjjppppppp///////ttttttteeeeeeerrrrrrrmmmmmmm///////tttttttyyyyyyypppppppeeeeeee///////

これらのタイプはrdfs:subClassOfによる階層構造を持つ場合もあり、より詳細な分類と上位概念による横断的な検索の両方が可能になっています。

RDFにおいて、各アイテムのトリプルは以下のように表現されます。

<https://jpsearch.go.jp/data/cobas-12345>rdf:type<https://jpsearch.go.jp/term/type/>

SPARQLクエリ

基本的なクエリ

以下のクエリは、特定のプロバイダ(この例では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 ?type (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:provider <https://jpsearch.go.jp/entity/provider/cobas> .
  ?sourceInfo schema:dateModified "2023-08-01"^^xsd:date .
  ?cho rdfs:type ?type .
}
GROUP BY ?type
ORDER BY DESC(?count)

クエリの解説

  1. ?cho jps:sourceInfo ?sourceInfo: CHOからソース情報を取得します。
  2. ?sourceInfo schema:provider <https://jpsearch.go.jp/entity/provider/cobas>: プロバイダをColBaseに限定しています。FILTERではなく、トリプルパターンで直接URIを指定する方法を使っています。この方法はFILTERよりも効率的に実行される傾向があります。
  3. ?sourceInfo schema:dateModified "2023-08-01"^^xsd:date: 更新日を指定しています。同様にトリプルパターンで直接値を指定しています。
  4. ?cho rdfs:type ?type: CHOのタイプを取得します。rdfs:typeはRDFにおける型情報を表す標準的なプロパティです。なお、SPARQLではaというキーワードがrdf:typeの省略形として使用できます。
  5. GROUP BY ?type: タイプごとにグループ化し、各タイプのアイテム数を集計します。
  6. ORDER BY DESC(?count): 件数の多いタイプから順に表示します。

タイプのラベルも取得するクエリ

タイプのURIだけでは内容が分かりにくい場合があるため、ラベルも合わせて取得するクエリです。

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 ?type ?typeLabel (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:provider <https://jpsearch.go.jp/entity/provider/cobas> .
  ?sourceInfo schema:dateModified "2023-08-01"^^xsd:date .
  ?cho rdfs:type ?type .
  OPTIONAL { ?type rdfs:label ?typeLabel . }
}
GROUP BY ?type ?typeLabel
ORDER BY DESC(?count)

OPTIONALを使用しているのは、すべてのタイプにラベルが定義されているとは限らないためです。OPTIONALを使わないと、ラベルのないタイプが結果から除外されてしまいます。

複数のFILTER条件を使ったクエリ

より柔軟な条件指定が必要な場合は、FILTERを使って複合的な条件を記述することもできます。

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 ?type ?typeLabel (COUNT(?cho) AS ?count) WHERE {
  ?cho jps:sourceInfo ?sourceInfo .
  ?sourceInfo schema:provider ?provider .
  ?sourceInfo schema:dateModified ?date .
  ?cho rdfs:type ?type .
  OPTIONAL { ?type rdfs:label ?typeLabel . }
  FILTER(
    ?provider = <https://jpsearch.go.jp/entity/provider/cobas>
    && ?date >= "2023-01-01"^^xsd:date
    && ?date <= "2023-12-31"^^xsd:date
  )
}
GROUP BY ?type ?typeLabel
ORDER BY DESC(?count)

このクエリでは、FILTERで3つの条件を&&(論理AND)で結合しています。プロバイダの指定に加えて、日付の範囲も指定しています。FILTERを使う方法は、条件を動的に変更したい場合に柔軟性があります。

プロバイダ・更新日・タイプの3次元集計

3つの軸すべてを結果に含めた集計も可能です。

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

このクエリは、指定した期間内のすべてのプロバイダについて、日付別・タイプ別にアイテム数を集計します。結果のデータ量は大きくなる可能性がありますが、特定の期間に限定することで実用的な範囲に収めることができます。

出力結果の例

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

typecount
https://jpsearch.go.jp/term/type/絵画2500
https://jpsearch.go.jp/term/type/彫刻1200
https://jpsearch.go.jp/term/type/工芸品800
https://jpsearch.go.jp/term/type/書跡・典籍450
https://jpsearch.go.jp/term/type/考古資料300

この結果から、特定のプロバイダが特定の日に更新したデータの構成を把握できます。例えば、ColBaseのデータでは絵画が最も多く、次いで彫刻、工芸品が多いといった傾向が見えてきます。

タイプの分析における留意点

rdfs:typeによる分析を行う際には、以下の点に注意が必要です。

  • 複数タイプの付与: 1つのCHOに複数のrdfs:typeが付与されている場合があります。この場合、同じCHOが複数のタイプで重複してカウントされます。重複を避けたい場合はCOUNT(DISTINCT ?cho)を使用します。
  • タイプの粒度: プロバイダによって、付与されるタイプの粒度が異なる場合があります。ある機関では詳細なタイプ(例:「浮世絵」)を使用し、別の機関ではより上位のタイプ(例:「絵画」)のみを使用しているかもしれません。
  • schema:additionalType: rdfs:type以外にも、schema:additionalTypeでより詳細なタイプ情報が付与されている場合があります。

これらの点を踏まえて、Linked Dataのデータモデルを理解した上でクエリを設計することが重要です。

関連記事

  • Linked Dataを使ったデータ記述の応用例 - RDFおよびLinked Dataを用いたデータ記述について、ジャパンサーチのデータを活用した実践的な応用例を紹介しています。タイプ情報を含むメタデータの構造を理解する上で参考になります。