From 76d7d41d3fb14200f23875067f7a4d779d6e7f05 Mon Sep 17 00:00:00 2001 From: Babibubebon Date: Wed, 7 Sep 2022 04:02:03 +0900 Subject: [PATCH] add queries --- content/docs/federated_query.md | 103 ++++++++++++++++++++++ content/docs/mediaartsdb.md | 149 ++++++++++++++++++++++++++++++-- 2 files changed, 245 insertions(+), 7 deletions(-) create mode 100644 content/docs/federated_query.md diff --git a/content/docs/federated_query.md b/content/docs/federated_query.md new file mode 100644 index 0000000..e3f3606 --- /dev/null +++ b/content/docs/federated_query.md @@ -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: +PREFIX class: +PREFIX ma: + +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 { + # P3225: 法人番号 + ?wikidataEntity ?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: +PREFIX owl: +PREFIX dcterms: +PREFIX schema: +PREFIX skos: +PREFIX class: +PREFIX ma: +PREFIX wdt: +PREFIX hint: + +SELECT + ?MADBID ?genre ?label +WHERE { + hint:Query hint:joinOrder "Ordered" . + # DBpedia Japanese + SERVICE { + SELECT DISTINCT + (URI(REPLACE(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/", "http://www.wikidata.org/entity/")) + AS ?wikidataEntity) + { + ^skos:broader* ?category . + ?dbpediaEntity dcterms:subject ?category; + ^owl:sameAs ?wikidataEntity . + FILTER(STRSTARTS(STR(?wikidataEntity), "http://wikidata.dbpedia.org/resource/")) + } + } + # Wikidata + SERVICE { + # 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 >}} \ No newline at end of file diff --git a/content/docs/mediaartsdb.md b/content/docs/mediaartsdb.md index f5775a9..d8bb02e 100644 --- a/content/docs/mediaartsdb.md +++ b/content/docs/mediaartsdb.md @@ -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: +## SPARQLクエリエディタ {#query-editor} +{{< yasgui id="madb-lod" endpoint="https://mediag.bunka.go.jp/sparql" >}} +PREFIX rdf: PREFIX rdfs: PREFIX schema: PREFIX class: PREFIX ma: SELECT * WHERE { ?sub ?pred ?obj . -} LIMIT 10` ->}} +} LIMIT 10 +{{< / yasgui >}} ----- -### 公開年毎にアニメテレビレギュラーシリーズ数を集計する +## クエリ集 {#queries} + +### 全リソースを種別ごとに集計する {#aggregation-by-genre} +{{< yasgui-query yasgui-id="madb-lod" title="集計" >}} +PREFIX schema: +PREFIX 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: +PREFIX schema: +PREFIX ma: +PREFIX 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"} + + a class:MangaBook ; + rdfs:label "鬼滅の刃 1" ; + schema:identifier "M464950" ; + schema:additionalType class:CM ; + schema:genre "マンガ単行本" ; + dcterms:creator ; + 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 ; + schema:isbn "9784088807232" ; + schema:location "東京" ; + schema:name "キメツ ノ ヤイバ"@ja-Hrkt , "鬼滅の刃" ; + schema:position "1.0" ; + schema:provider [ ma:materialIdentifier ; + 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: +PREFIX schema: +PREFIX ma: +PREFIX 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: PREFIX rdf: @@ -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 >}} \ No newline at end of file +{{< / yasgui-query >}} + + +### 登場キャラクター名がタイトルのアニメシリーズ {#anime-character-name-title} +{{< yasgui-query yasgui-id="madb-lod" title="公開年毎にTVアニメシリーズ数を集計する" >}} +PREFIX schema: +PREFIX rdf: +PREFIX rdfs: +PREFIX 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 >}} +