add queries

This commit is contained in:
Babibubebon 2022-09-07 04:02:03 +09:00
parent ddd700309d
commit 76d7d41d3f
2 changed files with 245 additions and 7 deletions

View file

@ -0,0 +1,103 @@
---
title: "複数エンドポイントの横断的活用"
weight: 3
# bookFlatSection: false
# bookToc: true
# bookHidden: false
# bookCollapseSection: false
# bookComments: false
# bookSearchExclude: false
---
# 複数エンドポイントの横断的活用
SPARQLでは、1つのエンドポイントだけでなく、外部の複数のエンドポイントに対してクエリを実行することができる[**federatedクエリ**](https://www.w3.org/TR/2013/REC-sparql11-federated-query-20130321/)という仕組みがあります。
federatedクエリを利用したクエリを紹介します。
## SPARQLクエリエディタ {#query-editor}
{{< yasgui id="federated" />}}
-----
## クエリ集 {#queries}
### メディア芸術データベースの責任主体の法人番号を取得する {#agent-houjin-bangou}
Wikidataとメディア芸術データベースを連携したfederatedクエリ
法人番号からさらに[gBizINFOのSPARQLエンドポイント](https://info.gbiz.go.jp/hojin/SparqlQueryEditor)などとも繋げられそうですね。
{{< yasgui-query yasgui-id="federated" title="メディア芸術データベースの責任主体の法人番号を取得する" endpoint="https://mediag.bunka.go.jp/sparql" >}}
PREFIX schema: <https://schema.org/>
PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
SELECT
?agent ?name ?hojinBangou
WHERE {
?agent a class:Agent;
schema:name ?name ;
ma:wikidata ?wikidataPage .
# WikidataのリソースURIに変換
BIND (URI(REPLACE(?wikidataPage, "https://www.wikidata.org/wiki/", "http://www.wikidata.org/entity/")) AS ?wikidataEntity)
# Wikidata
SERVICE <https://query.wikidata.org/sparql> {
# P3225: 法人番号
?wikidataEntity <http://www.wikidata.org/prop/direct/P3225> ?hojinBangou ;
}
}
LIMIT 100
{{< / yasgui-query >}}
### 「日本ゲーム大賞」を受賞したゲームを取得する {#japan-game-awards}
DBpedia JapaneseとWikidataとメディア芸術データベースを連携したfederatedクエリ
{{< yasgui-query yasgui-id="federated" title="「日本ゲーム大賞」を受賞したゲームを取得する" endpoint="https://mediag.bunka.go.jp/sparql" >}}
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX schema: <https://schema.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT
?MADBID ?genre ?label
WHERE {
hint:Query hint:joinOrder "Ordered" .
# DBpedia Japanese
SERVICE <https://ja.dbpedia.org/sparql> {
SELECT DISTINCT
(URI(REPLACE(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/", "http://www.wikidata.org/entity/"))
AS ?wikidataEntity)
{
<http://ja.dbpedia.org/resource/Category:日本ゲーム大賞受賞ソフト> ^skos:broader* ?category .
?dbpediaEntity dcterms:subject ?category;
^owl:sameAs ?wikidataEntity .
FILTER(STRSTARTS(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/"))
}
}
# Wikidata
SERVICE <https://query.wikidata.org/sparql> {
# P7886: メディア芸術データベース識別子
?wikidataEntity wdt:P7886 ?MADBID .
}
# メディア芸術データベース
?MADBResource schema:identifier ?MADBID ;
schema:genre ?genre ;
rdfs:label ?label .
}
LIMIT 100
{{< / yasgui-query >}}
{{< hint info >}}
federatedクエリの実行順序によっては、正しく結果が得られないことがあります。
RDFストアによっては、クエリオプティマイザに実行順序を指示する方法が用意されており、メディア芸術データベースのSPARQLクエリサービスが使用しているAmazon Neptuneでは `hint:Query hint:joinOrder "Ordered" .` というパターンを記述します。
参照: [Amazon Neptune: SPARQL クエリヒント](https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/sparql-query-hints.html)
{{< /hint >}}

View file

@ -19,23 +19,137 @@ https://mediag.bunka.go.jp/madb_lab/
- [SPARQLクエリサービス](https://mediag.bunka.go.jp/madb_lab/lod/sparql/)
- [データセット (Turtle, JSON-LD)](https://mediag.bunka.go.jp/madb_lab/lod/download/)
- [GitHubリポジトリ](https://github.com/mediaarts-db/dataset)
- [スキーマ仕様書 Ver. 1.1](https://github.com/mediaarts-db/dataset/blob/397b40d4e7dd35096a8c835f55f6b2406ded2315/doc/MADB%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E4%BB%95%E6%A7%98%E6%9B%B8.pdf)
- 独自に定義する語彙
- [クラス](https://mediaarts-db.bunka.go.jp/data/class)
- [プロパティ](https://mediaarts-db.bunka.go.jp/data/property)
## クエリエディタ
{{< yasgui id="madb-lod" endpoint="https://mediag.bunka.go.jp/sparql"
default-query=`PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
## SPARQLクエリエディタ {#query-editor}
{{< yasgui id="madb-lod" endpoint="https://mediag.bunka.go.jp/sparql" >}}
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <https://schema.org/>
PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
SELECT * WHERE {
?sub ?pred ?obj .
} LIMIT 10`
>}}
} LIMIT 10
{{< / yasgui >}}
-----
### 公開年毎にアニメテレビレギュラーシリーズ数を集計する
## クエリ集 {#queries}
### 全リソースを種別ごとに集計する {#aggregation-by-genre}
{{< yasgui-query yasgui-id="madb-lod" title="集計" >}}
PREFIX schema: <https://schema.org/>
PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
SELECT
?additionalType ?class ?genre (COUNT(*) AS ?count)
WHERE {
?resource a ?class;
schema:additionalType ?additionalType ;
schema:genre ?genre .
}
GROUP BY ?class ?additionalType ?genre
ORDER BY ?additionalType
{{< / yasgui-query >}}
### マンガ単行本の一覧を取得する {#manga-book}
「マンガ単行本」を表すクラス `https://mediaarts-db.bunka.go.jp/data/class#MangaBook`
{{< yasgui-query yasgui-id="madb-lod" title="マンガ単行本の一覧を取得する" hl_lines="9" >}}
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <https://schema.org/>
PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
SELECT
?id ?label ?creator ?datePublished
WHERE {
?item a class:MangaBook ;
schema:identifier ?id ;
rdfs:label ?label ;
schema:creator ?creator ;
schema:datePublished ?datePublished .
}
LIMIT 1000
{{< / yasgui-query >}}
### マンガ単行本とその所蔵館の一覧を取得する {#manga-book-and-provider}
[`https://mediaarts-db.bunka.go.jp/id/M464950`](https://mediaarts-db.bunka.go.jp/id/M464950) を主語とするTurtle形式のRDFデータ
```turtle {hl_lines="23-36"}
<https://mediaarts-db.bunka.go.jp/id/M464950>
a class:MangaBook ;
rdfs:label "鬼滅の刃 1" ;
schema:identifier "M464950" ;
schema:additionalType class:CM ;
schema:genre "マンガ単行本" ;
dcterms:creator <https://mediaarts-db.bunka.go.jp/id/C53400> ;
dcterms:publisher "P4080000000" ;
ma:jpno "22740403" ;
ma:ndc "726.1" ;
ma:note "【言語】日本語  JPN" ;
schema:alternateName "残酷" ;
schema:brand "ジャンプコミックス" , "ジャンプ コミックス"@ja-Hrkt ;
schema:creator "[著]吾峠呼世晴" ;
schema:datePublished "2016-06-08" ;
schema:description "残酷" ;
schema:inLanguage "日本語" ;
schema:isPartOf <https://mediaarts-db.bunka.go.jp/id/C361806> ;
schema:isbn "9784088807232" ;
schema:location "東京" ;
schema:name "キメツ ヤイバ"@ja-Hrkt , "鬼滅の刃" ;
schema:position "1.0" ;
schema:provider [ ma:materialIdentifier <https://id.ndl.go.jp/bib/027321240> ;
ma:note "2016-06" ;
ma:ownerIdentifier "2" ;
ma:subMaterialIdentifier "1" ;
schema:name "国立国会図書館" ;
schema:price "400円"
] ;
schema:provider [ ma:materialIdentifier "10071400016547" ;
ma:note "1刷  付:帯・カバー / 付:「ジャンパラ!」(JUMP PARADISE) Vol.156" ;
ma:ownerIdentifier "6" ;
ma:subMaterialIdentifier "1" ;
schema:name "大阪府立中央図書館国際児童文学館" ;
schema:price "400円"
] ;
schema:publisher "集英社 ∥ シュウエイシャ" ;
schema:size "18cm  18cm × 12cm" ;
schema:volumeNumber "1" .
```
[空白ノードの構文](https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#QSynBlankNodes)を使ってパターンを指定します。
{{< yasgui-query yasgui-id="madb-lod" title="マンガ単行本の一覧を取得する" hl_lines="14-16" >}}
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <https://schema.org/>
PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
SELECT
?id ?label ?creator ?datePublished ?providerName
WHERE {
?item a class:MangaBook ;
schema:identifier ?id ;
rdfs:label ?label ;
schema:creator ?creator ;
schema:datePublished ?datePublished ;
schema:provider [
schema:name ?providerName
] .
}
LIMIT 1000
{{< / yasgui-query >}}
参考: [MADB Lab: データ利活用例その2:マンガの連携機関所蔵リスト](https://mediag.bunka.go.jp/madb_lab/lod/usecase/case2/)
### 公開年毎にアニメテレビレギュラーシリーズ数を集計 {#anime-tv-series}
{{< yasgui-query yasgui-id="madb-lod" title="公開年毎にTVアニメシリーズ数を集計する" >}}
PREFIX schema: <https://schema.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
@ -47,4 +161,25 @@ SELECT ?y (COUNT(DISTINCT *) AS ?cnt) WHERE {
}
GROUP BY (SUBSTR(?datePublished, 1, 4) AS ?y)
ORDER BY ASC(?y)
{{< / yasgui-query >}}
{{< / yasgui-query >}}
### 登場キャラクター名がタイトルのアニメシリーズ {#anime-character-name-title}
{{< yasgui-query yasgui-id="madb-lod" title="公開年毎にTVアニメシリーズ数を集計する" >}}
PREFIX schema: <https://schema.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
SELECT
?col ?genre ?colName ?actors
WHERE {
?col a ?animeColClasses ;
schema:name ?colName ;
schema:genre ?genre ;
schema:actor ?actors .
VALUES ?animeColClasses {class:AnimationTVRegularSeries class:AnimationTVSpecialSeries class:AnimationMovieSeries}
FILTER(LANG(?colName) = "")
FILTER(REGEX(?actors, CONCAT("【", ?colName ,"】")))
}
{{< / yasgui-query >}}