複数エンドポイントの横断的活用

複数エンドポイントの横断的活用 #

SPARQLでは、1つのエンドポイントだけでなく、外部の複数のエンドポイントに対してクエリを実行することができるfederatedクエリという仕組みがあります。

federatedクエリを利用したクエリを紹介します。

SPARQLクエリエディタ #


クエリ集 #

作品の多言語のタイトルを取得する #

https://mediaarts-db.bunka.go.jp/id/C413599

P7886(メディア芸術データベース識別子)

 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" . というパターンを記述します。

参照: Amazon Neptune: SPARQL クエリヒント

「タイムトラベルを題材とした作品」を取得する #

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のカテゴリは上記のようなクエリで汎用的に使うことができます。

他にも以下のようなカテゴリを使うことで、いわゆる「聖地」による作品のキュレーションとして活用することができます。


クリエイティブ・コモンズ・ライセンス By Shohei TOYOTA
この作品はクリエイティブ・コモンズ 表示 - 継承 4.0 国際ライセンスの下に提供されています。