CyberLibrarian

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

First Update: 2008年3月28日 | セマンティック・ウェブ関連用語集


W3C

RDF用SPARQLプロトコル

W3C勧告 2008年1月15日

本バージョン:
http://www.w3.org/TR/2008/REC-rdf-sparql-protocol-20080115/
最新バージョン:
http://www.w3.org/TR/rdf-sparql-protocol/
旧バージョン:
http://www.w3.org/TR/2007/PR-rdf-sparql-protocol-20071112/
編集者:
Kendall Grant Clark, <kendall@monkeyfist.com>, Clark & Parsia LLC
Lee Feigenbaum, <lee@thefigtrees.net>, Invited Expert
Elias Torres, <eliast@us.ibm.com>, IBM Corporation

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

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


要約

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

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

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

これは、W3C勧告です。

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

このドキュメントに関するコメントは、公開アーカイブ付きのメーリングリスト、public-rdf-dawg-comments@w3.orgにお送りください。拡張や機能を含むこの仕様とは関連のないSPARQLに関する質問とコメントは、メーリングリストpublic-sparql-dev@w3.org公開アーカイブ)で議論できます。

このドキュメントは、RDFデータ・アクセス・ワーキンググループが作成したもので、W3Cセマンティック・ウェブ・アクティビティの一部です。このドキュメントの草案としての最初の公開は2005年1月14日で、ワーキンググループは、それ以後に受け取った多くのコメント課題に取り組んで来ました。2007年11月の勧告案以後、1つの編集上の更新がありました。

ワーキンググループのSPARQLプロトコル実装報告書は、2006年4月の勧告候補で設定された相互運用可能な実装という目標が達成されたことを示しています。

データ・アクセス・ワーキンググループは、集約関数、および更新言語を含む12の課題を先送りしました。

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


目次

1. はじめに

このドキュメント(「RDF用SPARQLプロトコル」と自らを称する)では、SPARQLクエリをクエリ・クライアントからクエリ・プロセッサに伝える手段であるSPARQLプロトコルについて記述しています。SPARQLプロトコルは、RDF用クエリ言語SPARQL [SPARQL]と互換性があるように設計してあります。SPARQLプロトコルを次の2つの方法で説明します。まず、具体的な実現、実装、あるいは、別のプロトコルへのバインディングの如何にかかわらず、抽象的なインタフェースとして、2番目に、このインタフェースのHTTPおよびSOAPのバインディングとしてです。このドキュメントは、関連するWSDLおよびW3C XMLスキーマ・ドキュメントと同様に、SPARQLクエリのサービスとクライアントの実装に興味を持っているソフトウェア開発者を主として対象としています。

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

このドキュメントに、WSDLやXMLスキーマのインスタンスを含む、他のドキュメントからの抜粋が含まれているときは、次の名前空間接頭辞と名前空間URIを使用しています。

接頭辞 名前空間URI
st http://www.w3.org/2005/09/sparql-protocol-types/#
xs http://www.w3.org/2001/XMLSchema
vbr http://www.w3.org/2005/sparql-results#
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
whttp http://www.w3.org/2006/01/wsdl/http
wsoap http://www.w3.org/2006/01/wsdl/soap
soap http://www.w3.org/2003/05/soap-envelope
wsdlx http://www.w3.org/2005/08/wsdl-extensions
tns http://www.w3.org/2005/08/sparql-protocol-query/#

2. SPARQLプロトコル

このドキュメントには、次のSPARQLプロトコルの仕様が包含されています。

RDF用SPARQLプロトコル
人間が読める言語によるSPARQLプロトコルを規範的に定義した現行ドキュメント。
SPARQLプロトコルWSDL2.0記述
WSDL2.0を用いたSPARQLプロトコルの規範的な記述。
SPARQLプロトコル型
SPARQLプロトコルで用いられる型を規範的に定義したXMLスキーマ・ドキュメント。

SPARQLプロトコルにはSparqlQueryという1つのインタフェースが含まれ、これには同様にqueryという1つのオペレーションが含まれています。SPARQLプロトコルは、インタフェース、型、フォルト、および、オペレーションを実装するウェブ・サービスに関しWSDL 2.0 [WSDL2]で、また、HTTPおよびSOAPバインディングによっても抽象的に記述されます。このドキュメントはSPARQLプロトコルを記述するためにWSDL2.0を使用しますが、WSDLライブラリまたはプログラミング言語フレームワークの使用を含む、特定の実装戦略を実装の一部に使用する義務はないことに注意してください。

2.1 SparqlQueryインターフェース

2.1.1 queryオペレーション

SparqlQueryは、プロトコルの唯一のインタフェースです。これにはqueryという1つのオペレーションが含まれ、SPARQLクエリ文字列および、オプションとしてRDFデータセット記述を伝えるために用いられます。

queryオペレーションは、IN-OUTメッセージ交換パターン [WSDL-Adjuncts]として記述されます。IN-OUTメッセージ交換パターンの制約は、次の通りです。

このパターンは、次のとおり、きっかり(この順序どおりの)2つのメッセージで構成されています。

  1. メッセージ:

    • {メッセージ・ラベル}が「IN」であり、{方向性}が「IN」であるインターフェース・メッセージ参照構成要素で示される

    • あるノードNから受信される

  2. メッセージ:

    • {メッセージ・ラベル}が「OUT」であり、{方向性}が「OUT」であるインターフェース・メッセージ参照構成要素で示される

    • ノードNに送信される

このパターンは、2.2.1 フォルトによるメッセージの置換規則を使用します。

このインタフェースとそのオペレーションは、次の(関連する名前空間宣言を含むprotocol-query.wsdlの)WSDL 2.0の一部で記述されます。

<!-- Abstract SparqlQuery Interface -->
<interface name="SparqlQuery" styleDefault="http://www.w3.org/2006/01/wsdl/style/iri">

   <!-- the Interface Faults -->
   <fault name="MalformedQuery" element="st:malformed-query"/>
   <fault name="QueryRequestRefused" element="st:query-request-refused"/>

   <!-- the Interface Operation -->
   <operation name="query" pattern="http://www.w3.org/2006/01/wsdl/in-out">

      <documentation>The operation is used to convey queries and their results from clients to services and back
      again.</documentation>

      <input messageLabel="In" element="st:query-request"/>
      <output messageLabel="Out" element="st:query-result"/>

      <!-- the interface faults are out faults -->
      <outfault ref="tns:MalformedQuery" messageLabel="Out"/>
      <outfault ref="tns:QueryRequestRefused" messageLabel="Out"/>
   </operation>

</interface>

抜粋1.0 WSDL 2.0の一部

2.1.2 query Inメッセージ

抽象的に、SparqlQueryのクエリ・オペレーションのInメッセージのコンテンツは、XMLスキーマ複合型(complex type)のインスタンスで、抜粋1.0ではst:query-requestと呼び、さらに、1つのSPARQLクエリ文字列と、0か1つのRDFデータセット記述の、2つの部分で構成されています。1つのqueryの型によって識別されるSPARQLクエリ文字列は、「クエリの生成規則で始まる、SPARQL文法によって定義された言語の文字列」と[SPARQL]で定義されています。RDFデータセット記述は、0か1つのデフォルトRDFグラフで構成され、——0以上のdefault-graph-uriの型によって識別されたRDFグラフのRDFマージで構成される——0以上の名前付きRDFグラフによって、0以上のnamed-graph-uriの型によって識別されます。これらは、[SPARQL]のFROMFROM NAMEDキーワードにそれぞれ対応しています。

これらの型は、protocol-types.xsdの、次のXMLスキーマの一部で定義されています。

<xs:element name="query-request">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="query" type="xs:string">
       <xs:annotation>
	      <xs:documentation>query is an xs:string constrained by the language definition,
         http://www.w3.org/TR/rdf-sparql-query/#grammar, as "a sequence of characters in 
         the language defined by the [SPARQL] grammar, starting with the Query production".</xs:documentation>
       </xs:annotation>
      </xs:element>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="default-graph-uri" type="xs:anyURI"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="named-graph-uri" type="xs:anyURI"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

抜粋1.1 XMLスキーマの一部

RDFデータセットの指定

RDFデータセットは、FROMおよびFROM NAMEDのキーワードを用いて[SPARQL]クエリで指定するか、このドキュメントで記述しているプロトコルで指定するか、クエリ文字列とプロトコルの両方で指定することができます。

曖昧なRDFデータセットの解決

クエリとプロトコルの両方が、RDFデータセット(しかし、同一のRDFデータセットではない)を指定する場合、プロトコルで指定されたデータセットは、SparqlQueryqueryオペレーションで使用されたRDFデータセットでなければなりません(must)。

RDFデータセットに対するクエリ・リクエストの拒否

適合SPARQLプロトコル・サービスは、プロトコルやクエリ・リクエストで指定されたRDFデータセットが存在しない場合にSPARQLクエリ・リクエストが実行される、デフォルトRDFデータセットを提供できます(may)。適合SPARQLプロトコル・サービスは、RDFデータセットを指定しない任意のクエリ・リクエストの処理を拒否できます(may)。最後に、適合SPARQLプロトコル・サービスは、任意の指定されたRDFデータセットに対する任意のクエリ・リクエストの処理を拒否できます(may)。2.1.4項のqueryフォルト・メッセージ、QueryRequestRefusedを参照してください。

基底IRIの決定

クエリ文字列のBASEキーワードは、URI(Uniform Resource Identifier): 一般的構文 [RFC3986]の5.1.1項「コンテンツ内に埋め込まれた基底URI」にあるとおり、相対IRIを解決するために用いられる基底IRIを定めます。5.1.2項「要約実体からの基地のURI」は、xml:base指示子を持つSOAPエンベロープのようなカプセル化されたドキュメントから、どのように基底IRIを持ってくることができるかを定めています。SPARQLプロトコルはクエリURIを逆参照しないため、5.1.3項は当てはまりません。最後に、5.1.4項のとおり、SPARQLプロトコル・サービスは、自身の基底URIを定めなければならず、それはサービス呼び出しURLになりえます(may)。

2.1.3 query Outメッセージ

抽象的に、SparqlQueryqueryオペレーションのOutメッセージの内容は、XMLスキーマ複合型のインスタンスで、抜粋1.2ではquery-resultと呼び、次のいずれかで構成されています。

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

query-resultの型は、protocol-types.xsdの、次のW3C XMLスキーマの一部で定義されています。

<xs:element name="query-result">
      <xs:annotation>
          <xs:documentation>The type for serializing query results,
          either as XML or RDF/XML.</xs:documentation>
      </xs:annotation>
      <xs:complexType>
          <xs:choice>
              <xs:element maxOccurs="1" ref="vbr:sparql"/>
              <xs:element maxOccurs="1" ref="rdf:RDF"/>
          </xs:choice>
      </xs:complexType>
</xs:element>

抜粋1.2 XMLスキーマの一部

2.1.4 queryフォルト・メッセージ

[WSDL2-Adjuncts]では、どのようにオペレーションがフォルトを発生させ、メッセージが交信し合うのかを指定するいくつかのフォルト伝搬規則を定義しています。queryオペレーションは、フォルトによるメッセージの置換規則を採用します。

パターンの最初のメッセージの後のものはどれも、フォルト・メッセージに置き換えることができ(may)、それは同一の方向性を持たなければなりません(must)。フォルト・メッセージは、拡張やバインディング拡張で別に指定されない限り、それが置き換えるメッセージと同じ対象ノードに送られなければなりません(must)。このノードへの経路がない場合には、フォルトを廃棄しなければなりません(must)。

したがって、SparqlQueryインタフェースに含まれるqueryオペレーションは、Outメッセージの代わりに、MalformedQueryメッセージまたはQueryRequestRefusedメッセージのどちらかを返すかもしれず、これらは両方ともprotocol-types.xsdの次のXMLスキーマの一部で定義されます。

<xs:element type="xs:string" name="fault-details">
    <xs:annotation>
      <xs:documentation> This element contains human-readable information about the fault
        returned by the SPARQL query processing service.</xs:documentation>
    </xs:annotation>
  </xs:element>
    <xs:element name="malformed-query">
      <xs:complexType>
          <xs:all><xs:element minOccurs="0" maxOccurs="1" ref="st:fault-details"/></xs:all>
      </xs:complexType>
  </xs:element>
  <xs:element name="query-request-refused">
      <xs:complexType>
          <xs:all><xs:element minOccurs="0" maxOccurs="1" ref="st:fault-details"/></xs:all>
      </xs:complexType>
</xs:element>

抜粋1.3 XMLスキーマの一部

MalformedQuery

SPARQL文法で定められている言語において、queryの型の値が正当な文字列でなければ、MalformedQueryまたはQueryRequestRefusedのフォルト・メッセージを返さなければなりません(must)。フォルトによるメッセージの置換に従って、MalformedQueryを含むWSDLのフォルトが返される場合は、Outメッセージを返してはなりません(must not)。

MalformedQueryのフォルト・メッセージが返されるときには、クエリ処理サービスは、説明、デバッグ作業、または、抜粋1.3で定義しているfault-detailsの型による人間の利用のための他の追加情報説明を含まなければなりません(must)。

QueryRequestRefused

サービスが処理を拒否するリクエストをクライアントが出したときには、このWSDLフォルト・メッセージを返すべき(should)です。QueryRequestRefusedのフォルト・メッセージは、サーバが、その後の同じリクエスト(複数のリクエストも可)を処理できるか否かを示しませんし、適合SPARQLサービスは、[HTTP]のセマンティクスを与えられた場合に、必要に応じて他のHTTPステータス・コードまたはHTTPヘッダを返さないように制約したりもしません。

QueryRequestRefusedのフォルト・メッセージが返されたときには、クエリ処理サービスは、説明、デバッグ作業、または、抜粋1.3で定義しているfault-detailsの型による人間の利用を対象とした他の追加情報を含まなければなりません(must)。

2.2 HTTPバインディング

これまで記述してきたSparqlQueryインタフェース・オペレーションqueryは、抽象的なオペレーションで、呼び出し可能なオペレーションになるためには、プロトコル・バインディングが必要です。このドキュメントの次の2つの項では、HTTPとSOAPのバインディングについて説明します。適合SPARQLプロトコル・サービスは、SparqlQueryインタフェースをサポートしなければならず(must)、SPARQLプロトコル・サービスがHTTPバインディングをサポートしている場合、それはprotocol-query.wsdlで記述されているようにバインディングをサポートしなければなりません(must)。SPARQLプロトコル・サービスは、他のインタフェースをサポートすることができます(may)。詳しい情報は、2.3項 SOAPバインディングを参照してください。

[WSDL2-Adjuncts]では、抽象的なインタフェース・オペレーションをHTTPにバインディングする手段を定義しています。queryオペレーション(protocol-query.wsdlの)に対するHTTPバインディングは次の通りです。

<!-- the HTTP GET binding for query operation -->
 <binding name="queryHttpGet" interface="tns:SparqlQuery" 
	    type="http://www.w3.org/2006/01/wsdl/http"
	    whttp:version="1.1">

   <fault ref="tns:MalformedQuery" whttp:code="400"/>
   <fault ref="tns:QueryRequestRefused" whttp:code="500"/>

   <operation ref="tns:query"
        wsdlx:safe="true"
		whttp:method="GET"
		whttp:faultSerialization="*/*"
		whttp:inputSerialization="application/x-www-form-urlencoded"
		whttp:outputSerialization="application/sparql-results+xml, application/rdf+xml, */*" />
 </binding>

 <!-- the HTTP POST binding for query operation -->
 <binding name="queryHttpPost" interface="tns:SparqlQuery"
		 type="http://www.w3.org/2006/01/wsdl/http"
		 whttp:version="1.1">
		
	  <fault ref="tns:MalformedQuery" whttp:code="400"/>
	  <fault ref="tns:QueryRequestRefused" whttp:code="500"/>
		
   <operation ref="tns:query" 
        wsdlx:safe="true"
 		whttp:method="POST" 
		whttp:faultSerialization="*/*"
		whttp:inputSerialization="application/x-www-form-urlencoded, application/xml"
		whttp:outputSerialization="application/sparql-results+xml, application/rdf+xml, */*" />	
 </binding>

2つのHTTPバインディング、queryHttpGetqueryHttpPostがあり、両方ともSparqlQueryインタフェースのバインディングとして記述されます。これらの各バインディングでは、SparqlQueryインタフェースで記述されているMalformedQueryQueryRequestRefusedの2つのフォルトは、それぞれHTTPステータス・コード400 Bad Request500 Internal Server Errorにバインドされています [HTTP]。

URLでコード化されたクエリが実際的な限界を超える場合を除いて、queryHttpGetバインディングを用いるべきで(should)、この限界を超える場合にはqueryHttpPostバインディングを用いるべきです(should)。

シリアル化制約に関する参考情報としての注。queryHttpGetおよびqueryHttpPostバインディングの出力のシリアル化は、様々なタイプのRDFグラフのシリアル化を反映するために意図的に制約不足になっています。queryHttpGetおよびqueryHttpPostのフォルトのシリアル化も、意図的に制約不足になっています。適合SPARQLプロトコル・サービスは、別のWSDLのインタフェースとバインディングに異なる制約を提供できます。

queryHttpGet

queryオペレーションのこのバインディングは、[HTTP]のGETを、次のシリアル化タイプの制約で用います。whttp:faultSerializationの値は、*/*です。2番目に、whttp:inputSerializationの値は、UTF-8でエンコーディングしたapplication/x-www-form-urlencodedです。そして、3番目に、whttp:outputSerializationは、UTF-8でエンコーディングしたapplication/sparql-results+xml、UTF-8でエンコーディングしたapplication/rdf+xml、および、*/*です。

queryHttpPost

queryオペレーションのこのバインディングは、[HTTP]のPOSTを、次のシリアル化タイプの制約で用います。whttp:faultSerializationの値は、*/*です。2番目に、whttp:inputSerializationの値は、UTF-8でエンコーディングしたapplication/x-www-form-urlencoded、および、UTF-8でエンコーディングしたapplication/xmlです。そして、3番目に、whttp:outputSerializationは、UTF-8でエンコーディングしたapplication/sparql-results+xml、UTF-8でエンコーディングしたapplication/rdf+xml、および、*/*です。

2.2.1 HTTPの例

下記の抽象的なHTTPトレースの例では、いくつかの異なるシナリオの下でqueryオペレーションの呼び出しについて説明します。これらのトレースの例は、完全なHTTPトレースから次の3つの方法で抽出しています。(1)各例では、文字列「EncodedQuery」は、各例の最初のブロックで示したSPARQLクエリをURLエンコードした文字列同等を表します。(2)クエリ結果を含む、レスポンス本文の部分のみを表示しています。(3)default-graph-urinamed-graph-uriのURI値もURLエンコードされていません。

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

次のSPARQLクエリ

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

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

GET /sparql/?query=EncodedQuery 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 distinct="false" ordered="false">
   <result>
     <binding name="book"><uri>http://www.example/book/book5</uri></binding>
     <binding name="who"><bnode>r29392923r2922</bnode></binding>
   </result>
...
   <result>
     <binding name="book"><uri>http://www.example/book/book6</uri></binding>
     <binding name="who"><bnode>r8484882r49593</bnode></binding>
   </result>
 </results>
</sparql> 
2.2.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=EncodedQuery&default-graph-uri=http://www.other.example/books 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>
...
 <results distinct="false" ordered="false">
   <result>
     <binding name="book"><uri>http://www.example/book/book2</uri></binding>
     <binding name="who"><bnode>r1115396427r1133</bnode></binding>
   </result>
   <result>
     <binding name="book"><uri>http://www.example/book/book3</uri></binding>
     <binding name="who"><bnode>r1115396427r1133</bnode></binding>
   </result>
   <result>
     <binding name="book"><uri>http://www.example/book/book1</uri></binding>
     <binding name="who"><literal>J.K. Rowling</literal></binding>
   </result>
 </results>
</sparql> 
2.2.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://www.example/jose-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 Jimeñez";
	    foaf:depiction <http://www.example/jose/jose.jpg>;
            foaf:nick "Jo";
...
	    foaf:schoolHomepage <http://www.edu.example/>;
            foaf:workplaceHomepage <http://www.corp.example/>;
            foaf:homepage <http://www.example/jose/>;
            foaf:knows myfoaf:juan;
	    rdf:type foaf:Person.

myfoaf:juan foaf:mbox <mailto:juan@mail.example>;
	   rdf:type foaf:Person.

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

2.2.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://www.example/books 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>
2.2.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://www.example/books 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>
2.2.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://www.example/publishers
&default-graph-uri=http://www.example/morepublishers&named-graph-uri=http://your.example/foaf-alice
&named-graph-uri=http://www.example/foaf-bob&named-graph-uri=http://www.example/foaf-susan
&named-graph-uri=http://this.example/john/foaf
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>
...
  <results ordered="false" distinct="false">
    <result>
      <binding name="who">
        <literal>Alice</literal>
      </binding>
      <binding name="g">
        <uri>http://your.example/foaf-alice</uri>
      </binding>
      <binding name="mbox">
        <uri>mailto:alice@example.org</uri>
      </binding>
    </result>
    <result>
      <binding name="who">
        <literal>Bob</literal>
      </binding>
      <binding name="g">
        <uri>http://www.example/foaf-bob</uri>
      </binding>
      <binding name="mbox">
        <uri>mailto:bob@work.example</uri>      </binding>
    </result>
    <result>
      <binding name="who">
        <literal>Susan</literal>
      </binding>
      <binding name="g">
        <uri>http://www.example/foaf-susan</uri>
      </binding>
      <binding name="mbox">
        <uri>mailto:susan@work.example</uri>
      </binding>
    </result>
    <result>
      <binding name="who">
        <literal>John</literal>
      </binding>
      <binding name="g">
        <uri>http://this.example/john/foaf</uri>
      </binding>
      <binding name="mbox">
        <uri>mailto:john@home.example</uri>
      </binding>
    </result>
  </results>
</sparql>
2.2.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#">
...
  <head>
    <variable name="who"/>
    <variable name="g"/>
    <variable name="mbox"/>
  </head>
  <results ordered="false" distinct="false">
    <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>
2.2.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://www.example/morepublishers
&named-graph-uri=http://www.example/bob&named-graph-uri=http://www.example/alice 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 ordered="false" distinct="false">
    <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>
2.2.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://www.example/morepublishers HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

ここで示すレスポンス——2.1 SparqlQueryにあるとおり、Outメッセージを置き換えるMalformedQueryフォルト——を伴います。

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 '}'
2.2.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://another.example/protein-db.rdf HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

ここで示すレスポンス——2.1 SparqlQueryにあるとおり、Outメッセージを置き換える、QueryRequestRefusedフォルト——を伴います。

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/html; charset=UTF-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>SPARQL Processing Service: Query Request Refused</title>
</head>
<body>
<p> Query Request Refused: your request could not be processed because 
 <code>http://another.example/protein-db.rdf</code> could not be retrieved within 
 the time alloted.</p>
</body>
</html>
2.2.1.11 POSTバインディングを用いた非常に長いSELECTクエリ

一部のSPARQLクエリ(恐らく、システムにより生成された)は、2.2 HTTPバインディングで記述しているHTTP GETバインディングで確実に伝えることができる長さを超えているかもしれません。この場合は、2.2項で記述している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 XML: <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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML:date;
         :dtstamp "2002-09-06T03:12:53Z"^^XML:dateTime;
         :dtstart "2002-11-03"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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"^^XML: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://another.example/calendar.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 ordered="false" distinct="false">
        <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. Miami @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>BYE</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. San Francisco @ 49ers Stadium at Candlestick Point</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Buffalo @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. NY Jets @ Giants Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. San Diego @ Qualcomm Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Denver @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Oakland @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Seattle @ Seahawks Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Arizona @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. St. Louis @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Denver @ INVESCO Field at Mile High</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. San Diego @ Arrowhead Stadium</literal>
            </binding>
        </result>
        <result>
            <binding name="summary">
                <literal>Chiefs vs. Oakland @ Network Associates Coliseum</literal>
            </binding>
        </result>
    </results>
</sparql>
2.2.1.12 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=EncodedQuery
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>
2.2.1.13 SELECTとqueryHttpPostバインディングおよびXML入力

将来のバージョンでは、SPARQLクエリはXMLとしてシリアル化され、HTTP POSTによってSPARQLクエリのサービスに伝えられる可能性があります。次のSPARQLクエリ

<?xml version="1.0"?>
<rdf-query xmlns="http://example.org/SparqlX/">
 <select><variable name="book"/><variable name="who"/></select>
 <query-pattern>
	<triple-pattern>
		<subject><variable name="book"/></subject>
		<predicate><uri>http://purl.org/dc/elements/1.1/creator</uri></predicate>
		<object><variable name="who"/></object>
	</triple-pattern>
 </query-pattern>
</rdf-query>

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

POST /sparql/ HTTP/1.1
Host: www.example
User-agent: my-sparql-client/0.1
Content-type: application/xml

<?xml version="1.0"?>
<rdf-query xmlns="http://example.org/SparqlX/">
<select><variable name="book"/><variable name="who"/></select>
<query-pattern>
<triple-pattern>
	<subject><variable name="book"/></subject>
	<predicate><uri>http://purl.org/dc/elements/1.1/creator</uri></predicate>
	<object><variable name="who"/></object>
</triple-pattern>
</query-pattern>
</rdf-query>

サービスから提供された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 distinct="false" ordered="false">
   <result>
     <binding name="book"><uri>http://www.example/book/book5</uri></binding>
     <binding name="who"><bnode>r29392923r2922</bnode></binding>
   </result>
...
   <result>
     <binding name="book"><uri>http://www.example/book/book6</uri></binding>
     <binding name="who"><bnode>r8484882r49593</bnode></binding>
   </result>
 </results>
</sparql> 

2.3 SOAPバインディング

[WSDL2-Adjuncts]では、抽象的なインタフェース・オペレーションをSOAPにバインディングする手段を定義しています。queryオペレーション(protocol-query.wsdlの)に対するSOAPバインディングは以下次の通りです。

   <binding name="querySoap" interface="SparqlQuery"
	    type="http://www.w3.org/2006/01/wsdl/soap"
            wsoap:version="1.2"
	    wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP">

    <fault ref="tns:MalformedQuery" wsoap:code="soap:Sender" />
    <fault ref="tns:QueryRequestRefused" wsoap:code="soap:Sender" />

    <operation ref="tns:query" wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response" />

  </binding>

SparqlQueryqueryオペレーションのSOAPバインディングの名前はquerySoapで、SOAPを識別するURIに設定されているtype属性の値が理由でSOAPバインディングとなっています。SOAPのバージョンは1.2です。このSOAPバインディングに用いられる基本的なプロトコルは、wsoap:protocol属性のURI値で決まる、HTTPです。SPARQLプロトコルサービスが、http://www.w3.org/2003/05/soap/bindings/HTTPに設定された{http://www.w3.org/2006/01/wsdl/soap, protocol}属性の値を持つSOAPバインディングをサポートしている場合、それはprotocol-query.wsdlで述べているようにバインディングをサポートしなければなりません(must)。HTTP以外の伝送プロトコルに設定されたwsoap:protocolの値を持つSOAPバインディングは、このドキュメントでは説明しません。

2つのfault要素は、SparqlQueryインタフェースで定義されたフォルト・メッセージを参照します。

最後に、operation要素は、上記の抜粋1.0で以前に述べたSparqlQueryインターフェースのqueryオペレーションを参照します。SOAPバインディングは、オペレーションが基本的な伝送プロトコルとしてHTTPを使用していると述べるため、wsoap:mep属性の値は、どのHTTPメソッドが使用されるかを決定します。このオペレーションは、http://www.w3.org/2003/05/soap/mep/request-responseのSOAPメッセージ交換パターンよって実装されていると述べられており、[SOAP12]の7.4項「サポートされている機能」に従い、これはHTTP POSTメソッドにバインディングされています。

2.3.1 SOAPの例

POST /services/sparql-query HTTP/1.1
Content-Type: application/soap+xml
Accept: application/soap+xml, multipart/related, text/*
User-Agent: Axis/1.2.1
Host: www.example
SOAPAction: ""
Content-Length: 438

<?xml version="1.0" encoding="UTF-8"?>
   <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
         <query-request xmlns="http://www.w3.org/2005/09/sparql-protocol-types/#">
            <query>SELECT ?z {?x ?y ?z . FILTER regex(?z, 'Harry')}</query>
         </query-request>
      </soapenv:Body>
   </soapenv:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml

<?xml version="1.0" encoding="utf-8"?>
   <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body> 
         <query-result xmlns="http://www.w3.org/2005/09/sparql-protocol-types/#">
            <ns1:sparql xmlns:ns1="http://www.w3.org/2005/sparql-results#">
               <ns1:head>
                  <ns1:variable name="z"/>
               </ns1:head>
               <ns1:results distinct="false" ordered="false">
                  <ns1:result>
                     <ns1:binding name="z">
                        <ns1:literal>Harry Potter and the Chamber of Secrets</ns1:literal>
                     </ns1:binding>
                  </ns1:result>
                  ...
                  <ns1:result>
                     <ns1:binding name="z">
                        <ns1:literal>Harry Potter and the Half-Blood Prince</ns1:literal>
                     </ns1:binding>
                  </ns1:result>
                  <ns1:result>
                     <ns1:binding name="z">
                        <ns1:literal>Harry Potter and the Goblet of Fire</ns1:literal>
                     </ns1:binding>
                  </ns1:result>
                  <ns1:result>
                     <ns1:binding name="z">
                        <ns1:literal>Harry Potter and the Philosopher's Stone</ns1:literal>
                     </ns1:binding>
                  </ns1:result>
                  <ns1:result>
                     <ns1:binding name="z">
                        <ns1:literal>Harry Potter and the Order of the Phoenix</ns1:literal>
                     </ns1:binding>
                  </ns1:result>
                  <ns1:result>
                     <ns1:binding name="z">
                        <ns1:literal>Harry Potter and the Prisoner Of Azkaban</ns1:literal>
                     </ns1:binding>
                  </ns1:result>
               </ns1:results>
            </ns1:sparql>
         </query-result>
      </soapenv:Body>
   </soapenv:Envelope>

3. 方針に関する考察

3.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)。

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

4. 適合性

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

さらに、protocol-query.wsdlprotocol-types.xsdは、両方とも規範的です。

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

  1. SparqlQueryインターフェースを実装しなければなりません(must)。
  2. HTTP、SOAP、または、SparqlQueryインターフェースのqueryオペレーションのHTTPとSOAPの両方のバインディングを実装できます(may)。
  3. このドキュメント(「RDF用SPARQLプロトコル」)で述べた方法で、protocol-query.wsdlprotocol-types.xsdにおいて、queryのHTTPまたはSOAPのバインディングを実装しなければなりません(must)。
  4. RDF用SPARQLプロトコルで述べられている規範的なHTTPまたはSOAPのバインディングではなく、他のインタフェース、そのインタフェースのオペレーションのバインディング、または、queryオペレーションのバインディングを実装できます(may)。そして、
  5. 3 方針に関する考察で述べている規範的な制約([RFC 2119]キーワードで示されている)と整合性がなければなりません(must)。

5. 参考文献

1. 規範的

[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels, RFC 2119, S. Bradner, March 1997
[RFC3987]
Internationalized Resource Identifiers (IRIs), RFC 3987, M. Durst, M. Suignard
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax, RFC 3986, T. Berners-Lee, R. Fielding, L. Masinter, January 2005
[HTTP]
Hypertext Transfer Protocol -- HTTP/1.1, RFC 2616, R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, T. Berners-Lee, June 1999
[RDF-Concepts]
Resource Description Framework (RDF): Concepts and Abstract Syntax, G. Klyne, J. Carroll, Editors, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-rdf-primer-20040210/ . Latest version http://www.w3.org/TR/rdf-concepts/ .
[RDF-Syntax]
RDF/XML Syntax Specification (Revised), D. Beckett, Editor, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/ . Latest version available at http://www.w3.org/TR/rdf-syntax-grammar .
[SOAP12]
SOAP Version 1.2 Part 2: Adjuncts, M. Gudgin, M. Hadley, N. Mendelsohn, J.-J. Moreau,H.F. Nielsen, Editors, W3C Recommendation, 27 April 2007, http://www.w3.org/TR/2007/REC-soap12-part2-20070427/ . Latest version http://www.w3.org/TR/soap12-part2/ .
[SPARQL]
SPARQL Query Language for RDF, A. Seaborne, E. Prud'hommeaux, Editors, W3C Recommendation, 15 January 2008, http://www.w3.org/TR/2008/REC-rdf-sparql-query-20080115/ . Latest version available at http://www.w3.org/TR/rdf-sparql-query/ .
[SRD]
SPARQL Query Results XML Format, D. Beckett, J. Broekstra, Editors, W3C Recommendation, 15 January 2008, http://www.w3.org/TR/2008/REC-rdf-sparql-XMLres-20080115/ Latest version http://www.w3.org/TR/rdf-sparql-XMLres/ .
WSDL2
Web Services Description Language (WSDL) Version 2.0 Part 1: Core Language, R. Chinnici, J. Moreau, A. Ryman, S. Weerawarana, Editors, W3C Recommendation, 26 June 2007, http://www.w3.org/TR/2007/REC-wsdl20-20070626/ . Latest version available at http://www.w3.org/TR/wsdl20 .
WSDL2-Adjuncts
Web Services Description Language (WSDL) Version 2.0 Part 2: Adjuncts, R. Chinnici, H. Haas, A. A. Lewis, J. Moreau, D. Orchard, S. Weerawarana, Editors, W3C Recommendation, 26 June 2007, http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/ . Latest version available at http://www.w3.org/TR/wsdl20-adjuncts .

2. 参考情報

[UC&R]
RDF Data Access Use Cases and Requirements, K. Clark, Editor, W3C Working Draft, 25 March 2005, http://www.w3.org/TR/2005/WD-rdf-dawg-uc-20050325/ . Latest version available at http://www.w3.org/TR/rdf-dawg-uc/ .
[WSDL2-Primer]
Web Services Description Language (WSDL) Version 2.0 Part 0: Primer, K. Liu, D. Booth, Editors, W3C Recommendation, 26 June 2007, http://www.w3.org/TR/2007/REC-wsdl20-primer-20070626/ . Latest version available at http://www.w3.org/TR/wsdl20-primer/ .
[UNISEC]
Unicode Security Considerations, Mark Davis, Michel Suignard

6. 謝辞

DAWG、特にBijan Parsia、Bryan Thompson、Andy Seaborne、Steve Harris、Eric Prud'hommeaux、Yoshio FUKUSHIGE、Howard Katz、Dirk-Willem van Gulik、Dan Connolly、およびLee Feigenbaumに感謝します。その寛大な援助とサポートに対し、Elias Torresに特に感謝します。また、私のUMDの同僚であるJim Hendler、Ron Alford、Amy Alford、Yarden Katz、Chris Testa、およびMindlab Semantic Web Undergraduate Socialのメンバーにも感謝します。私のNASAの同僚であり友人である、Andy Schainに特に感謝します。Jacek Kopecky、Morten Frederiksen、Mark Baker、Jan Algermissen、Danny Ayers、Bernd Simon、Graham Klyne、Arjohn Kampman、Tim Berners-Lee、Dan Brickley、Patrick Stickler、Karl Dubost、Jonathan Marsh、Leigh Dodds、David Wood、Reto Krummenacher、Thomas Roessler、Danny Weitzner、Paul Downey、Hugo Haas、Richard Newmanにも感謝します。


更新履歴

2007年11月の勧告案以後、1つの更新があり、text/turtleのメディア・タイプを用いるようにCONSTRUCTとシンプルなRDFの例を更新し、メディア・タイプの登録が進行中であることを注記した。