ジャパンサーチ利活用スキーマとSPARQL
利活用スキーマとSPARQLの基本
RDFとSPARQLおさらい
- RDFグラフはトリプルの集合

- RDFは主語―述語―目的語の組(トリプル)で一つの情報を表現
- トリプルが集まったものをRDFグラフと呼ぶ
- SPARQLはグラフのパターンマッチで検索

- 主語(ジャパンサーチアイテム)を変数とし、
schema:spatialの値がplace:三重であるトリプルパターンを探す SELECT * WHERE {?sschema:spatial place:三重 }
SPARQLの基本的な道具
- 検索条件(WHERE句内)
- 条件はトリプルパターンの組み合わせ(グラフパターン)で記述
FILTER:値の絞り込み(グラフの完全一致を補完する)OPTIONAL:場合によって有無が異なるパターン(画像など)→グラフパターンを{}で囲む(グループグラフパターン)UNION:グラフパターンの OR 検索(グループグラフパターンをUNIONでつなぐ)
- 結果の制御(WHRER句のあとに)
ORDER BY:結果の並べ替え=ソートキーとする変数名を指定(デフォルトは昇順。DESC(?var)とすると降順)LIMIT:取得する検索結果の上限OFFSET:LIMITと組み合わせ、結果のページングSELECT * WHERE { ?s a type:写真 ; #a はrdf:typeの簡略記述 rdfs:label ?label ; schema:spatial place:三重 .OPTIONAL{?s schema:image ?image} }ORDER BY?labelLIMIT20
APIとしてのSPARQL
- エンドポイントとクエリパラメータ(Virtuoso)
- https://jpsearch.go.jp/rdf/sparql/
- ブラウザで利用するときは、Snorqlインターフェイスが便利
- query:URLエンコードしたSPARQLクエリ
- format:結果フォーマット(
json|csv|xml)- TSVが欲しい場合は
text/tab-separated-values - 略すと自動判定(acceptヘッダなしだとXML)
- TSVが欲しい場合は
- https://jpsearch.go.jp/rdf/sparql/
- JSON結果フォーマット(標準仕様)
- クエリが成功すると、
results.bindings内に結果セットの配列を持つJSONが返される - 配列各要素は、変数名をキーにしたオブジェクトで、各オブジェクトは
typeとvalueを持つ {"results": { "bindings": [ { "s": { "type": "uri", "value": "https://jpsearch.go.jp/data/photo-00069_14613_0017" }, "label": { "type": "literal", "value": "浪曲「血煙荒神山」の舞台.鈴鹿市" } }, ... ] }}- 結果セット中(
OPTIONALの場合など)値がない変数は、そのキーが存在しない(空値ではない)
- クエリが成功すると、
ジャパンサーチ利活用スキーマ
- 「いつ」「どこ」「だれ」は二層構造で記述されている

- 1つの情報を、単純なSPO記述と、構造化ノードを介した記述に二重化している
- 単純記述と構造化記述の使い分け
- 「いつ」「どこ」「だれ」以外も含めすべてschema.orgを用いた基本記述で検索できる
- 「いつ」「どこ」「だれ」の値は正規化URIで記述される
- 構造化ノードは利活用スキーマ語彙(接頭辞
jps:)で記述される - 構造化記述で役割、元データの記述値を確認できる。緯度経度などの細部情報も構造化記述に含まれる
SELECT
?s?label?roleWHERE {?sjps:spatial [jps:valueplace:三重 ;jps:relationType?role] ; #構造化部分は[]で囲んで入れ子記述 a type:写真 ; rdfs:label?label}
正規化と構造化ノードの活用
場所情報の正規化値(1)
- 自治体レベルの場所情報
- 基本正規化(
schema:spatialの値は都道府県レベル(海外は国レベル) - データが市郡レベルの場所情報を持つ場合は構造化ノードに
jps:region- 例:写真原板データベースを市郡レベル場所情報で集約
- 下図は集約結果から辿っていける浪曲「血煙荒神山」の舞台.鈴鹿市の一部(撮影地)
- 自治体場所情報は
schema:geoの値としてgeohashのURIを持ち、そこから緯度経度が得られる - さらに
schema:geoCoveredByでより広域のgeohashに → 桁数で緯度経度の有効粒度を示す- 市郡レベルなら4桁、都道府県レベルなら3桁のgeohashを付与。地図のズームレベル設定などに使える

- 基本正規化(
場所情報の正規化値(2)
緯度経度を利用するSPARQLクエリ
- 個点レベルの場所を一定範囲から探す
- geohashの階層構造を利用して
geoCoveredByの上位で絞り込む - 会場なども合わせて調べるためにプロパティパスの単項演算子を使う
- 単項演算子はパス要素の反復を示し、
?なら0 もしくは1 回、*なら0回以上、+なら1回以上
- 単項演算子はパス要素の反復を示し、
SELECT distinct ?s ?label ?lat ?long ?image WHERE { ?s rdfs:label ?label ; schema:image ?image ; jps:spatial/(rdfs:seeAlso/schema:location)??loc . ?loc schema:geo [schema:latitude ?lat ; schema:longitude ?long] ; schema:geoCoveredBy/jps:within/jps:within<http://geohash.org/xn1n> . }
- geohashの階層構造を利用して
- 市郡レベルもまとめて検索する
jps:regionの場合も一度に調べるためにプロパティパスのOR演算子(|)を使う- ほか否定の
!、逆方向の^など。詳細はプロパティパス構文定義を参照
- ほか否定の
- 市郡レベルのgeohashは調べたい範囲のgeohashと同じ桁数→
jps:withinの繰り返し範囲を指定 SELECT distinct ?s ?label ?lat ?long ?image WHERE { ?s rdfs:label ?label ; schema:image ?image ; jps:spatial/(jps:region|(rdfs:seeAlso/schema:location))? ?loc . ?loc schema:geo [schema:latitude ?lat ; schema:longitude ?long] ; schema:geoCoveredBy/jps:within{0,2}<http://geohash.org/xn1n> . }
時間情報の正規化
- 年単位の正規化
- 時間情報は年のみを取り出して正規化=
time:名前空間の時間実体。和暦は西暦に変換して正規化 - 年範囲はtime:1953-1955の形。
jps:startEntity、jps:endEntityでそれぞれ開始年、終了年実体と関連付け - 世紀は年範囲を使って表現(18世紀は
time:1701-1800など。ラベルに年範囲と世紀両方) - 時代はtime:鎌倉時代などとしているが、やはり一般的な開始年、終了年実体に関連付け
- 時代の開始、終了年は異説があるため、世紀のように年範囲実体を直接用いていない
- 時間情報は年のみを取り出して正規化=
- 時間情報のグラフ
- 年実体は
jps:value、時代はjps:eraで関連付けられる(下図は文化財のグラフから時間実体を辿ったもの)- データが時代しかない場合は
jps:valueにも時代実体
- データが時代しかない場合は

- 年実体は
時間情報を利用するSPARQLクエリ
- 時代範囲のアイテムを調べる
- アイテムの時間情報(
schema:temporal)は、年実体の場合も時代実体の場合もある - 各時代実体は、時代実体と
schema:isPartOfで関連付けられている SELECT ?cho ?label ?when ?image WHERE { ?cho rdfs:label ?label ; a type:工芸 ; schema:temporal ?when ; schema:image ?image . ?whenschema:isPartOf?time:鎌倉時代 . }
- アイテムの時間情報(
- 特定の年範囲にあるアイテムを調べる
- 年実体は数値比較のために
jps:startとjps:endで開始終了年のリテラルを持つxsd:gYear型を持つリテラルとはschema:startDate、schema:endDateで関連付けている。これは紀元前の計算でエラーになる例があるため、あえて単純リテラルも用意している
- 単年であっても開始年、終了年を持つ(両方とも同じ値)
- 1730年代の絵画を調べるクエリ
SELECT distinct ?cho ?label ?styr
?edyr?image WHERE { ?cho rdfs:label ?label ; a type:絵画 ; schema:temporal [jps:start?styr;jps:end?edyr] ; schema:image ?image . FILTER((?styr >= 1730 && ?styr < 1740) || (?edyr>= 1730 &&?edyr< 1740)) }
- 年実体は数値比較のために
寄与者情報と正規化辞書
- 作者、出版者などを辞書を用いて正規化
- 寄与者(
type:Agent)の正規化名は2023年2月現在で約3万2千、うち人物は約2万1千 - 別表記、別名などを辞書登録してマッピング時に正規化
- 正規化辞書にマッチしない名前はそのまま
ncname:名前空間でURI化 - 単純プロパティは時間、場所と異なり
schema:creator、schema:publisher、schema:contributorを使い分け- 人物や団体が主題である場合は
schema:aboutを用いる - 映画や演劇の出演者(俳優)は
schema:actorを - 人物を網羅した検索をしたい場合は
jps:agential/jps:valueが使える
- 人物や団体が主題である場合は
- 寄与者(
- 寄与者正規化名RDFの記述
集約のための拡張モデル
- 映画とフィルム、演劇作品と公演などを集約して表現
- 個別のフィルム、公演などがアイテム。作品(映画、演劇など)には
schema:exampleOfWorkなどで関連付けて集約 - 作者(監督)、出演者など基本的に作品のプロパティは作品で構造化ノードも含めて記述。アイテムには主要なもののみ単純プロパティで記述(下図の上半分nfad-20396のグラフ全体)

- 個別のフィルム、公演などがアイテム。作品(映画、演劇など)には
ヒントになるかもしれないクエリ集
- 正規化と拡張補助情報
- 平安名所図会の記述対象と位置情報
- 役者絵の役者別集約と配役別集約
- ARC番付ポータルと演博浮世絵データベースで共通して取り上げられている演目
- サブクエリを用いないとタイムアウトか推定所要時間オーバーになる
- 三重県内の芭蕉の句碑
- 二十一代集データベースの和歌を歌集ごとに、また歌仙ごとに集約
- メディア芸術DBメディアアートの展覧会別集約
- 古典籍とIIIF
- 季語検索の春の季語一覧と「俳諧歳時記」掲載ページIIIF
- 古事類苑の飲食部の項目とIIIFページの一覧取得
- IIIFのURIはマニフェストに加え
#canvas=でカンバスURIも示しているので、うまく使えば個別ページを直接表示できる
- IIIFのURIはマニフェストに加え
- 室町時代のアイテムでIIIFが提供されるものをデータセット別に
- IIIFマニフェストは
jps:accessInfo/schema:urlで得られるリンク先のうち、iiif:Manifest型を持つもの
- IIIFマニフェストは
参照先
- 参照したリソース
- ジャパンサーチSPARQLエンドポイント
<https://jpsearch.go.jp/rdf/sparql/> - Snorql for Japan Search
<https://jpsearch.go.jp/rdf/sparql/easy/> - schema.org
<http://schema.org> - ジャパンサーチ利活用スキーマ概説
<https://jpsearch.go.jp/api/introduction/> - 正規化とプロパティパス, 2020-10-31, SPARQLで使うジャパンサーチ利活用スキーマ
<https://www.kanzaki.com/works/2020/pub/1031udc.html#s10> - SPARQL 1.1 Query Language §9.1 Property Path Syntax, 2013-03-21, W3C Recommendation
<https://www.w3.org/TR/sparql11-query/#pp-language> - Web NDL Authorities (国立国会図書館典拠データ検索・提供サービス)
<https://id.ndl.go.jp/auth/ndla/> - Wikidata
<https://www.wikidata.org/> - VIAF (バーチャル国際典拠ファイル)
<https://viaf.org/>
- ジャパンサーチSPARQLエンドポイント




