W3C

SPARQL Protocol for RDF

Editor's Draft

This version:
editor's draft $Revision: 1.131 $ of $Date: 2008/01/15 02:32:38 $. change log below
Latest published version:
http://www.w3.org/TR/rdf-sparql-protocol/
Previous version:
http://www.w3.org/TR/2005/WD-rdf-sparql-protocol-20050527/
Editors:
Kendall Grant Clark, <kendall@monkeyfist.com>, Clark & Parsia LLC
Lee Feigenbaum, <lee@thefigtrees.net>, Invited Expert
Elias Torres, <eliast@us.ibm.com>, IBM Corporation

Abstract

The SPARQL Protocol and RDF Query Language (SPARQL) is a query language and protocol for RDF. This document specifies the SPARQL Protocol; it uses WSDL 2.0 to describe a means for conveying SPARQL queries to an SPARQL query processing service and returning the query results to the entity that requested them. This protocol was developed by the W3C RDF Data Access Working Group (DAWG), part of the Semantic Web Activity as described in the activity statement .

Status of this Document

This is the editor's working draft; see change log below.

Since the 14 September 2005 August 2005 last call draft, we have been tracking threads in the public-rdf-dawg-comments archive more closely. A status report is updated every week or so.


Table of Contents

1. Introduction

This document (which refers to itself as "SPARQL Protocol for RDF") describes SPARQL Protocol, a means of conveying SPARQL queries from query clients to query processors. SPARQL Protocol has been designed for compatibility with the SPARQL Query Language for RDF [SPARQL]. SPARQL Protocol is described in two ways: first, as an abstract interface independent of any concrete realization, implementation, or binding to another protocol; second, as HTTP and SOAP bindings of this interface. This document, as well as the associated WSDL and W3C XML Schema documents, are primarily intended for software developers interested in implementing SPARQL query services and clients.

When this document uses the words must, must not, should, should not, may and recommended, and the words appear as emphasized text, they must be interpreted as described in RFC 2119 [RFC2119].

When this document contains excerpts from other documents, including WSDL and XML Schema instances, it uses the following namespace prefixes and namespace URIs:

Prefix Namespace 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 Protocol

This set of documents comprises the specification of the SPARQL Protocol:

SPARQL Protocol for RDF
The current document which normatively specifies the SPARQL Protocol in human-readable language.
SPARQL Protocol WSDL 2.0 Description
The normative description of the SPARQL Protocol using WSDL 2.0.
SPARQL Protocol Types
The XML Schema document that normatively defines the types used in SPARQL Protocol.

SPARQL Protocol contains one interface, SparqlQuery, which in turn contains one operation, query. SPARQL Protocol is described abstractly with WSDL 2.0 [WSDL2] in terms of a web service that implements its interface, types, faults, and operations, as well as by HTTP and SOAP bindings. Note that while this document uses WSDL 2.0 to describe SPARQL Protocol, there is no obligation on the part of any implementation to use any particular implementation strategy, including the use of any WSDL library or programming language framework.

2.1 SparqlQuery Interface

2.1.1 query operation

SparqlQuery is the protocol's only interface. It contains one operation, query, which is used to convey a SPARQL query string and, optionally, an RDF dataset description.

The query operation is described as an In-Out message exchange pattern [WSDL-Adjuncts]. The constraints of an In-Out message exchange pattern are as follows:

This pattern consists of exactly two messages, in order, as follows:

  1. A message:

    • indicated by a Interface Message Reference component whose {message label} is "In" and {direction} is "in"

    • received from some node N

  2. A message:

    • indicated by a Interface Message Reference component whose {message label} is "Out" and {direction} is "out"

    • sent to node N

This pattern uses the rule 2.2.1 Fault Replaces Message.

This interface and its operation are described in the following WSDL 2.0 fragment (from protocol-query.wsdl, which contains the relevant namespace declarations):

<!-- 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>

Excerpt 1.0 WSDL 2.0 fragment

2.1.2 query In Message

Abstractly, the contents of the In Message of SparqlQuery's query operation is an instance of an XML Schema complex type, called st:query-request in Excerpt 1.0, composed of two further parts: one SPARQL query string; and zero or one RDF dataset descriptions. The SPARQL query string, identified by one query type, is defined by [SPARQL] as "a sequence of characters in the language defined by the [SPARQL] grammar, starting with the Query production". The RDF dataset description is composed of zero or one default RDF graphs — composed by the RDF merge of the RDF graphs identified by zero or more default-graph-uri types — and by zero or more named RDF graphs, identified by zero or more named-graph-uri types. These correspond to the FROM and FROM NAMED keywords in [SPARQL], respectively.

These types are defined in the following XML Schema fragment, from protocol-types.xsd:

<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>

Excerpt 1.1 XML Schema fragment

Specifying an RDF Dataset

The RDF dataset may be specified either in a [SPARQL] query using FROM and FROM NAMED keywords; or it may be specified in the protocol described in this document; or it may be specified in both the query string and in the protocol.

Resolving an Ambiguous RDF Dataset

In the case where both the query and the protocol specify an RDF dataset, but not the identical RDF dataset, the dataset specified in the protocol must be the RDF dataset consumed by SparqlQuery's query operation.

Rejecting Query Requests to RDF Datasets

A conformant SPARQL Protocol service may provide a default RDF dataset against which SPARQL query requests are executed in cases where there is no RDF dataset specified in the protocol or in the query request. A conformant SPARQL Protocol service may refuse to process any query request that does not specify an RDF dataset. Finally, a conformant SPARQL Protocol service may refuse to process any query request against any specified RDF dataset. See 2.1.4 query Fault Messages, QueryRequestRefused.

Determining the Base IRI

The BASE keyword in the query string defines the Base IRI used to resolve relative IRIs per Uniform Resource Identifier (URI): Generic Syntax [RFC3986] section 5.1.1, "Base URI Embedded in Content". Section 5.1.2, "Base URI from the Encapsulating Entity" defines how the Base IRI may come from an encapsulating document, such as a SOAP envelope with an xml:base directive. The SPARQL Protocol does not dereference query URIs so section 5.1.3 does not apply. Finally, per section 5.1.4, SPARQL Protocol services must define their own base URI, which may be the service invocation URI.

2.1.3 query Out Message

Abstractly, the contents of the Out Message of SparqlQuery's query operation is an instance of an XML Schema complex type, called query-result in Excerpt 1.2, composed of either:

  1. a SPARQL Results Document [SRD] (for SPARQL Query for RDF query forms SELECT and ASK); or,
  2. an RDF graph [RDF-Concepts] serialized, for example, in the RDF/XML syntax [RDF-Syntax], or an equivalent RDF graph serialization, for SPARQL Query for RDF query forms DESCRIBE and CONSTRUCT).

The query-result type is defined in this W3C XML Schema fragment, from protocol-types.xsd:

<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>

Excerpt 1.2 XML Schema fragment

2.1.4 query Fault Messages

[WSDL2-Adjuncts] defines several fault propagation rules which specify how operation faults and messages interact. The query operation employs the Fault Replaces Message rule:

Any message after the first in the pattern may be replaced with a fault message, which must have identical direction. The fault message must be delivered to the same target node as the message it replaces, unless otherwise specified by an extension or binding extension. If there is no path to this node, the fault must be discarded.

Thus, the query operation contained in the SparqlQuery interface may return, in place of the Out Message, either the MalformedQuery message or the QueryRequestRefused message, both of which are defined in this XML Schema fragment from protocol-types.xsd:

<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>

Excerpt 1.3 XML Schema fragment

MalformedQuery

When the value of the query type is not a legal sequence of characters in the language defined by the SPARQL grammar, the MalformedQuery or QueryRequestRefused fault message must be returned. According to the Fault Replaces Message Rule, if a WSDL fault is returned, including MalformedQuery, an Out Message must not be returned.

When the MalformedQuery fault message is returned, query processing services must include explanatory, debugging, or other additional information for human consumption via the fault-details type defined in Excerpt 1.3.

QueryRequestRefused

This WSDL fault message should be returned when a client submits a request that the service refuses to process. The QueryRequestRefused fault message neither indicates whether the server may or may not process a subsequent, identical request or requests, nor does it constrain a conformant SPARQL service from returning other HTTP status codes or HTTP headers as appropriate given the semantics of [HTTP].

When the QueryRequestRefused fault message is returned, query processing services must include explanatory, debugging, or other additional information intended for human consumption via the fault-details type defined in Excerpt 1.3.

2.2 HTTP Bindings

The SparqlQuery interface operation query described thus far is an abstract operation; it requires protocol bindings to become an invocable operation. This next two sections of this document describe HTTP and SOAP bindings. A conformant SPARQL Protocol service must support the SparqlQuery interface; if a SPARQL Protocol service supports HTTP bindings, it must support the bindings as described in protocol-query.wsdl. A SPARQL Protocol service may support other interfaces. See 2.3 SOAP Bindings for more information.

[WSDL2-Adjuncts] defines a means of binding abstract interface operations to HTTP. The HTTP bindings for the query operation (from protocol-query.wsdl) are as follows:

<!-- 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>

There are two HTTP bindings, queryHttpGet and queryHttpPost, both of which are described as bindings of the SparqlQuery interface. In each of these bindings, the two faults described in SparqlQuery interface, MalformedQuery and QueryRequestRefused, are bound to HTTP status codes 400 Bad Request and 500 Internal Server Error, respectively [HTTP].

The queryHttpGet binding should be used except in cases where the URL-encoded query exceeds practical limits, in which case the queryHttpPost binding should be used.

An Informative Note About Serialization Constraints. The output serialization of the queryHttpGet and queryHttpPost bindings is intentionally under constrained in order to reflect the variety of serialization types of RDF graphs. The fault serialization of queryHttpGet and queryHttpPost is also intentionally under constrained. A conformant SPARQL Protocol service can provide alternative WSDL interfaces and bindings with different constraints.

queryHttpGet

This binding of the query operation uses [HTTP] GET with the following serialization type constraints: the value of whttp:faultSerialization is */*; second, the value of whttp:inputSerialization is application/x-www-form-urlencoded with UTF-8 encoding; and, third, the whttp:outputSerialization is application/sparql-results+xml with UTF-8 encoding, application/rdf+xml with UTF-8 encoding, and */*.

queryHttpPost

This binding of the query operation uses [HTTP] POST with the following serialization type constraints: the value of whttp:faultSerialization is */*; second, the value of whttp:inputSerialization is application/x-www-form-urlencoded with UTF-8 encoding and application/xml with UTF-8 encoding; and, third, the whttp:outputSerialization is application/sparql-results+xml with UTF-8 encoding, application/rdf+xml with UTF-8 encoding, and */*.

2.2.1 HTTP Examples

The following abstract HTTP trace examples illustrate invocation of the query operation under several different scenarios. These example traces are abstracted from complete HTTP traces in three ways: (1) In each example the string "EncodedQuery" represents the URL-encoded string equivalent of the SPARQL query given in the first block of each example; (2) only partial response bodies, containing the query results, are displayed; (3) the URI values of default-graph-uri and named-graph-uri are also not URL-encoded.

2.2.1.1 SELECT with service-supplied RDF dataset

This SPARQL query

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

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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

That query against the service-supplied RDF dataset, executed by that SPARQL query service, returns the following query result:

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 with simple RDF dataset

This SPARQL query

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

is conveyed to the SPARQL query service, http://www.other.example/sparql/, as illustrated in this HTTP trace:

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

That query — against the RDF dataset identified by the value of the default-graph-uri parameter, http://www.other.example/books — executed by that SPARQL query service, returns the following query result:

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 with simple RDF dataset and HTTP content negotiation

This SPARQL query

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))
}

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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

With the response illustrated here:

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.

Note: registration for the media type text/turtle was started but not completed at the time of this publication. Please see http://www.w3.org/TeamSubmission/turtle for the final registered media type for the Turtle language.

2.2.1.4 ASK with simple RDF dataset

This SPARQL query

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

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/books HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

With the response illustrated here:

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 with simple RDF dataset

This SPARQL query

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

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated here:

GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/books HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

With the response illustrated here:

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 with complex RDF dataset

This SPARQL query

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 }
}

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated here (with line breaks for legibility):

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

With the response illustrated here:

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 with query-only RDF dataset

This SPARQL query

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 }
}

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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

With the response illustrated here:

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 with ambiguous RDF dataset

This SPARQL query

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 }
}

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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

This protocol operation contains an ambiguous RDF dataset: the dataset specified in the query is different than the one specified in the protocol (by way of default-graph-uri and named-graph-uri parameters). A conformant SPARQL Protocol service must resolve this ambiguity by executing the query against the RDF dataset specified in the protocol:

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 with malformed query fault

This syntactically invalid SPARQL query

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

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

GET /sparql/?query=EncodedQuery&default-graph-uri=http://www.example/morepublishers HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1

With the response — the MalformedQuery fault replacing the Out Message, as per 2.1 SparqlQuery — illustrated here:

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 with query request refused fault

This SPARQL query

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

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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

With the response — the QueryRequestRefused fault replacing the Out Message, as per 2.1 SparqlQuery — illustrated here:

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 Very long SELECT query using POST binding

Some SPARQL queries, perhaps machine generated, may be longer than can be reliably conveyed by way of the HTTP GET binding described in 2.2 HTTP Bindings. In those cases the POST binding described in 2.2 may be used. This SPARQL query

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" .
    }
}

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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

With the response illustrated here:

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 with internationalization

SPARQL queries may include internationalized characters or character sets. This SPARQL query

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 ] . }

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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 with queryHttpPost binding and XML input

In some future version SPARQL queries could be serialized as XML and conveyed to a SPARQL query service by way of HTTP POST. This SPARQL query

<?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>

is conveyed to the SPARQL query service, http://www.example/sparql/, as illustrated in this HTTP trace:

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>

That query against the service-supplied RDF dataset, executed by that SPARQL query service, returns the following query result:

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 Bindings

[WSDL2-Adjuncts] defines a means of binding abstract interface operations to SOAP. The SOAP bindings for the query operation (from protocol-query.wsdl) are as follows:

   <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>

The name of the SOAP binding of SparqlQuery's query operation is querySoap; it is a SOAP binding because of the value of type attribute, which is set to the URI identifying SOAP. The version of SOAP is 1.2. The underlying protocol used in this SOAP binding is HTTP, as determined by the URI value of the wsoap:protocol attribute. If a SPARQL Protocol service supports SOAP bindings with the value of the {http://www.w3.org/2006/01/wsdl/soap, protocol} attribute set to http://www.w3.org/2003/05/soap/bindings/HTTP, it must support the bindings as described in protocol-query.wsdl. SOAP bindings with wsoap:protocol values set to transmission protocols other than HTTP are not described in this document.

The two fault elements refer to the fault messages defined in the SparqlQuery interface.

Finally, the operation element references the query operation of the SparqlQuery interface which has been previously described in Excerpt 1.0 above. Since this SOAP binding describes the operation as using HTTP as the underlying transport protocol, the value of the wsoap:mep attribute determines which HTTP method is to be used. This operation is described as being implemented by a SOAP message exchange pattern http://www.w3.org/2003/05/soap/mep/request-response, which, according to [SOAP12] 7.4 Supported Features, is bound to an HTTP POST method.

2.3.1 SOAP Example

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. Policy Considerations

3.1 Security

There are at least two possible sources of denial-of-service attacks against SPARQL protocol services. First, under-constrained queries can result in very large numbers of results, which may require large expenditures of computing resources to process, assemble, or return. Another possible source are queries containing very complex — either because of resource size, the number of resources to be retrieved, or a combination of size and number — RDF dataset descriptions, which the service may be unable to assemble without significant expenditure of resources, including bandwidth, CPU, or secondary storage. In some cases such expenditures may effectively constitute a denial-of-service attack. A SPARQL protocol service may place restrictions on the resources that it retrieves or on the rate at which external resources are retrieved. There may be other sources of denial-of-service attacks against SPARQL query processing services.

Since a SPARQL protocol service may make HTTP requests of other origin servers on behalf of its clients, it may be used as a vector of attacks against other sites or services. Thus, SPARQL protocol services may effectively act as proxies for third-party clients. Such services may place restrictions on the resources that they retrieve or on the rate at which external resources can be retrieved. SPARQL protocol services may log client requests in such a way as to facilitate tracing them with regard to third-party origin servers or services.

SPARQL protocol services may choose to detect these and other costly, or otherwise unsafe, queries, impose time or memory limits on queries, or impose other restrictions to reduce the service's (and other service's) vulnerability to denial-of-service attacks. They also may refuse to process such query requests.

Different IRIs may have the same appearance. Characters in different scripts may look similar (a Cyrillic "о" may appear similar to a Latin "o"). A character followed by combining characters may have the same visual representation as another character (LATIN SMALL LETTER E followed by COMBINING ACUTE ACCENT has the same visual representation as LATIN SMALL LETTER E WITH ACUTE). Users of SPARQL must take care to construct queries with IRIs that match the IRIs in the data. Further information about matching of similar characters can be found in Unicode Security Considerations [UNISEC] and Internationalized Resource Identifiers (IRIs) [RFC3987] Section 8.

4. Conformance

The status of the parts of SPARQL Protocol for RDF (this document) is as follows:

Further, both protocol-query.wsdl and protocol-types.xsd are normative.

A conformant SPARQL Protocol service:

  1. must implement the SparqlQuery interface;
  2. may implement HTTP, SOAP, or both HTTP and SOAP bindings of the query operation of the SparqlQuery interface;
  3. must implement HTTP or SOAP bindings of query in the way described in this document ("SPARQL Protocol for RDF"), in protocol-query.wsdl, and protocol-types.xsd;
  4. may implement other interfaces, bindings of the operations of those interfaces, or bindings of the query operation other than the normative HTTP or SOAP bindings described by SPARQL Protocol for RDF; and
  5. must be consistent with the normative constraints (indicated by [RFC 2119] keywords) described in 3. Policy Considerations.

5. References

1. Normative

[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels RFC 2119 S. Bradner March 1997
[RFC3987]
RFC 3987, "Internationalized Resource Identifiers (IRIs)", M. Dürst , M. Suignard
[RFC3986]
RFC 3986 Uniform Resource Identifier (URI): Generic Syntax, T. Berners-Lee, R. Fielding, L. Masinter January 2005
[HTTP]
Hypertext Transfer Protocol -- HTTP/1.1 R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, T. Berners-Lee RFC2616 June 1999
[RDF-Concepts]
Resource Description Framework (RDF): Concepts and Abstract Syntax, Klyne G., Carroll J. (Editors), W3C Recommendation, 10 February 2004. This version is http://www.w3.org/TR/2004/REC-rdf-primer-20040210/. The latest version is 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, 24 June 2003, http://www.w3.org/TR/soap12-part2/. Latest version available at http://www.w3.org/TR/soap12-part2/ .
[SPARQL]
SPARQL Query Language for RDF , A. Seaborne, E. Prud'hommeaux, Editors, W3C Working Draft (Last Call), 19 April 2005, http://www.w3.org/TR/2005/WD-rdf-sparql-query-20050419/ . Latest version available at http://www.w3.org/TR/rdf-sparql-query/ .
[SRD]
SPARQL Query Results XML Format , D. Beckett, J. Broekstra, Editors, W3C Working Draft (work in progress), 25 January 2006.
WSDL2
Web Services Description Language (WSDL) Version 2.0 Part 1: Core Language , R. Chinnici, J. Moreau, A. Ryman, S. Weerawarana, Editors, W3C Candidate Recommendation (work in progress), 27 March 2006, http://www.w3.org/TR/2006/CR-wsdl20-20060327 . 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 Candidate Recommendation (work in progress), 27 March 2006, http://www.w3.org/TR/2006/CR-wsdl20-adjuncts-20060327 . Latest version available at http://www.w3.org/TR/wsdl20-adjuncts .

2. Informative

[UC&R]
RDF Data Access Use Cases and Requirements , K. Clark, Editor, W3C Working Draft (work in progress), 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 Working Draft (work in progress), 27 March 2006, http://www.w3.org/TR/wsdl20-primer/ . Latest version available at http://www.w3.org/TR/wsdl20-primer/ .
[UNISEC]
Unicode Security Considerations, Mark Davis, Michel Suignard

6. Acknowledgments

My thanks to members of DAWG, especially Bijan Parsia, Bryan Thompson, Andy Seaborne, Steve Harris, Eric Prud'hommeaux, Yoshio FUKUSHIGE, Howard Katz, Dirk-Willem van Gulik, Dan Connolly, and Lee Feigenbaum. Particular thanks are owed to Elias Torres for his generous assistance and support. Thanks as well to my UMD colleagues Jim Hendler, Ron Alford, Amy Alford, Yarden Katz, Chris Testa, and members of the Mindlab Semantic Web Undergraduate Social. Particular thanks are also owed my NASA colleague and friend, Andy Schain. I also thank 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.


Change Log

A brief, high-level summary of changes to this specification and related materials since the 6 Apr 2006 Candidate Recommendation publication:

Detailed CVS change history since 6 Apr 2006 Candidate Recommendation follows:

 
$Log: Overview.html,v $
Revision 1.131  2008/01/15 02:32:38  eric
~ imported changes from PR

Revision 1.130  2008/01/13 05:05:07  eric
~ typo

Revision 1.129  2008/01/12 22:08:44  eric
~ point to Turtle Submission for final Turtle media type

Revision 1.128  2008/01/11 19:42:56  lfeigenb
updated text noting status of text/turtle mime type

Revision 1.127  2008/01/11 19:31:15  lfeigenb
fix exmaple with n3 media type to use text/turtle; add note about unregistered type

Revision 1.126  2007/11/12 06:05:50  eric
~ link typo

Revision 1.125  2007/10/24 14:22:37  lfeigenb
update links to WSDL and XSD to point to /2007/SPARQL/xxx

Revision 1.124  2007/10/24 04:01:40  eric
validate

Revision 1.123  2007/10/24 03:52:34  eric
well-formed

Revision 1.122  2007/10/23 14:52:39  lfeigenb
updated editor emails and affiliations

Revision 1.121  2007/10/16 16:57:17  lfeigenb
added high level change summary to change log

Revision 1.120  2007/02/20 06:53:13  etorres
added base-iri sub-section to 2.1.2 as per 20070213 dawg meeting.
added normative reference to rfc3986
added two new editors to document

Revision 1.119  2006/05/16 15:28:55  kclark
removed large, unneeded html comment
added soap namespace binding to table

Changes from Last Call to Candidate Recommendation:

Revision 1.118  2006/03/29 12:53:20  connolly
cite 27 Mar CR version of WSDL2, WSDL2-Adjuncts using bib generator

Revision 1.117  2006/03/27 20:55:57  kclark
updated WSDL pointers, again

Revision 1.116  2006/03/24 19:56:15  kclark
changed long query to something that's testable
added results for long query

Revision 1.115  2006/03/24 18:24:01  kclark
updated WSDL 2.0 links
updated description of In-Out MEP
updated definition of Fault Replaces Message rule
fixed a bug where I refer to an XML Schema excerpt as a WSDL excerpt
synched excerpts of the WSDL with the WSDL (the namespace fixes from 1.18/19 of
sparql-protocol-query.wsdl; and the wsdlx:safety="true" fixes too)
changed "practicable" to "practical"
removed the word "respectively"
added actual long query for post example
put todo span marker around the results for the long query and the kanji example -- these are still TODO
made a link to the sparqlx.rnc in an informative HTTP example (all the HTTP examples are informative)

Revision 1.114  2006/03/20 21:58:41  kclark
fix buggy typo

Revision 1.113  2006/03/20 21:57:10  kclark
changed should to must return fault on bad query string
fixed soap xml malformedness

Revision 1.112  2006/02/08 14:21:03  kclark
fixing broken 'since' language

Revision 1.111  2006/02/08 13:55:27  kclark
tweaked changelog

Changes prior to Last Call:

tweaked language about malformed query and out messages
tweaked language about malformedquery wsdl fault propagation
added charset to text/plain in 2.2.1.9
added charset to text/html in 2.2.1.10
added a doctype declaration in 2.2.1.10
removed application/dime from the SOAP example
replacing text/xml with application/soap+xml
removed 3.2 privacy section (no consensus from experts on what this section should do; seems out of scope now)
changed SHOULD to MAY in re: logging requests
added "Rejecting Query Requests to RDF Datasets" section with 3 "may" clauses
added a conformance section (4. Conformance) (per Q&A review)
conformance section includes statement of which parts of the doc are normative or informative
added a bit about who might be interested in this spec (per Q&A review)
synched language with WSDL changes (mostly this involves changes to the HTTP bindings section)
tightened the distinction between SPARQL Protocol (the wsdl, xsd, and for-humans spec) and SPARQL Protocol for RDF (the for-humans spec)
changed the language of QueryRequestRefused: must is now should and there's an explicit statement that HTTP status codes
and headers can be returned irrespective of the two WSDL faults defined by SPARQL Protocol
changed fault-details should be returned to must be returned to help distinguish in the 400 and 500 cases between HTTP
status codes and WSDL faults
added an informative note about serialization constraints
added 2.2.1.12 SELECT with internationalization (incomplete)
added 2.2.1.13 SELECT with queryHttpPost between and XML input
changed old SOAP namespace in the SOAP example
removed charset utf-8 bits
simplified the language describing QueryRequestRefused
no obligation to use WSDL language added
erroneous query-result types changed to correct query-request types
corrected SOAP namespace in the SOAP example (now using the SOAP 1.2 namespace instead of the SOAP 1.1 NS)
added a table of local name to NS URI bindings for legibility
added a list of the documents comprising the protocol, with links, for legibility
corrected IMT in the DESCRIBE example (from app/sparql-results+xml to app/rdf+xml)