CyberLibrarian

【注意】 このドキュメントは、W3CのSPARQL 1.1 Protocol W3C Recommendation 21 March 2013の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。

First Update: 2013年8月13日 | セマンティック・ウェブ関連用語集


W3C

SPARQL 1.1プロトコル

W3C勧告 2013年3月21日

本バージョン:
http://www.w3.org/TR/2013/REC-sparql11-protocol-20130321/
最新バージョン:
http://www.w3.org/TR/sparql11-protocol/
旧バージョン:
http://www.w3.org/TR/2013/PR-sparql11-protocol-20130129/
編集者:
Lee Feigenbaum, Cambridge Semantics <lee@thefigtrees.net>
Gregory Todd Williams, Rensselaer Polytechnic Institute <greg@evilfunhouse.com>
Kendall Grant Clark, 1st Edition, Clark & Parsia LLC <kendall@clarkparsia.com>
Elias Torres, 1st Edition, IBM Corporation <eliast@us.ibm.com>

このドキュメントに対する正誤表を参照してください。いくつかの規範的な修正が含まれているかもしれません。

翻訳版も参照してください。


要約

SPARQLプロトコルとRDFクエリ言語(SPARQL)は、RDF用のクエリ言語とプロトコルです。このドキュメントでは、SPARQLプロトコルの仕様を定めています。それは、SPARQLのクエリと更新をSPARQL処理サービスに伝え、要求を行ったエンティティーにHTTPで結果を返すための手段を記述しています。このプロトコルは、アクティビティ声明で記述されているように、セマンティック・ウェブ・アクティビティの一部であるW3CのSPARQLワーキンググループによって開発されました。

このドキュメントのステイタス

置き換えられる可能性

この項は、このドキュメントの公開時のステイタスについて記述しています。他のドキュメントがこのドキュメントに取って代わることがありえます。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、http://www.w3.org/TR/のW3C技術報告インデックスにあります。

このドキュメントは、SPARQLワーキンググループが作成した以下の11のSPARQL 1.1勧告のうちの1つです。

  1. SPARQL 1.1概要
  2. SPARQL 1.1クエリ言語
  3. SPARQL 1.1更新
  4. SPARQL1.1サービス記述
  5. SPARQL 1.1統合クエリ
  6. SPARQL 1.1クエリ結果JSONフォーマット
  7. SPARQL 1.1クエリ結果CSVおよびTSVフォーマット
  8. SPARQLクエリ結果XMLフォーマット(第2版)
  9. SPARQL 1.1含意レジーム
  10. SPARQL 1.1プロトコル(このドキュメント)
  11. SPARQL 1.1グラフ・ストアHTTPプロトコル

本質的な変更なし

旧バージョン以降、このドキュメントには実質的な変更はありませんでした。マイナーな編集上の変更がある場合には、更新履歴に詳細が記述されており、色分けした差分として見ることができます。

コメントの送信

public-rdf-dawg-comments@w3.org公開アーカイブ)にコメントをお送りください。このドキュメントに対するSPARQLワーキンググループの作業は完了していますが、コメントは正誤表や今後の改定で扱われることがあります。公開討論は、public-sparql-dev@w3.org公開アーカイブ)で歓迎します。

W3Cによる承認

このドキュメントは、W3Cメンバー、ソフトウェア開発者、他のW3Cグループ、および他の利害関係者によりレビューされ、W3C勧告として管理者の協賛を得ました。これは確定済みドキュメントであり、参考資料として用いたり、別のドキュメントで引用することができます。勧告の作成におけるW3Cの役割は、仕様に注意を引き付け、広範囲な開発を促進することです。これによってウェブの機能性および相互運用性が増強されます。

特許

このドキュメントは、2004年2月5日のW3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。

目次

1 はじめに
    1.1 ドキュメントの規定
    1.2 用語
2 SPARQLプロトコル・オペレーション
    2.1 queryオペレーション
        2.1.1 GETによるquery
        2.1.2 URLエンコードされたパラメータを用いたPOSTによるquery
        2.1.3 POSTによる直接的なquery
        2.1.4 RDFデータセットの指定
        2.1.5 認められるレスポンス形式
        2.1.6 成功のレスポンス
        2.1.7 失敗のレスポンス
    2.2 updateオペレーション
        2.2.1 URLエンコードされたパラメータを用いたPOSTによるupdate
        2.2.2 POSTによる直接的なupdate
        2.2.3 RDFデータセットの指定
        2.2.4 成功のレスポンス
        2.2.5 失敗のレスポンス
    2.3 基底IRIの決定
3 SPARQLプロトコル・リクエストの例(参考情報)
    3.1 SPARQLクエリの例
        3.1.1 SELECTとサービスから提供されたRDFデータセット
        3.1.2 SELECTとシンプルなRDFデータセット
        3.1.3 CONSTRUCTとシンプルなRDFデータセットおよびHTTP内容交渉
        3.1.4 ASKとシンプルなRDFデータセット
        3.1.5 DESCRIBEとシンプルなRDFデータセット
        3.1.6 SELECTと複合的なRDFデータセット
        3.1.7 SELECTとクエリのみのRDFデータセット
        3.1.8 SELECTと曖昧なRDFデータセット
        3.1.9 SELECTと不正なクエリのフォルト
        3.1.10 SELECTとクエリ・リクエスト拒否のフォルト
        3.1.11 POSTとURLエンコーディングを用いた長いSELECTクエリ
        3.1.12 POSTを直接用いた長いSELECTクエリ
        3.1.13 SELECTと国際化
    3.2 SPARQL更新の例
        3.2.1 URLエンコードされたパラメータを用いたUPDATE
        3.2.2 POSTを直接用いたUPDATE
        3.2.3 データセットを指定し、POSTを直接用いたUPDATE
        3.2.4 URLエンコードされたパラメータを用いた多重オペレーションUPDATE
        3.2.5 データセットを指定し、URLエンコードされたパラメータを用いた多重オペレーションUPDATE
        3.2.6 データセットを指定し、POSTを直接用いた多重オペレーションUPDATE
4 方針に関する考察
    4.1 セキュリティ
5 適合性
6 前勧告以後の変更(参考情報)

付録

A 参考文献
    A.1 規範的な参考文献
    A.2 その他の参考文献


1 はじめに

このドキュメントでは、SPARQLのクエリと更新をクライアントからSPARQLプロセッサに伝える手段であるSPARQL 1.1プロトコルについて記述しています。SPARQLプロトコルは、SPARQL 1.1クエリ言語[SPARQL]およびRDF用のSPARQL 1.1更新言語と互換性があるように設計してあります。このドキュメントは、SPARQLのクエリと更新のサービスとクライアントの実装に興味を持っているソフトウェア開発者を主として対象としています。

SPARQLプロトコルは、SPARQLクエリ言語のクエリを行なうためのクエリ・オペレーションと、SPARQL更新言語のリクエストを行なうための更新オペレーションの2つのHTTPオペレーションで構成されます。SPARQLプロトコルのクライアントは、リクエストを処理して元のクライアントにHTTPレスポンスを送り返すSPARQLプロトコル・サービスにHTTPリクエストを送ります。

別のドキュメントでは、RESTアーキテクチャ・スタイルのグラフのコレクションを管理する目的でHTTPオペレーションの用法を記述したSPARQL 1.1グラフ・ストアHTTPプロトコルを記述しています。

1.1 ドキュメントの規定

ドキュメントが、しなければならない(MUST)、してはならない(MUST NOT)、すべきである/する必要がある(SHOULD)、すべきでない/する必要がない(SHOULD NOT)、することができる/してもよい(MAY)、推奨される(RECOMMENDED)という単語を使用し、強調されたテキストとして出現するとき、RFC 2119[RFC2119]で記述されているとおりに解釈されなければなりません。

1.2 用語

SPARQLプロトコル・クライアント
SPARQLプロトコル・オペレーションにHTTPリクエストを送るHTTPクライアント(RFC 2616[RFC2616]で定義されているとおりに)。(別名: クライアント
SPARQLプロトコル・サービス
SPARQLプロトコル・オペレーションに対し、HTTPリクエストのサービスを行い、HTTPレスポンスを送り返すHTTPサーバ。SPARQLプロトコル・サービスがリクエストを受けるURIは、一般にSPARQLエンドポイントとして知られています。(別名: サービス
SPARQLエンドポイント
SPARQLプロトコル・サービスがSPARQLプロトコル・クライアントからのリクエストを受けるURI。
SPARQLプロトコル・オペレーション
このドキュメントに定義されているプロトコルに準拠したHTTPリクエストとレスポンス。
RDFデータセット
SPARQL 1.1クエリ言語で定義されているとおり、デフォルト・グラフおよび0以上の名前付きグラフのコレクション

2 SPARQLプロトコル・オペレーション

SPARQLプロトコルは、クエリと更新の、2つのオペレーションで構成されます。プロトコル・オペレーションは、次の組み合わせを定義します。

SPARQL 1.1プロトコルは、HTTP上に構築されます。リクエストとレスポンスに対するすべてのHTTPの要件に従わなければなりません(MUST)。

2.1 queryオペレーション

queryオペレーションは、サービスにSPARQLクエリを送り、そのクエリの結果を受け取るために用いられます。クエリ・オペレーションは、HTTP GETメソッドかHTTP POSTメソッドのいずれかで呼び出さなければなりません(MUST)。このオペレーションに対するクライアントのリクエストは、きっかり1つのSPARQLクエリ文字列(パラメータ名: query)を含まなければならず(must)、0以上のデフォルト・グラフURI(パラメータ名: default-graph-uri)と名前付きグラフURI(パラメータ名: named-graph-uri)を含むことができます(may)。クエリ・リクエストに対するレスポンスは、クエリ形式[SPARQL]や内容交渉[RFC2616]に応じて、SPARQL XML結果フォーマットSPARQL JSON結果フォーマットSPARQL CSV/TSV結果フォーマット、RDFシリアル化のいずれかです。

  HTTPメソッド クエリ文字列パラメータ リクエストのコンテンツ・タイプ リクエストのメッセージ本文
GETによるクエリ GET query (exactly 1)
default-graph-uri (0 or more)
named-graph-uri (0 or more)
なし なし
URLエンコードされたPOSTによるクエリ POST なし application/x-www-form-urlencoded URL-encoded, ampersand-separated query parameters.
query (exactly 1)
default-graph-uri (0 or more)
named-graph-uri (0 or more)
POSTによる直接的なクエリ POST default-graph-uri (0 or more)
named-graph-uri (0 or more)
application/sparql-query Unencoded SPARQL query string

queryリクエストのパラメータは、これらの3つのオプションのうちの1つで送らなければなりません(must)。

2.1.1 GETによるquery

プロトコルのクライアントは、HTTP GETメソッドでプロトコル・リクエストを送ることができます(may)。GETメソッドを用いる場合、クライアントは、すべてのパラメータをURLパーセント・エンコーディング[RFC3986]し、それらを上記の名前を持つクエリ・パラメータ文字列として含まなければなりません(must)。

HTTPクエリ文字列のパラメータは、アンパサンド(&)の文字で区切られていなければなりません(must)。クライアントには、クエリ文字列パラメータを任意の順序で含むことができます。

HTTPリクエストには、メッセージ本文が含まれていてはなりませんMUST NOT)。

2.1.2 URLエンコードされたパラメータを用いたPOSTによるquery

プロトコル・クライアントは、URLエンコードされたパラメータにより、HTTP POSTメソッドでプロトコル・リクエストを送ることができます(may)。このメソッドを用いる場合、クライアントは、すべてのパラメータをURLパーセント・エンコーディング[RFC3986]し、上記の名前を持つapplication/x-www-form-urlencodedメディア・タイプにより、それらをパラメータとしてリクエスト本文内に含まなければなりません(must)。パラメータは、アンパサンド(&)で区切られていなければなりません(must)。クライアントには、パラメータを任意の順序で含むことができます。HTTPリクエストのコンテンツ・タイプ・ヘッダは、application/x-www-form-urlencodedに設定しなければなりません(must)。

2.1.3 POSTによる直接的なquery

プロトコル・クライアントは、クエリを直接含め、HTTPリクエストのメッセージ本文としてコード化せずに、HTTP POSTメソッドでプロトコル・リクエストを送ることができます(may)。このアプローチを用いる場合、クライアントは、SPARQLクエリ文字列を、コード化せず、リクエストのメッセージ本文には他に何もない状態で含まなければなりません(must)。クライアントは、HTTPリクエストのコンテンツ・タイプ・ヘッダをapplication/sparql-queryに設定しなければなりません(must)。クライアントは、リクエストURIに、オプションのdefault-graph-urinamed-graph-uriのパラメータをHTTPクエリ文字列パラメータとして含めることができます(may)。ここで、UTF-8のみが有効なcharset(文字集合)であることに注意してください。

2.1.4 RDFデータセットの指定

SPARQLクエリは、RDFデータセットに対して実行されます。クエリに対するRDFデータセットは、SPARQLプロトコルのdefault-graph-uriパラメータとnamed-graph-uriパラメータによるか、または、SPARQLクエリ文字列にFROMキーワードおよびFROM NAMEDキーワードを用いるかのいずれかで指定できます。異なるRDFデータセットが、プロトコル・リクエストとSPARQLクエリ文字列の両方で指定されていれば、SPARQLサービスは、プロトコル・リクエストで与えられているRDFデータセットを用いてクエリを実行しなければなりません(must)。

プロトコル・クライアントによるRDFデータセットの指定がサービスで認められていない場合、サービスはHTTPレスポンス・コードが400のクエリを拒否できる(may)ことに注意してください。

RDFデータセットが、プロトコル・リクエストでもSPARQLクエリ文字列でも指定されていなければ、実装は、実装が定義したデフォルトRDFデータセットにクエリを実行できます(may)。

2.1.5 認められるレスポンス形式

プロトコル・クライアントは、クライアントが利用できるレスポンス形式をリクエストするためにHTTP内容交渉[RFC2616]を使用すべきです(should)。可能なレスポンス形式の詳細に関しては、下記を参照してください。

2.1.6 成功のレスポンス

SPARQLプロトコルは、オペレーションが成功か失敗かを示すために、HTTPで定義されているレスポンス・ステータス・コードを用います。各ステータス・コードの詳細な定義に関しては、HTTP仕様[RFC2616]を参照してください。プロトコル・サービスは、成功したクエリに2XX HTTPレスポンス・コードを用いるべきです(should)が、その代わりに、HTTPのように3XXレスポンス・コードを用いることも選択できます(may)。

2XXのレスポンスを持つ成功したクエリ・オペレーションのレスポンス本文は、次のいずれかです。

  • XMLJSON、またはCSV/TSV形式(SPARQLクエリ形式SELECTASKに対する)のSPARQL結果ドキュメント。または、
  • 例えば、RDF/XML構文でシリアル化されたRDFグラフ[RDF-CONCEPTS]、または同等のRDFグラフ・シリアル化(SPARQLクエリ形式DESCRIBECONSTRUCTに対する)

成功したクエリ・オペレーションに対するレスポンスのコンテンツ・タイプは、レスポンス本文の形式に対して定義されているメディア・タイプでなければなりません。

2.1.7 失敗のレスポンス

成功しなかったクエリ・オペレーションに適用できるHTTPレスポンス・コードには、次のものが含まれます。

  • リクエストで提供されているSPARQLクエリが、SPARQL文法で定義されている言語の正当な文字列でなければ400。または、
  • サービスがクエリの実行に失敗すれば500。SPARQLプロトコル・サービスがクエリの実行を拒否した場合に、500のレスポンス・コードを返すこともできます。このレスポンスは、サーバが、その後の同じリクエスト(複数のリクエストも可)を処理できるか否かを示しません。

失敗したクエリ・リクエストのレスポンス本文は、実装依存です。実装は、人間または機械(または両方)が読むことのできる、失敗したクエリ・リクエストに関する情報を提供するためにHTTP内容交渉を使用できます(may)。

プロトコル・サービスは、HTTPのように、その他の失敗の状況に4XXや5XXのHTTPレスポンス・コードを用いることもできます(may)。

2.2 updateオペレーション

更新オペレーションは、サービスにSPARQL更新リクエストを送るために用いられます。更新オペレーションは、HTTP POSTメソッドを用いて呼び出されなければなりません(must)。このオペレーションのクライアントのリクエストには、きっかり1つのSPARQL更新リクエスト文字列(パラメータ名: update)が含まれていなければならず(must)、0以上のデフォルト・グラフURI(パラメータ名: using-graph-uri)と名前付きグラフURI(パラメータ名: using-named-graph-uri)を含むことができます(may)。更新リクエストに対するレスポンスは、HTTP反応ステータス・コードにより、リクエストの成功または失敗を示します。

  HTTPメソッド クエリ文字列パラメータ リクエストのコンテンツ・タイプ リクエストのメッセージ本文
URLエンコードされたPOSTによる更新 POST なし application/x-www-form-urlencoded URL-encoded, ampersand-separated query parameters.
update (exactly 1)
using-graph-uri (0 or more)
using-named-graph-uri (0 or more)
POSTによる直接的な更新 POST using-graph-uri (0 or more)
using-named-graph-uri (0 or more)
application/sparql-update Unencoded SPARQL update request string

updateリクエストのパラメータは、これらの2つのオプションのうちの1つで送らなければなりません(must)。

2.2.1 URLエンコードされたパラメータを用いたPOSTによるupdate

プロトコル・クライアントは、パラメータのURLエンコーディングによってHTTP POSTメソッドで更新プロトコル・リクエストを送ることができます(may)。このアプローチを用いる場合、クライアントは、すべてのパラメータをURLパーセント・エンコーディング[RFC3986]し、上記の名前を持つapplication/x-www-form-urlencodedメディア・タイプにより、それらをパラメータとしてリクエスト本文内に含まなければなりません(must)。パラメータは、アンパサンド(&)で区切られていなければなりません(must)。クライアントには、パラメータを任意の順序で含むことができます。HTTPリクエストのコンテンツ・タイプ・ヘッダは、application/x-www-form-urlencodedに設定しなければなりません(must)。

2.2.2 POSTによる直接的なupdate

プロトコル・クライアントは、更新リクエストを直接含め、HTTPリクエストのメッセージ本文としてコード化せずに、HTTP POSTメソッドで更新プロトコル・リクエストを送ることができます(may)。このアプローチを用いる場合、クライアントは、SPARQL更新リクエスト文字列を、コード化せず、リクエストのメッセージ本文には他に何もない状態で含まなければなりません(must)。クライアントは、HTTPリクエストのコンテンツ・タイプ・ヘッダをapplication/sparql-updateに設定しなければなりません(must)。クライアントは、リクエストURIに、オプションのusing-graph-uriusing-named-graph-uriのパラメータをHTTPクエリ文字列パラメータとして含めることができます(may)。

2.2.3 RDFデータセットの指定

SPARQL更新リクエストは、グラフ・ストア(SPARQLサービスが管理するRDFグラフの可変コンテナ)に対して実行されます。SPARQL更新DELETE/INSERTオペレーション[UPDATE]のWHERE句は、RDFデータセットのデータにマッチし、それはグラフ・ストアのサブセットです。更新オペレーションに対するRDFデータセットは、USINGUSING NAMED、および/またはWITHキーワードを用いて、オペレーション文字列自身で指定するか、using-graph-uriusing-named-graph-uriのパラメータによって指定するかのいずれかが可能です。

USINGUSING NAMED、またはWITH句を用いたオペレーションが含まれているSPARQL 1.1更新リクエストを伝えるためにこのプロトコルを用いる場合、using-graph-uriまたはusing-named-graph-uriのパラメータを提供することはエラーです。

SPARQL更新プロセッサは、USING <g>句がSPARQL 1.1更新リクエストのすべてのオペレーションに含まれているかのように、更新プロトコル・オペレーションの個々のusing-graph-uri=gパラメータの発生に対応すべきです。同様に、SPARQL更新プロセッサは、USING NAMED <g>句がSPARQL 1.1更新リクエストのすべてのオペレーションに含まれているかのように、更新プロトコル・オペレーションの個々のusing-named-graph-uri=gパラメータの発生に対応すべきです。

2.2.4 成功のレスポンス

SPARQLプロトコルは、オペレーションが成功か失敗かを示すために、HTTPで定義されているレスポンス・ステータス・コードを用います。各ステータス・コードの詳細な定義に関しては、HTTP仕様[RFC2616]を参照してください。プロトコル・サービスは、処理が成功した更新リクエストに2XX HTTPレスポンス・コードを用いるべきです(should)が、その代わりに、HTTPのように3XXレスポンス・コードを用いることも選択できます(may)。

成功した更新リクエストのレスポンス本文は、実装依存です。実装は、人間と機械の両方が読むことのできる、完了した更新リクエストに関する情報を提供するためにHTTP内容交渉を使用できます(may)

2.2.5 失敗のレスポンス

成功しなかった更新リクエストに対するHTTPレスポンス・コードは、次のとおりであるべきです。

  • SPARQL更新リクエスト文字列が、SPARQL更新文法で定義されている言語の正当な文字列でなければ400。または、
  • サービスが更新リクエストの実行に失敗すれば500。SPARQLプロトコル・サービスが更新リクエストの実行を拒否した場合に、500のレスポンス・コードを返すこともできます。このレスポンスは、サーバが、その後の同じリクエスト(複数のリクエストも可)を処理できるか否かを示しません。

失敗した更新リクエストのレスポンス本文は、実装依存です。実装は、人間または機械(または両方)が読むことのできる、失敗した更新リクエストに関する情報を提供するためにHTTP内容交渉を使用できます(may)。

プロトコル・サービスは、HTTPのように、その他の失敗の状況に4XXや5XXのHTTPレスポンス・コードを用いることもできます(may)。

2.3 基底IRIの決定

SPARQLクエリのBASEキーワードまたはSPARQL更新リクエスト文字列は、URI(Uniform Resource Identifier):一般的構文[RFC3986]の5.1.1項「コンテンツ内に埋め込まれた基底URI」にあるとおり、相対IRIを解決するために用いられる基底IRIを定めます。SPARQLプロトコルは、クエリのURIを逆参照しないため、5.1.3項は当てはまりません。最後に、5.1.4項のとおり、SPARQLプロトコル・サービスは、自身の基底URIを定義しなければならず(must)、それはサービス・エンドポイントになりえます(may)。

3 SPARQLプロトコル・リクエストの例(参考情報)

以下のHTTPトレースの例では、いくつかの異なるシナリオにおけるqueryupdateのオペレーションの呼び出しを示します。次の方法で、完全なHTTPトレースから、いくつかのトレースの例を抽出しました。

  1. 一部の例では、「EncodedQuery」という文字列は、例示されているSPARQLクエリ文字列と同等のURLエンコードされた文字列を表わします。「UnencodedQuery」という文字列は、コード化せずに例示しているSPARQLクエリ文字列そのものを表わします。
  2. queryペレーションの例の場合、クエリの結果を含む、部分的なレスポンス本文のみを表示しています。

3.1 SPARQLクエリの例

3.1.1 SELECTとサービスから提供されたRDFデータセット

次のSPARQLクエリ

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT ?book ?who 
WHERE { ?book dc:creator ?who }

は、次のHTTPトレースで示しているとおり、HTTP GETでSPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=PREFIX%20dc%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%20%0ASELECT%20%3Fbook%20%3Fwho%20%0AWHERE%20%7B%20%3Fbook%20dc%3Acreator%20%3Fwho%20%7D%0A HTTP/1.1
Host: www.example
User-agent: my-sparql-client/0.1

サービスから提供されたRDFデータセットに対するそのクエリ(そのSPARQLクエリのサービスによって実行された)は、次のクエリ結果を返します。

HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:55:12 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">

 <head>
   <variable name="book"/>
   <variable name="who"/>
 </head>
 <results>
   <result>
     <binding name="book"><uri>http://www.example/book/book5</uri></binding>
     <binding name="who"><bnode>r29392923r2922</bnode></binding>
   </result>
...
</sparql> 

3.1.2 SELECTとシンプルなRDFデータセット

次のSPARQLクエリ

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
SELECT ?book ?who 
WHERE { ?book dc:creator ?who }

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.other.example/sparql/)に伝えられます。

GET /sparql/?query=PREFIX%20dc%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%20%0ASELECT%20%3Fbook%20%3Fwho%20%0AWHERE%20%7B%20%3Fbook%20dc%3Acreator%20%3Fwho%20%7D%0A&default-graph-uri=http%3A%2F%2Fwww.other.example%2Fbooks HTTP/1.1
Host: www.other.example
User-agent: my-sparql-client/0.1

そのSPARQLクエリのサービスによって実行された、そのクエリ ― default-graph-uriパラメータ(http://www.other.example/books)の値で識別されるRDFデータセットに対する ― は、次のクエリ結果を返します。

HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:55:12 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
 <head>
   <variable name="book"/>
   <variable name="who"/>
 </head>
...
</sparql> 

3.1.3 CONSTRUCTとシンプルなRDFデータセットおよびHTTP内容交渉

次のSPARQLクエリ

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX myfoaf: <http://www.example/jose/foaf.rdf#>

CONSTRUCT { myfoaf:jose foaf:depiction <http://www.example/jose/jose.jpg>.
            myfoaf:jose foaf:schoolHomepage <http://www.edu.example/>.
            ?s ?p ?o.}
WHERE { ?s ?p ?o. myfoaf:jose foaf:nick "Jo".
       FILTER ( ! (?s = myfoaf:kendall && ?p = foaf:knows && ?o = myfoaf:edd ) 
              && ! ( ?s = myfoaf:julia && ?p = foaf:mbox && ?o = <mailto:julia@mail.example> )
	      && ! ( ?s = myfoaf:julia && ?p = rdf:type && ?o = foaf:Person))
}

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery&default-graph-uri=http%3A%2F%2Fwww.example%2Fjose-foaf.rdf HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1
Accept: text/turtle, application/rdf+xml

すると、次のレスポンスが得られます。

HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:55:11 GMT
Server: Apache/1.3.29 (Unix)
Connection: close
Content-Type: text/turtle

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix myfoaf: <http://www.example/jose/foaf.rdf#>.

myfoaf:jose foaf:name "Jose Jimenez";
	    foaf:depiction <http://www.example/jose/jose.jpg>;
            foaf:nick "Jo";
...

注意: このメディア・タイプtext/turtleの登録に着手しましたが、この仕様の公表時点では完了していません。Turtle言語の最終的に登録されたメディア・タイプに関しては、http://www.w3.org/TR/turtleを参照してください。

3.1.4 ASKとシンプルなRDFデータセット

次のSPARQLクエリ

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
ASK WHERE { ?book dc:creator "J.K. Rowling"}

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery&default-graph-uri=http%3A%2F%2Fwww.example%2Fbooks HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

すると、次のレスポンスが得られます。

HTTP/1.1 200 OK
Date: Fri, 06 May 2005 20:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
 <head></head>
 <boolean>true</boolean>
</sparql>

3.1.5 DESCRIBEとシンプルなRDFデータセット

次のSPARQLクエリ

PREFIX books: <http://www.example/book/>
DESCRIBE books:book6

は、次で示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery&default-graph-uri=http%3A%2F%2Fwww.example%2Fbooks HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

すると、次のレスポンスが得られます。

HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type:  application/rdf+xml

<?xml version="1.0"?>
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:books="http://www.example/book/"
    xmlns:dc="http://purl.org/dc/elements/1.1/" >
  <rdf:Description rdf:about="http://www.example/book/book6">
    <dc:title>Example Book #6 </dc:title>
  </rdf:Description>
</rdf:RDF>

3.1.6 SELECTと複合的なRDFデータセット

次のSPARQLクエリ

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT ?who ?g ?mbox
WHERE {  ?g dc:publisher ?who .
   GRAPH ?g { ?x foaf:mbox ?mbox }
}

は、次で示しているとおり(読みやすいように改行付きで)、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery&default-graph-uri=http%3A%2F%2Fwww.example%2Fpublishers
&default-graph-uri=http%3A%2F%2Fwww.example%2Fmorepublishers&named-graph-uri=http%3A%2F%2Fyour.example%2Ffoaf-alice
&named-graph-uri=http%3A%2F%2Fwww.example%2Ffoaf-bob&named-graph-uri=http%3A%2F%2Fwww.example%2Ffoaf-susan
&named-graph-uri=http%3A%2F%2Fthis.example%2Fjohn%2Ffoaf
Host: www.example
User-agent: sparql-client/0.1

すると、次のレスポンスが得られます。

HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type:  application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
  <head>
    <variable name="who"/>
    <variable name="g"/>
    <variable name="mbox"/>
  </head>
...
</sparql>

3.1.7 SELECTとクエリのみのRDFデータセット

次のSPARQLクエリ

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT ?who ?g ?mbox
FROM <http://www.example/publishers>
FROM NAMED <http://www.example/alice>
FROM NAMED <http://www.example/bob>
WHERE { ?g dc:publisher ?who .
        GRAPH ?g { ?x foaf:mbox ?mbox }
}

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

すると、次のレスポンスが得られます。

HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
...
</sparql>

3.1.8 SELECTと曖昧なRDFデータセット

次のSPARQLクエリ

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT ?who ?g ?mbox
FROM <http://www.example/publishers>
FROM NAMED <http://www.example/john>
FROM NAMED <http://www.example/susan>
WHERE { ?g dc:publisher ?who .
        GRAPH ?g { ?x foaf:mbox ?mbox }
}

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery&default-graph-uri=http%3A%2F%2Fwww.example%2Fmorepublishers
&named-graph-uri=http%3A%2F%2Fwww.example%2Fbob&named-graph-uri=http%3A%2F%2Fwww.example%2Falice HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

このプロトコル・オペレーションには曖昧なRDFデータセットが含まれています。クエリで指定されているデータセットは、プロトコルで指定されたもの(default-graph-urinamed-graph-uriのパラメータにより)とは異なります。適合SPARQLプロトコル・サービスは、プロトコルで指定されているRDFデータセットにクエリを実行することで、この曖昧さを解決しなければなりません。

HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
  <head>
    <variable name="who"/>
    <variable name="g"/>
    <variable name="mbox"/>
  </head>
  <results>
    <result>
      <binding name="who">
      	<literal>Bob Hacker</literal>
      </binding>
      <binding name="g">
	<uri>http://www.example/bob</uri>
      </binding>
      <binding name="mbox">
        <uri>mailto:bob@oldcorp.example</uri>
      </binding>
    </result>
    <result>
      <binding name="who">
	<literal>Alice Hacker</literal>
      </binding>
      <binding name="g">
	<uri>http://www.example/alice</uri>
      </binding>
      <binding name="mbox">
	<uri>mailto:alice@work.example</uri>
      </binding>
    </result>
  </results>
</sparql>

3.1.9 SELECTと不正なクエリのフォルト

次の構文的に不正なSPARQLクエリ

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name
ORDER BY ?name }

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery&default-graph-uri=http%3A%2F%2Fwww.example%2Fmorepublishers HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

すると、次のエラーのレスポンスが得られます。

HTTP/1.1 400 Bad Request
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: text/plain; charset=UTF-8

4:syntax error, unexpected ORDER, expecting '}'

3.1.10 SELECTとクエリ・リクエスト拒否のフォルト

次のSPARQLクエリ

PREFIX bio: <http://bio.example/schema/#>
SELECT ?valence
FROM <http://another.example/protein-db.rdf>
WHERE { ?x bio:protein ?valence }
ORDER BY ?valence

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=EncodedQuery&default-graph-uri=http%3A%2F%2Fanother.example%2Fprotein-db.rdf HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

すると、次のエラーのレスポンスが得られます。

HTTP/1.1 500 Internal Server Error
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: text/plain

SPARQL Processing Service: Query Request Refused

Your request could not be processed because http://another.example/protein-db.rdf
could not be retrieved within the time alloted.

3.1.11 POSTとURLエンコーディングを用いた長いSELECTクエリ

一部のSPARQLクエリ(恐らく、システムにより生成された)は、2.1.1 GETによるqueryで記述しているHTTP GETバインディングで確実に伝えることができる長さを超えているかもしれません。その場合は、2.1.2 URLエンコードされたパラメータを用いたPOSTによるqueryで記述しているPOSTバインディングを使用できます。次のSPARQLクエリ

PREFIX : <http://www.w3.org/2002/12/cal/icaltzd#>
PREFIX Chi: <http://www.w3.org/2002/12/cal/test/Chiefs.ics#>
PREFIX New: <http://www.w3.org/2002/12/cal/tzd/America/New_York#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?summary
WHERE {
    {
	Chi:D603E2AC-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-09-08T16:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:09:27Z"^^xsd:dateTime;
         :dtstart "2002-09-08T13:00:00"^^New:tz;
         :summary ?summary;
         :uid "D603E2AC-C1C9-11D6-9446-003065F198AC" .
   	}
	UNION
    {
	Chi:D603E90B-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-09-15T16:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:10:19Z"^^xsd:dateTime;
         :dtstart "2002-09-15T13:00:00"^^New:tz;
         :summary ?summary;
         :uid "D603E90B-C1C9-11D6-9446-003065F198AC" .
   	}
	UNION
    {
	Chi:D603ED6E-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-09-22T16:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:11:05Z"^^xsd:dateTime;
         :dtstart "2002-09-22T13:00:00"^^New:tz;
         :summary ?summary;
         :uid "D603ED6E-C1C9-11D6-9446-003065F198AC" .
   	}
	UNION
    {
	Chi:D603F18C-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-09-29T16:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:15:46Z"^^xsd:dateTime;
         :dtstart "2002-09-29T13:00:00"^^New:tz;
         :summary ?summary;
         :uid "D603F18C-C1C9-11D6-9446-003065F198AC" .
   	}
	UNION
    {
	Chi:D603F5B7-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-11-04"^^xsd:date;
         :dtstamp "2002-09-06T03:12:53Z"^^xsd:dateTime;
         :dtstart "2002-11-03"^^xsd:date;
         :summary ?summary;
         :uid "D603F5B7-C1C9-11D6-9446-003065F198AC" .
   	}
	UNION
    {
	Chi:D603F9D7-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-11-10T20:15:00"^^New:tz;
         :dtstamp "2002-09-06T03:14:12Z"^^xsd:dateTime;
         :dtstart "2002-11-10T17:15:00"^^New:tz;
         :summary ?summary;
         :uid "D603F9D7-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D604022C-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-11-17T17:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:14:51Z"^^xsd:dateTime;
         :dtstart "2002-11-17T14:00:00"^^New:tz;
         :summary ?summary;
         :uid "D604022C-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D604065C-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-10-06T19:05:00"^^New:tz;
         :dtstamp "2002-09-06T03:16:54Z"^^xsd:dateTime;
         :dtstart "2002-10-06T16:05:00"^^New:tz;
         :summary ?summary;
         :uid "D604065C-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6040A7E-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-10-13T19:15:00"^^New:tz;
         :dtstamp "2002-09-06T03:17:51Z"^^xsd:dateTime;
         :dtstart "2002-10-13T16:15:00"^^New:tz;
         :summary ?summary;
         :uid "D6040A7E-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6040E96-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-10-20T16:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:18:32Z"^^xsd:dateTime;
         :dtstart "2002-10-20T13:00:00"^^New:tz;
         :summary ?summary;
         :uid "D6040E96-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6041270-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-10-27T17:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:19:15Z"^^xsd:dateTime;
         :dtstart "2002-10-27T14:00:00"^^New:tz;
         :summary ?summary;
         :uid "D6041270-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6041673-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-11-24T20:05:00"^^New:tz;
         :dtstamp "2002-09-06T03:22:09Z"^^xsd:dateTime;
         :dtstart "2002-11-24T17:05:00"^^New:tz;
         :summary ?summary;
         :uid "D6041673-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6041A73-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-12-01T17:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:22:52Z"^^xsd:dateTime;
         :dtstart "2002-12-01T14:00:00"^^New:tz;
         :summary ?summary;
         :uid "D6041A73-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D60421EF-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-12-08T17:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:24:04Z"^^xsd:dateTime;
         :dtstart "2002-12-08T14:00:00"^^New:tz;
         :summary ?summary;
         :uid "D60421EF-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6042660-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-12-15T20:05:00"^^New:tz;
         :dtstamp "2002-09-06T03:25:03Z"^^xsd:dateTime;
         :dtstart "2002-12-15T17:05:00"^^New:tz;
         :summary ?summary;
         :uid "D6042660-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6042A93-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-12-22T17:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:25:47Z"^^xsd:dateTime;
         :dtstart "2002-12-22T14:00:00"^^New:tz;
         :summary ?summary;
         :uid "D6042A93-C1C9-11D6-9446-003065F198AC" .
    }
	UNION
    {
	Chi:D6042EDF-C1C9-11D6-9446-003065F198AC     a :Vevent;
         :dtend "2002-12-28T21:00:00"^^New:tz;
         :dtstamp "2002-09-06T03:26:51Z"^^xsd:dateTime;
         :dtstart "2002-12-28T18:00:00"^^New:tz;
         :summary ?summary;
         :uid "D6042EDF-C1C9-11D6-9446-003065F198AC" .
    }
}

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

POST /sparql/ HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 9461

query=EncodedQuery&default-graph-uri=http%3A%2F%2Fanother.example%2Fcalendar.rdf

すると、次のレスポンスが得られます。

HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3
Connection: close
Content-Type: application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
    <head>
        <variable name="summary"/>
    </head>
    <results>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Cleveland @ Cleveland Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Jacksonville @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. New England @ Gillette Stadium</literal>
            </binding>
        </result>
        ...
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Oakland @ Network Associates Coliseum</literal>
            </binding>
        </result>
    </results>
</sparql>

3.1.12 POSTを直接用いた長いSELECTクエリ

SPARQLクエリは、2.1.3 POSTによる直接的なqueryで記述しているように、URLエンコーディングなしに直接POSTすることもできます。前の例で用いた同じクエリは、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

POST /sparql/?default-graph-uri=http%3A%2F%2Fanother.example%2Fcalendar.rdf HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1
Content-Type: application/sparql-query

UnencodedQuery

すると、前の例と同じレスポンスが得られます。

3.1.13 SELECTと国際化

SPARQLクエリは、国際化した文字や文字集合を含むことができます。次のSPARQLクエリ

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX 食: <http://www.w3.org/2001/sw/DataAccess/tests/data/i18n/kanji.ttl#>
SELECT ?name ?food 
WHERE { [ foaf:name ?name ; 食:食べる ?food ] . }

は、次のHTTPトレースで示しているとおり、SPARQLクエリのサービス(http://www.example/sparql/)に伝えられます。

GET /sparql/?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0APREFIX%20%E9%A3%9F%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2Fsw%2FDataAccess%2Ftests%2Fdata%2Fi18n%2Fkanji.ttl%23%3E%0ASELECT%20%3Fname%20%3Ffood%20%0AWHERE%20%7B%20%5B%20foaf%3Aname%20%3Fname%20%3B%20%E9%A3%9F%3A%E9%A3%9F%E3%81%B9%E3%82%8B%20%3Ffood%20%5D%20.%20%7D
Host: www.example
User-agent: sparql-client/0.1
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix)
Connection: close
Content-Type: application/sparql-results+xml

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
...
</sparql>

3.2 SPARQL更新の例

3.2.1 URLエンコードされたパラメータを用いたUPDATE

次のリクエストの例は、INSERT DATA { <a> <p> <b> }というクエリに対してhttp://localhost:8888/testに送られたリクエストのシリアル化で、URLエンコードされたパラメータ形式を用いると、下に示しているようになります。

POST /test HTTP/1.1
Host: localhost:8888
Accept: text/plain
Content-Length: 62
Content-Type: application/x-www-form-urlencoded

update=INSERT%20DATA%20%7B%20%3Ca%3E%20%3Cp%3E%20%3Cb%3E%20%7D

3.2.2 POSTを直接用いたUPDATE

更新リクエストは、application/sparql-updateというコンテンツ・タイプを持つPOSTリクエストとして送ることができます。

POST /test HTTP/1.1
Host: localhost:8888
Accept: */*
Content-Type: application/sparql-update
Content-Length: 27

INSERT DATA { <a> <p> <b> }

3.2.3 データセットを指定し、POSTを直接用いたUPDATE

更新リクエストに対するデータセットは、using-graph-uriusing-named-graph-uriのパラメータを用いて指定できます。以下に、http://localhost:8888/testに送られたリクエストの例のシリアル化と、デフォルト・グラフhttp://localhost:8888/peopleを持つデータセットの指定を示します。

POST /test?using-graph-uri=http%3A%2F%2Flocalhost%3A8888%2Fpeople HTTP/1.1
Host: localhost:8888
Accept: */*
Content-Type: application/sparql-update
Content-Length: 136

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
DELETE { ?person ?property ?value }
WHERE { ?person ?property ?value ; foaf:givenName 'Fred' }

3.2.4 URLエンコードされたパラメータを用いた多重オペレーションUPDATE

多重オペレーションのシーケンスは、「;」(セミコロン)で区切って、1つのリクエストに含むことができます。クエリに対してhttp://localhost:8888/testに送られたリクエストの例のシリアル化である

DELETE DATA { <a> <p> <old> } ;
INSERT DATA { <a> <p> <new> }

は、URLエンコードされたパラメータ形式を用いると、下に示しているようになります。

POST /test HTTP/1.1
Host: localhost:8888
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: 130

update=DELETE%20DATA%20%7B%20%3Ca%3E%20%3Cp%3E%20%3Cold%3E%20%7D%20%3B%0AINSERT%20DATA%20%7B%20%3Ca%3E%20%3Cp%3E%20%3Cnew%3E%20%7D

3.2.5 データセットを指定し、URLエンコードされたパラメータを用いた多重オペレーションUPDATE

URLエンコードされたパラメータを持つ更新リクエストをPOSTする場合、using-graph-uriusing-named-graph-uriのデータセット・パラメータは、シリアル化されたリクエストを持つPOSTの本文で指定されます。以下に、クエリに対してhttp://localhost:8888/testに送られた、リクエストの例のシリアル化である

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
INSERT { GRAPH <http://localhost:8888/people> { ?person ?property ?value } }
WHERE { GRAPH ?g { ?person ?property ?value ; foaf:givenName 'Fred' } }

と、http://localhost:8888/alice/foaf.rdfとhttp://localhost:8888/eve/foaf.rdfの名前付きグラフを持つデータセットの指定を示します。

POST /test HTTP/1.1
Host: localhost:8888
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: 130

using-named-graph-uri=http%3A%2F%2Flocalhost%3A8888%2Falice%2Ffoaf.rdf&using-named-graph-uri=http%3A%2F%2Flocalhost%3A8888%2Feve%2Ffoaf.rdf&update=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0AINSERT%20%7B%20GRAPH%20%3Chttp%3A%2F%2Flocalhost%3A8888%2Fpeople%3E%20%7B%20%3Fperson%20%3Fproperty%20%3Fvalue%20%7D%20%7D%0AWHERE%20%7B%20GRAPH%20%3Fg%20%7B%20%3Fperson%20%3Fproperty%20%3Fvalue%20%3B%20foaf%3AgivenName%20%27Fred%27%20%7D%20%7D

3.2.6 データセットを指定し、POSTを直接用いた多重オペレーションUPDATE

以下に、http://localhost:8888/testに送られた、リクエストの例のシリアル化と、http://localhost:8888/alice/foaf.rdfhttp://localhost:8888/eve/foaf.rdfの名前付きグラフを持つデータセットの指定を示します。

POST /test?using-named-graph-uri=http%3A%2F%2Flocalhost%3A8888%2Falice%2Ffoaf.rdf&using-named-graph-uri=http%3A%2F%2Flocalhost%3A8888%2Feve%2Ffoaf.rdf HTTP/1.1
Host: localhost:8888
Accept: */*
Content-Type: application/sparql-update
Content-Length: 190

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
INSERT { GRAPH <http://localhost:8888/people> { ?person ?property ?value } }
WHERE { GRAPH ?g { ?person ?property ?value ; foaf:givenName 'Fred' } }

4 方針に関する考察

4.1 セキュリティ

SPARQLプロトコル・サービスに対するDoS攻撃(denial-of-service attack)の原因となる可能性が少なくとも2つありえます。まず最初に、制約が不足しているクエリは、非常に多くの結果をもたらす可能性があり、これらを、処理したり、まとめたり、返したりするために大きなコンピュータ資源の消費を必要とするかもしれません。別のありえる原因は、非常に複雑な――情報源の大きさ、検索すべき資源の数、または、サイズと数の組み合わせのいずれかのせいで――RDFデータセット記述を含むクエリで、サービスは、帯域幅、CPU、または補助記憶装置を含む資源の大きな消費なしには、その記述をまとめられないかもしれません。そのような消費が、事実上、DoS攻撃を引き起こす場合もありえます。SPARQLプロトコル・サービスは、検索する資源、または、外部資源を検索する割合に制限を課すことができます(may)。SPARQLクエリ処理サービスには、他にもDoS攻撃の原因があるかもしれません。

SPARQLプロトコル・サービスは、クライアントの代わりに他の元サーバにHTTPリクエストを行えるため、他のサイトやサービスに対する攻撃の進路として使用されるかもしれません。したがって、SPARQLプロトコル・サービスが、事実上、サードパーティ・クライアントのプロキシとして動作することがありえます。このようなサービスは、検索する資源、または、外部資源を検索できる割合に制限を課すことができます(may)。SPARQLプロトコル・サービスは、サードパーティの元サーバやサービスに関するクライアントのリクエストのトレースを容易にするような方法で、そのログを取ることができます(may)。

SPARQLプロトコル・サービスは、これらや他の費用のかかる(そうでなければ危険な)クエリを検出するか、時間またはメモリの限度をクエリに課すか、DoS攻撃に対する当該サービスの(また、他のサービスの)脆弱性を減少させるために他の制限を課すかを選択できます(may)。これらは、このようなクエリ・リクエストの処理を拒否することもできます(may)。

SPARQLプロトコル・サービスは、更新オペレーションにより、基礎となるデータを削除、挿入、変更できます。悪意があったり破壊的であるような更新を防ぐために、実装は、更新オペレーションを実行しないことも選択できます。あるいは、実装は、更新オペレーションが許可なく呼び出されること防ぐために、HTTP認証メカニズムやその他の実装で定義されているメカニズムの使用を選択することができます。

異なるIRIが同じ外観を持っているかもしれません。異なるスクリプトの文字が、同じに見えるかもしれません(キリル文字の「о」はラテン文字の「o」と同じに見えるかもしれません)。結合文字が後続する文字は、別の文字と同じ視覚表現を持っているかもしれません(結合アキュート・アクセントが後続するラテン小文字Eは、アキュート付きラテン小文字Eと同じ視覚的表現を持っています)。SPARQLのユーザは、注意してデータ中のIRIにマッチするIRIを持つクエリを構築しなければなりません。類似している文字のマッチングに関する詳細は、Unicodeセキュリティに関する考察 [UNISEC]およびIRI(Internationalized Resource Identifiers) [RFC3987]の8項にあります。

5 適合性

SPARQL 1.1プロトコル(このドキュメント)の各部のステータスは次のとおりです。

適合SPARQLプロトコル・サービスは、

  1. このドキュメント(SPARQL 1.1プロトコル)で述べた方法で、queryオペレーションまたはupdateオペレーションのいずれかを実装しなければなりません(must)。
  2. queryupdateの両方のオペレーションを実装できます。
  3. 4 方針に関する考察で述べている規範的な制約([RFC2119]キーワードで示されている)と整合性がなければなりません(must)。

6 前勧告以後の変更(参考情報)

この仕様は、2008年1月のRDF用SPARQLプロトコルを拡張、更新したものです。重要な変更点は次のとおりです。

A 参考文献

A.1 規範的な参考文献

[SPARQL]
SPARQL 1.1 Query Language, S. Harris, A. Seaborne, Editors, W3C Recommendation, 21 March 2013, http://www.w3.org/TR/2013/REC-sparql11-query-20130321. Latest version available at http://www.w3.org/TR/sparql11-query.
[UPDATE]
SPARQL 1.1 Update, P. Gearon, A. Passant, A. Polleres, Editors, W3C Recommendation, 21 March 2013, http://www.w3.org/TR/2013/REC-sparql11-update-20130321. Latest version available at http://www.w3.org/TR/sparql11-update.
[RDF-CONCEPTS]
Resource Description Framework (RDF): Concepts and Abstract Syntax, Graham Klyne, Jeremy J. Carroll, Editors, W3C (World Wide Web Consortium), 2004, http://www.w3.org/TR/rdf-concepts/ .
[RDF-XML]
RDF/XML Syntax Specification (Revised), Dave Beckett, Editor, W3C (World Wide Web Consortium), 2004, http://www.w3.org/TR/rdf-syntax-grammar/ .
[RFC2119]
RFC 2119: Key words for use in RFCs to Indicate Requirement Levels, Scott Bradner, Editor, IETF (Internet Engineering Task Force), 1997, http://www.ietf.org/rfc/rfc2119.txt .
[RFC2616]
RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1, R. Fielding, et al., Editors, IETF (Internet Engineering Task Force), 1999, http://www.ietf.org/rfc/rfc2616.txt .
[RFC3986]
RFC 3986: Uniform Resource Identifier (URI): Generic Syntax, T. Berners-Lee, R. Fielding, L. Masinter, Editors, IETF (Internet Engineering Task Force), 2005, http://www.ietf.org/rfc/rfc3986.txt .

A.2 その他の参考文献

[RFC3987]
RFC 3987: Internationalized Resource Identifiers (IRIs), M. Duerst, M. Suignard, Editors, IETF (Internet Engineering Task Force), 2005, http://www.ietf.org/rfc/rfc3987.txt .
[UNISEC]
Unicode Security Considerations, Mark Davis, Michel Suignard, Editors, 2010, http://www.unicode.org/reports/tr36/

更新履歴

勧告案以後の更新履歴

勧告候補以後の更新履歴

最終呼びかけ以後の更新履歴