【注意】 このドキュメントは、W3CのSPARQL 1.1 Overview W3C Recommendation 21 March 2013の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2013年4月11日
このドキュメントに対する正誤表を参照してください。いくつかの規範的な修正が含まれているかもしれません。
翻訳版も参照してください。
Copyright © 2013 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and document use rules apply.
このドキュメントは、SPARQL 1.1の概要です。このドキュメントでは、ウェブ上またはRDFストア内のRDFグラフのコンテンツに対するクエリの実行や処理を容易にするW3C仕様を紹介しています。
この項は、このドキュメントの公開時のステータスについて記述しています。他のドキュメントがこのドキュメントに取って代わることがありえます。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、http://www.w3.org/TR/のW3C技術報告インデックスにあります。
このドキュメントは、SPARQLワーキンググループが作成した以下の11のSPARQL 1.1勧告のうちの1つです。
旧バージョン以降、このドキュメントには実質的な変更はありませんでした。マイナーな編集上の変更がある場合には、変更履歴に詳細が記述されており、色分けした差分として見ることができます。
public-rdf-dawg-comments@w3.org(公開アーカイブ)にコメントをお送りください。このドキュメントに対するSPARQLワーキンググループの作業は完了していますが、コメントは正誤表や今後の改定で扱われることがあります。公開討論は、public-sparql-dev@w3.org(公開アーカイブ)で歓迎します。
このドキュメントは、W3Cメンバー、ソフトウェア開発者、他のW3Cグループ、および他の利害関係者によりレビューされ、W3C勧告として管理者の協賛を得ました。これは確定済みドキュメントであり、参考資料として用いたり、別のドキュメントで引用することができます。勧告の作成におけるW3Cの役割は、仕様に注意を引き付け、広範囲な開発を促進することです。これによってウェブの機能性および相互運用性が増強されます。
このドキュメントは、2004年2月5日のW3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。
1 はじめに
1.1 例
2 SPARQL 1.1クエリ言語
3 SPARQL 1.1がサポートする様々なクエリ結果フォーマット(XML、JSON、CSV、TSV)
4 SPARQL 1.1統合クエリ
5 SPARQL 1.1含意レジーム
6 SPARQL 1.1更新言語
7 SPARQL 1.1 RDF用プロトコル
8 SPARQL 1.1サービス記述
9 SPARQL 1.1グラフ・ストアHTTPプロトコル
10 謝辞
11 参考文献
SPARQL 1.1は、ウェブ上またはRDFストア内のRDFグラフのコンテンツに対するクエリの実行や処理を行うための言語とプロトコルを示した仕様です。この標準には、次の仕様が含まれています。
以下では、SPARQLの言語、プロトコル、関連する仕様書の使用について、小さな例を用いて説明しています。
「http://example.org/alice」というURLでウェブ上で公開されているRDFグラフには、アリス(Alice)と彼女の社会的関係に関する個人情報が含まれています。ここでは、実例として、Turtle[Turtle]構文を用いています。
@prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . <http://example.org/alice#me> a foaf:Person . <http://example.org/alice#me> foaf:name "Alice" . <http://example.org/alice#me> foaf:mbox <mailto:alice@example.org> . <http://example.org/alice#me> foaf:knows <http://example.org/bob#me> . <http://example.org/bob#me> foaf:knows <http://example.org/alice#me> . <http://example.org/bob#me> foaf:name "Bob" . <http://example.org/alice#me> foaf:knows <http://example.org/charlie#me> . <http://example.org/charlie#me> foaf:knows <http://example.org/alice#me> . <http://example.org/charlie#me> foaf:name "Charlie" . <http://example.org/alice#me> foaf:knows <http://example.org/snoopy> . <http://example.org/snoopy> foaf:name "Snoopy"@en .
SPARQL 1.1では、このようなグラフにクエリを実行してRDFストアに読み込み、それを様々な方法で処理できます。
上記のグラフのデータが、SPARQLサービス(つまり、SPARQLクエリを処理可能なHTTPサービス・エンドポイント)に読み込まれていれば、SPARQL 1.1クエリ言語を用いて、単純なグラフ・パターンマッチングから複雑なクエリに及ぶクエリを作成できます。例えば、次のように、SPARQL SELECTクエリを用いて、人の名前とその人の友達の数を問い合わせることができます。
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name (COUNT(?friend) AS ?count) WHERE { ?person foaf:name ?name . ?person foaf:knows ?friend . } GROUP BY ?person ?name
2008年に出された初期のSPARQL1.0仕様[SPARQL-Query]と同様に、複雑なクエリには、和集合(union)、オプションのクエリ部分(query part)、フィルタ(filter)が含まれるかもしれません。SPARQL 1.1には、値集約(value aggregation)、パス式(path expression)、入れ子のクエリ(nested quey)などの新しい機能が加えられました。SPARQLは、(変数バインディングを返す)SELECTクエリとは別に、ASKクエリ(つまり、ブール「yes/no」クエリ)、CONSTRUCTクエリ(クエリ結果から新しいRDFグラフを構築可能とする)をサポートしています。SPARQL 1.1の新しいクエリ言語の機能はすべて、ASKクエリとCONSTRUCTクエリで同じように使用できます。
SPARQL1.0と比べると、SPARQL 1.1は、クエリ言語に、サブクエリ(subquery)、値割当て(value assignment)、パス式(path expression)や(上記のクエリの例で使用しているCOUNTなどの)集約(aggregate)を含む多くの新しい機能を追加しています。
SPARQL 1.1クエリ言語ドキュメントは、SPARQL 1.1クエリの構文とセマンティクスを定義し、さらに、様々な使用例を提供します。
SPARQLのSELECTクエリの結果には、変数からRDF用語へのマッピングが多く含まれ、多くの場合、便宜上、表形式で表されます。例えば、2項のクエリには、次の結果が含まれています。
?name | ?count |
"Alice" | 3 |
"Bob" | 1 |
"Charlie" | 1 |
これらの結果を機械可読形式に交換するために、SPARQLは、4つの一般的な交換フォーマットをサポートしており、それらは、Extensible Markup Language(XML)、JavaScript Object Notation(JSON)、Comma Separated Values(CSV)とTab Separated Values(TSV)です。これらの結果フォーマットについては、次の3つの別々のドキュメントに記述されています。
これらのドキュメントでは、特定の解決策と解決策で生じるRDF用語を、それぞれの対象とするフォーマットでコード化する方法に関する詳細を定めています。
ここで例示しているクエリの結果は、これらの3つのフォーマットで、次のようになります。
XML:
<?xml version="1.0"?> <sparql xmlns="http://www.w3.org/2005/sparql-results#"> <head> <variable name="name"/> <variable name="count"/> </head> <results> <result> <binding name="name"> <literal>Alice</literal> </binding> <binding name="count"> <literal datatype="http://www.w3.org/2001/XMLSchema#integer">3</literal> </binding> </result> <result> <binding name="name"> <literal>Bob</literal> </binding> <binding name="count"> <literal datatype="http://www.w3.org/2001/XMLSchema#integer">1</literal> </binding> </result> <result> <binding name="name"> <literal>Charlie</literal> </binding> <binding name="count"> <literal datatype="http://www.w3.org/2001/XMLSchema#integer">1</literal> </binding> </result> </results> </sparql>
JSON:
{ "head": { "vars": [ "name" , "count" ] } , "results": { "bindings": [ { "name": { "type": "literal" , "value": "Alice" } , "count": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "3" } } , { "name": { "type": "literal" , "value": "Bob" } , "count": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "1" } } , { "name": { "type": "literal" , "value": "Charlie" } , "count": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "1" } } ] } }
CSV:
name,count Alice,3 Bob,1 Charlie,1
TSV:
?name<TAB>?count "Alice"<TAB>3 "Bob"<TAB>1 "Charlie"<TAB>1
(注: ここでは、例示目的のためだけに、タブ文字を目視できるように「<TAB>」とマークアップしています。)
SPARQL 1.1統合クエリ・ドキュメントは、サブクエリを様々なSPARQLエンドポイントに明示的に委譲する(delegate)ための基礎的なSPARQL 1.1クエリ言語の拡張について記述しています。
例えば、このドキュメントの例では、アリスの友達の中に、DBpediaにおいて<http://dbpedia.org/resource/Snoopy>というIRIで識別される資源と同じ名前を持つ人がいるかを知りたいとします。これは、次のように、友達の名前に対するクエリを、http://dbpedia.org/sparqlのSPARQLエンドポイントに対するリモート呼び出しと組み合わせ、SERVICEキーワードを用いて、<http://dbpedia.org/resource/Snoopy>の名前を見つけ出すことで可能となります。
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { <http://example.org/alice#me> foaf:knows [ foaf:name ?name ] . SERVICE <http://dbpedia.org/sparql> { <http://dbpedia.org/resource/Snoopy> foaf:name ?name } }
この結果は、次のとおりです。
?name |
"Snoopy"@en |
このとき、WHERE部分のパターンの最初の部分は、ローカルのSPARQLサービスとの一致を保っていますが、SERVICEというキーワードの後のパターンの評価は、個々のリモートのSPARQLサービスに委譲されます。
SPARQLは、RDFスキーマやOWL公理などの形で、オントロジーの情報と一緒に使用できます。例えば、この例のSPARQLサービスには、アリスに関するデータとは別に、RDFスキーマ[RDF-Schema]形式のオントロジー情報と、FOAF語彙を定義しているOWL[OWL2-Overview]構成子が読み込まれていると想定しましょう。
FOAFオントロジー:(抜粋のみ)
@prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . ... foaf:name rdfs:subPropertyOf rdfs:label . ...
次のクエリは、人のラベルを問い合わせます。
SELECT ?label WHERE { ?person rdfs:label ?label }
(標準的なシンプルな含意に加えて)特殊な含意レジームに対応していないSPARQLエンジンは、このクエリに対して結果を返さないでしょうが、RDFのスキーマに対応したクエリ・エンジンは結果を返すでしょう。
?label |
"Alice" |
"Bob" |
"Charlie" |
"Snoopy"@en |
その理由は、foaf:nameがrdfs:labelのサブプロパティーだからです。
SPARQL 1.1含意レジーム仕様は、どの回答をどの含意レジーム下で提供すべきかを定義し、RDF、RDFスキーマ、D-含意[RDF-MT]、OWL[OWL2-Overview]、RIF[RIF-Overview]の含意レジームを定めています。
SPARQL 1.1更新仕様は、SPARQL 1.1更新リクエストの構文とセマンティクスを定義し、さらに、様々な使用例を提供します。更新オペレーションは、複数の連続するリクエストで構成し、グラフ・ストア内のグラフのコレクションで実行することができます。オペレーションは、グラフ・ストア内のRDFグラフを更新、作成、削除するために提供されます。
例えば、次のリクエストは、ドロシー(Dorothy)という名前のアリスの新しい友達を、この例のSPARQLサービスのデフォルトのグラフに挿入し、その後、英語のタグを持つアリスのすべての友達の名前を削除します。
PREFIX foaf: <http://xmlns.com/foaf/0.1/> . INSERT DATA { <http://www.example.org/alice#me> foaf:knows [ foaf:name "Dorothy" ]. } ; DELETE { ?person foaf:name ?mbox } WHERE { <http://www.example.org/alice#me> foaf:knows ?person . ?person foaf:name ?name FILTER ( lang(?name) = "EN" ) .}
2番目のオペレーションが示しているとおり、挿入と削除はグラフ・ストアに対するクエリの結果に依存する可能性があり、WHERE部分で使用される個々の構文は、SPARQL 1.1クエリ言語に基づいています。
RDF用のSPARQL 1.1プロトコルは、SPARQL 1.1クエリと更新リクエストを、HTTPでSPARQLサービスに転送する方法を定義しています。リクエストをHTTPのGETとPOSTのオペレーションにマッピングする方法と、そのようなリクエストに対する個々のHTTPレスポンスがどのようなものになるべきかも定義しています。
例えば、http://www.example.org/sparql/で管理されているSPARQLクエリのサービスに対して発行された上記の3項のクエリは、この仕様に従い、1つのHTTP GETリクエストにまとめることができます(クエリ文字列がURIでコード化されている場合)。
GET /sparql/?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0ASELECT%20%3Fname%20%28COUNT%28%3Ffriend%29%20AS%20%3Fcount%29%0AWHERE%20%7B%20%0A%20%20%20%20%3Fperson%20foaf%3Aname%20%3Fname%20.%20%0A%20%20%20%20%3Fperson%20foaf%3Aknows%20%3Ffriend%20.%20%0A%7D%20GROUP%20BY%20%3Fperson%20%3Fname HTTP/1.1 Host: www.example.org User-agent: my-sparql-client/0.1
プロトコル仕様では、サポートされているHTTPメソッドに加え、レスポンスのコード化およびクエリと更新リクエストに対する様々なオペレーションに関する詳細も記述しています。
SPARQL 1.1サービス記述ドキュメントは、SPARQL 1.1 RDF用プロトコルで利用可能なSPARQLサービスを発見する方法と、それを記述するためのRDF語彙を記述しています。
この仕様に従い、サービス・エンドポイントは、追加の(クエリまたは更新リクエストの)パラメータなしにHTTP GETオペレーションでアクセスした時に、提供するサービスのRDF記述を返すべきです。例えば、http://www.example.org/sparql/で管理されているSPARQLエンドポイントに対し発行された次のHTTPリクエスト
GET /sparql/ HTTP/1.1 Host: www.example.org
は、サービス記述語彙を用いてRDF記述を返すべきです。例えば、このような記述は、個々のエンドポイントのデフォルト・データセット、あるいはサポートされているSPARQLクエリ言語機能と含意レジームに関する情報を提供します。
RDFデータを処理する多くのアプリケーションやサービスは、フルのSPARQL 1.1更新言語を必要としないかもしれません。そのため、SPARQL 1.1グラフ・ストアHTTPプロトコルは、HTTPオペレーションで直接グラフのコレクションを管理するオペレーションを実行する手段を提供します。
例えば、上記の4項の更新リクエストの最初の部分は、RDFグラフにトリプルをシンプルに挿入したものです。このプロトコルをサポートするサービスでは、(SPARQL 1.1更新リクエストではなく)このような挿入は、RDFトリプルをペイロードとして挿入して、HTTP POSTオペレーションで直接行なうことができます。
POST /rdf-graphs/service?graph=http%3A%2F%2Fwww.example.org%2Falice HTTP/1.1 Host: example.org Content-Type: text/turtle @prefix foaf: <http://xmlns.com/foaf/0.1/> . <http://www.example.org/alice#me> foaf:knows [ foaf:name "Dorothy" ] .
RDFグラフを変更(例えば、グラフ全体を入れ替えるためにHTTP PUTを用いるため、またはRDFグラフを取り除くためにHTTP DELETEを用いるために)したり、(HTTP GETで)検索したりするための、その他の直接的なHTTPオペレーションについては、SPARQL 1.1グラフ・ストアHTTPプロトコル仕様に記述されており、フルのSPARQL 1.1クエリ言語とSPARQL 1.1更新言語とを組み合わせたSPARQL 1.1プロトコルの軽量版ととらえることができます。
SPARQL 1.1仕様に積極的に貢献いただいたW3C SPARQLワーキンググループのメンバーは次のとおりです。