SPARQL
RDFに対する問い合わせ言語
https://ja.wikipedia.org/wiki/SPARQL
Claude Code.icon
一言で言うと
SPARQLは「RDFグラフに対する問い合わせ言語」です。SQLがリレーショナルDBに対する標準クエリ言語であるように、SPARQLはRDF(knowledge graph)に対する標準クエリ言語です。W3C標準。
正式には再帰頭字語で SPARQL Protocol and RDF Query Language。「スパークル」と読みます。
中核アイデア:グラフのパターンマッチング
SQLが「表」を相手にするのに対し、SPARQLは「トリプルの集まり(グラフ)」を相手にします。
基本動作はシンプルで、「探したいトリプルのパターンを、変数入りで書く」→「グラフの中でそのパターンに当てはまる部分を全部見つける」 だけです。
変数は ? で始めます。
code:sparql
PREFIX ex: <http://example.org/>
PREFIX dc: <http://purl.org/dc/terms/>
SELECT ?book WHERE {
?book dc:creator ex:夏目漱石 .
}
これは「?book — creator — 夏目漱石 というトリプルに当てはまる ?book を全部返せ」という意味。データに当てはめると:
code:_
こころ — creator — 夏目漱石 ✅ マッチ → ?book = こころ
坊っちゃん — creator — 夏目漱石 ✅ マッチ → ?book = 坊っちゃん
吾輩は猫 — creator — 芥川龍之介 ❌
結果:こころ, 坊っちゃん
複数パターンを繋ぐ=JOINが自然にできる
複数のトリプルパターンを . で並べると、同じ変数が共通の結び目になり、グラフをたどる動きになります。
code:sparql
SELECT ?bookTitle ?year WHERE {
?book dc:creator ex:夏目漱石 .
?book dc:title ?bookTitle .
?book dc:date ?year .
}
?book が3つのパターンを繋いでいるので、「漱石が書いた本」の「タイトル」と「出版年」を同時に取得できます。SQLのJOINに相当する操作が、変数を共有するだけで自然に書けるのがSPARQLの気持ちよさです。
4つのクエリ形式
SPARQLには問い合わせの「出力の型」が4種類あります。
table:_
形式 役割 SQL類似
SELECT 変数の値を表で返す SELECT
ASK 条件を満たすものが存在するか true/false EXISTS
CONSTRUCT 結果から新しいRDFグラフを生成 (データ変換)
DESCRIBE あるリソースに関するトリプルをまとめて返す (なし)
SELECTが圧倒的によく使われますが、CONSTRUCTはデータ変換・グラフ生成に強力で、SPARQLならではです。
よく使う構文要素
SQLに似たものが揃っています。
code:sparql
SELECT ?name ?year WHERE {
?person a ex:Author .
?person ex:name ?name .
OPTIONAL { ?person ex:birthYear ?year . } # 左外部結合(無くてもOK)
FILTER (?year > 1850) # 絞り込み条件
}
ORDER BY DESC(?year) # 並び替え
LIMIT 10 # 件数制限
主な要素:
OPTIONAL: そのパターンが無くても結果を捨てない(SQLのLEFT JOIN相当)
FILTER: 値による絞り込み(比較、正規表現 regex() など)
UNION: 複数パターンのどちらかにマッチ(OR)
集約: GROUP BY, COUNT, SUM, AVG も使える
ORDER BY / LIMIT / OFFSET / DISTINCT: SQLとほぼ同じ
SPARQLならではの強力な機能:プロパティパス
これはSQLにない、グラフ言語ならではの機能です。エッジを「何ステップでも」たどることを簡潔に書けます。
code:sparql
# 漱石の「弟子の弟子の…」を何階層でも全部たどる
SELECT ?descendant WHERE {
ex:夏目漱石 ex:hasStudent+ ?descendant .
}
+ : 1回以上の繰り返し
* : 0回以上
/ : パスの連結(ex:parent/ex:parent = 祖父母)
| : どちらかのパス
^ : 逆方向にたどる
SQLで再帰的な階層探索をするには WITH RECURSIVE などが必要ですが、SPARQLは + 一文字で書けます。グラフ的な「何ホップも辿る」問い合わせが得意なのが特徴です。
SPARQL Endpoint(プロトコル側)
SPARQLは言語であると同時にプロトコルでもあります。多くのknowledge graphは SPARQL endpoint というHTTPのАПIを公開していて、誰でもクエリを投げられます。
代表的な公開エンドポイント:
table:_
エンドポイント 内容
Wikidata query.wikidata.org 汎用知識
DBpedia Wikipediaから抽出した知識
欧州各国の図書館・政府データ オープンデータ
たとえばWikidataのエンドポイントで「すべての猫の品種」「日本のすべての市とその人口」のような問い合わせが実際に投げられます。
オントロジー・推論との関係
前回のオントロジーの話と繋がる重要な点:
SPARQLは基本的に書かれているトリプルだけを検索します(素のグラフ)。
ただしエンドポイントが推論(reasoning)を有効化していると、OWL/RDFSで導出された「暗黙のトリプル」も検索対象になります。
例:「こころ は Novel」しか書いてなくても、Novel ⊂ Book という定義があれば、?x a ex:Book のクエリで こころ がヒットする。
つまり「オントロジーで意味を定義 → 推論で暗黙知を展開 → SPARQLで問い合わせ」という連携で真価を発揮します。