複数エンドポイントの横断的活用 #
SPARQLでは、1つのエンドポイントだけでなく、外部の複数のエンドポイントに対してクエリを実行することができるfederatedクエリという仕組みがあります。
federatedクエリを利用したクエリを紹介します。
SPARQLクエリエディタ #
クエリ集 #
作品の多言語のタイトルを取得する #
https://mediaarts-db.bunka.go.jp/id/C413599
1PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
2PREFIX schema: <https://schema.org/>
3PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
4PREFIX wdt: <http://www.wikidata.org/prop/direct/>
5
6SELECT
7 ?MADBLabel ?label (LANG(?label) AS ?lang) ?wikidataEntity
8WHERE {
9 <https://mediaarts-db.bunka.go.jp/id/C413599>
10 schema:identifier ?MADBID ;
11 rdfs:label ?MADBLabel .
12 # Wikidataへクエリ
13 SERVICE <https://query.wikidata.org/sparql> {
14 # P7886: メディア芸術データベース識別子
15 ?wikidataEntity wdt:P7886 ?MADBID ;
16 rdfs:label ?label .
17 }
18}
メディア芸術データベースの責任主体の法人番号を取得する #
Wikidataとメディア芸術データベースを連携したfederatedクエリ
法人番号からさらにgBizINFOのSPARQLエンドポイントなどとも繋げられそうですね。
1PREFIX schema: <https://schema.org/>
2PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
3PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
4PREFIX wdt: <http://www.wikidata.org/prop/direct/>
5
6SELECT
7 ?agent ?name ?hojinBangou
8WHERE {
9 ?agent a class:Agent;
10 schema:name ?name ;
11 ma:wikidata ?wikidataPage .
12 # WikidataのリソースURIに変換
13 BIND (URI(REPLACE(?wikidataPage, "https://www.wikidata.org/wiki/", "http://www.wikidata.org/entity/")) AS ?wikidataEntity)
14
15 # Wikidata
16 SERVICE <https://query.wikidata.org/sparql> {
17 # P3225: 法人番号
18 ?wikidataEntity wdt:P3225 ?hojinBangou ;
19 }
20}
21LIMIT 100
「日本ゲーム大賞」を受賞したゲームを取得する #
DBpedia JapaneseとWikidataとメディア芸術データベースを連携したfederatedクエリ
1PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
2PREFIX owl: <http://www.w3.org/2002/07/owl#>
3PREFIX dcterms: <http://purl.org/dc/terms/>
4PREFIX schema: <https://schema.org/>
5PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
6PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
7PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
8PREFIX wdt: <http://www.wikidata.org/prop/direct/>
9PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
10
11SELECT
12 ?MADBID ?genre ?label
13WHERE {
14 hint:Query hint:joinOrder "Ordered" .
15 # DBpedia Japanese
16 SERVICE <https://ja.dbpedia.org/sparql> {
17 SELECT DISTINCT
18 (URI(REPLACE(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/", "http://www.wikidata.org/entity/"))
19 AS ?wikidataEntity)
20 {
21 # 下位カテゴリを含める
22 <http://ja.dbpedia.org/resource/Category:日本ゲーム大賞受賞ソフト> ^skos:broader* ?category .
23 ?dbpediaEntity dcterms:subject ?category ;
24 ^owl:sameAs ?wikidataEntity .
25 FILTER(STRSTARTS(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/"))
26 }
27 }
28 # Wikidata
29 SERVICE <https://query.wikidata.org/sparql> {
30 # P7886: メディア芸術データベース識別子
31 ?wikidataEntity wdt:P7886 ?MADBID .
32 }
33 # メディア芸術データベース
34 ?MADBResource schema:identifier ?MADBID ;
35 schema:genre ?genre ;
36 rdfs:label ?label .
37}
38LIMIT 100
クエリは必ずしも上から順番に実行されるとは限らないため、federatedクエリの実行順序次第では非常に時間がかかる処理となり、結果が返ってこない場合があります。
RDFストアによってはクエリオプティマイザに実行順序を指示する方法が用意されており、メディア芸術データベースのSPARQLクエリサービスが使用しているAmazon Neptuneでは
hint:Query hint:joinOrder "Ordered" .
というパターンを記述します。
「タイムトラベルを題材とした作品」を取得する #
DBpedia JapaneseとWikidataとメディア芸術データベースを連携したfederatedクエリ
1PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
2PREFIX owl: <http://www.w3.org/2002/07/owl#>
3PREFIX dcterms: <http://purl.org/dc/terms/>
4PREFIX schema: <https://schema.org/>
5PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
6PREFIX class: <https://mediaarts-db.bunka.go.jp/data/class#>
7PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property#>
8PREFIX wdt: <http://www.wikidata.org/prop/direct/>
9PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
10
11SELECT
12 ?MADBID ?genre ?label
13WHERE {
14 hint:Query hint:joinOrder "Ordered" .
15 # DBpedia Japanese
16 SERVICE <https://ja.dbpedia.org/sparql> {
17 SELECT DISTINCT (URI(REPLACE(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/", "http://www.wikidata.org/entity/"))
18 AS ?wikidataEntity) {
19 <http://ja.dbpedia.org/resource/Category:タイムトラベルを題材とした作品> ^skos:broader* ?category .
20 ?dbpediaEntity dcterms:subject ?category;
21 ^owl:sameAs ?wikidataEntity .
22 FILTER(STRSTARTS(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/"))
23 }
24 }
25 # Wikidata
26 SERVICE <https://query.wikidata.org/sparql> {
27 ?wikidataEntity wdt:P7886 ?MADBID .
28 }
29 # メディア芸術データベース
30 ?MADBResource schema:identifier ?MADBID ;
31 schema:genre ?genre ;
32 rdfs:label ?label .
33}
34LIMIT 200
Wikipediaのカテゴリは上記のようなクエリで汎用的に使うことができます。
他にも以下のようなカテゴリを使うことで、いわゆる「聖地」による作品のキュレーションとして活用することができます。