takanakahiko’s blog

多分三日坊主で辞めます。

PrismDB の紹介 と プリパラで学ぶ LOD

プリッカソンというコミュニティで PrismDB というものを作っています。 PrismDB がどういうものか、わかりやすいように説明していければと思います。

この記事は #プリッカソン Advent Calendar 2020 の15日目の記事です。 大遅刻です、本当に申し訳ない。

adventar.org

PrismDB の紹介では避けて通れぬ LOD

PrismDB とはプリティシリーズに関する情報を集め、提供する LOD プラットフォームです。 注意点として、ファンメイドなプラットフォームでありであり、公式とは一切の関係が無いです。

LOD の正式名称は Linked Open Data で、 インターネットで情報を公開するときに関わる技術のことです。 LOD の重要な技術要素として RDF と SPARQL というものがあります。 真中らぁらを例に RDF や SPARQL について学んでいきましょう。

プリパラで学ぶ RDF

まずは「トリプル」について理解する必要があります。 トリプルは「主語 -> 述語 -> 目的語」といった形式のデータのことを指します。 例えば「"真中らぁら" の "誕生日" は "11/20" です」みたいのように表すことができます。 その他にも、例えば以下のように表現することができます。 (長くなりすぎるのでウェスト姉弟にはお休みしていただいています)

主語 述語 目的語
真中らぁら 好き ピザ
真中らぁら 所属 SoLaMi♡SMILE
南みれぃ 所属 SoLaMi♡SMILE
北条そふぃ 所属 SoLaMi♡SMILE
東堂シオン 所属 DressingPafé
... ... ...

これをもとに、RDFの形にしていきましょう。 RDFではトリプルでデータを表現することに加えて「主語と述語がURIである」「目的語はURIかデータである」といったルールがあります。 それを考えると、例の「"真中らぁら" の "誕生日" は "11/20" です」はRDFには不適切であることがわかります。 そこで、主語と述語を URI にしていきましょう。 URI には推奨されているた形式はありますが、基本的には WebページのURLを決めるときと同じように決めましょう。 今回は以下のようにURIを決めることにします。

すると、「"真中らぁら" の "誕生日" は "11/20" です」をRDFで表すことができます。

しかし、ここで疑問に思う方もいるかもしれません。 「この情報からは "真中らぁら" という名前がなくなってしまっているので不十分ではないか」という点です。 そういった場合には、以下のように別途トリプルを作ることで解決します。

このようにすることで、以下のように情報を増やしていくことができるのです。 URI 全部乗せると長くなるので、ドメイン以前は省略します。 うおっ...多くなってきたな...。

主語 述語 目的語
/rdfs/character/manaka_laala /prism-schema.ttl#name 真中らぁら
/rdfs/character/manaka_laala /prism-schema.ttl#birthday 11/20
/rdfs/character/manaka_laala /prism-schema.ttl#favorite_brand ピザ
/rdfs/character/manaka_laala /prism-schema.ttl#memberOf SoLaMi♡SMILE
/rdfs/character/minami_mirei /prism-schema.ttl#name 南みれぃ
/rdfs/character/minami_mirei /prism-schema.ttl#memberOf SoLaMi♡SMILE
/rdfs/character/hojo_sophie /prism-schema.ttl#name 北条そふぃ
/rdfs/character/hojo_sophie /prism-schema.ttl#memberOf SoLaMi♡SMILE
/rdfs/character/todo_shion /prism-schema.ttl#name 東堂シオン
/rdfs/character/todo_shion /prism-schema.ttl#memberOf DressingPafé
... ... ...

ここで出した例はあくまでもサンプルですので、 PrismDB の実データとは若干の違いがありますので注意が必要です。

プリパラで学ぶ SPARQL

RDF を決めたは良いですが、それは実際にどのように役立つのでしょうか。 RDFは、SPARQL といったもので検索できるようにすることでその真価を発揮します。 では SPARQL とは一体どのようなものか、先程作った RDF を例に紹介していきます。

例えば、SoLaMi♡SMILEのメンバーを調べたいとしましょう。 そのようなときに SPARQL を使って RDF を検索することで調べることができます。 まず RDF で「SoLaMi♡SMILEのメンバーである」を表すトリプルはどのような状態であるか考えてみましょう。 以下のようになりますね。

つまり「 A -> "/prism-schema.ttl#memberOf" -> "SoLaMi♡SMILE" 」の A に当てはまる部分を列挙すれば良いことになります。 それを SPARQL で表すと以下のようになります。

SELECT ?A
WHERE {
  A <https://prismdb.takanakahiko.me/prism-schema.ttl#memberOf> "SoLaMi♡SMILE".
}

それぞれ行は以下のようになっています。

  1. SELECT ?A は「以下の条件に当てはまる A を列挙せよ」
  2. WHERE のカッコの中に実際の条件が書かれる
  3. A </prism-schema.ttl#memberOf> "SoLaMi♡SMILE". は「AはSoLaMi♡SMILEのメンバーである」
  4. 2行目のカッコを閉じる

で、この SPARQL で検索すると以下のような結果を取得できるわけです。

A
https://prismdb.takanakahiko.me/rdfs/character/manaka_laala
https://prismdb.takanakahiko.me/rdfs/character/minami_mirei
https://prismdb.takanakahiko.me/rdfs/character/hojo_sophie

めでたしめでたし.... とはいきませんね。 実際にこれを使うときに URI が取得できてもあまり嬉しくありません。 こういうときには name も取得する必要があります。 つまり以下を満たすような A と B を列挙すれば良さそうです。

  • 「 A -> "/prism-schema.ttl#memberOf" -> "SoLaMi♡SMILE" 」
  • 「 A -> "/prism-schema.ttl#name" -> B 」

それを SPARQL に書き換えると以下のようになります。

SELECT ?A ?B
WHERE {
  A <https://prismdb.takanakahiko.me/prism-schema.ttl#memberOf> "SoLaMi♡SMILE".
  A <https://prismdb.takanakahiko.me/prism-schema.ttl#name> B.
}

上記の SPARQL で検索すると以下のように取得できます。

A B
https://prismdb.takanakahiko.me/rdfs/character/manaka_laala 真中らぁら
https://prismdb.takanakahiko.me/rdfs/character/minami_mirei 南みれぃ
https://prismdb.takanakahiko.me/rdfs/character/hojo_sophie 北条そふぃ

このようにすると、「真中らぁらの好きな食べ物は?」や「東堂シオンの所属チームは?」のようなことも簡単に調べることができますね。 これが SPARQL の魅力です。

しかし、紹介したものは SPARQL のほんの一部分にしか過ぎません。 興味がありましたら更に SPARQL について調べて見ると良いです。

PrismDB で何を提供しているのか

では実際に PrismDB が、 RDF や SPARQL をどのように使っているか紹介していきます。

まず RDF ですが、以下のようなページから確認することができます。 以下は真中らぁらの詳細ページです。 真中らぁらの詳細ページには /rdfs/character/manaka_laala を主語とするトリプル一覧が記載されています。

https://prismdb.takanakahiko.me/rdfs/character/manaka_laala

また PrismDB の RDF 一覧は以下の URL から見ることができます

https://prismdb.takanakahiko.me/rdfs

次に SPARQL ですが、PrismDB では SPARQL エンドポイントというものを用意しています。 SPARQL エンドポイントは、クエリを URL につけたり POST したりすることで結果を取得できるようなWebサーバ(のエンドポイント)のことです。 PrismDB の SPARQL エンドポイント は以下にあります。 クエリを入力した後に「Run Query」ボタンを押すことで検索を行うことができます。

https://prismdb.takanakahiko.me/sparql/

試しに「Query Text」の部分を以下のクエリに書き換えて実行してみましょう。

select ?v ?c
where {
<https://prismdb.takanakahiko.me/rdfs/character/manaka_laala> ?v ?c
}

そうすると、 /rdfs/character/manaka_laala を主語と述語と目的語のペアを見ることができます。 ほかにも、以下のページで使えそうなクエリを調べてみると面白いかもしれません。

space.pikopikopla.net

さらに先程書いたとおり、SPARQL エンドポイントはクエリを URL につけたり POST したりすることで結果を取得できるようなWebサーバ(のエンドポイント)のことです。 以下のようにクエリを URI エンコードして SPARQL エンドポイントにアクセスすることで、プログラムから取得することも可能です。

https://prismdb.takanakahiko.me/sparql/?default-graph-uri=&query=select+%3Fv+%3Fc%0D%0Awhere+%7B%0D%0A%3Chttps%3A%2F%2Fprismdb.takanakahiko.me%2Frdfs%2Fcharacter%2Fmanaka_laala%3E+%3Fv+%3Fc%0D%0A%7D&format=application%2Fsparql-results%2Bjson&timeout=0&debug=on&run=+Run+Query+

まとめると PrismDB では以下を提供していることになります。

  • プリティーシリーズに関する RDF
  • それらを検索できる SPARQL エンドポイント

とはいえ...

やはり、 RDF やSPARQL を理解するのはとても難しいです。 そこで PrismDB では LOD に対する知見がなくても利用できるような仕組みがあります。

それに関する話はこちらにありますので興味がありましたらぜひ。

takanakahiko.hatenablog.com

さいごに

よかったら PrismDB を利用していただけると嬉しい限りです。 PrismDB を作っている理由はやはり「使ってもらうため」です。 使ってもらってなんぼなので、ガンガン使ってくれると嬉しい限りです。 質問等は気兼ねなく @takanakahiko_pr までどうぞ。

また重ねてになりますが、初期から手伝ってくださっている @banjun さん、データの追加に積極的な @sergeant118 さん、 便利な活用事例 を作ってくださっている @sue445 さん、他にも支えてくださっている様々な方に感謝です。ありがとうございます。

以上、 #プリッカソン Advent Calendar 2020 の15日目の記事でした。 引き続きお楽しみいただけると幸いです。