SPARQL 1.2 协议

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-sparql12-protocol-20260426/
最新发布版本:
https://www.w3.org/TR/sparql12-protocol/
最新编辑草案:
https://w3c.github.io/sparql-protocol/spec/
历史记录:
https://www.w3.org/standards/history/sparql12-protocol/
提交历史
测试套件:
https://w3c.github.io/rdf-tests/
最新推荐标准:
https://www.w3.org/TR/2013/REC-sparql11-protocol-20130321
编辑:
Andy Seaborne
Ruben Taelman
Gregory Williams
Thomas Pellissier Tanon
前任编辑:
Lee Feigenbaum
Gregory Todd Williams
Kendall Grant Clark
Elias Torres
反馈:
GitHub w3c/sparql-protocol (拉取请求, 新建议题, 未解决议题)
public-rdf-star-wg@w3.org 主题行为 [sparql12-protocol] … 消息主题 …归档

摘要

SPARQL 协议和 RDF 查询语言(SPARQL)是用于 RDF 的查询语言和协议。本文档规定了 SPARQL 协议;它描述了一种 将 SPARQL 查询和更新传送给 SPARQL 处理服务,并通过 HTTP 将 结果返回给请求它们的实体的方式。该协议由 W3C SPARQL 工作组开发,该工作组是语义网活动的一部分,如 活动声明中所述。

本文档状态

本节描述了本文档在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。

本规范由 RDF Star 工作组发布,作为 格式和勘误规范更新的一部分。

本文档由 RDF & SPARQL 工作组作为 工作草案发布,并使用 推荐标准 轨道

作为 工作草案发布并不意味着 W3C 及其成员的认可。

这是一个草案文档,随时可能由其他 文档更新、替换或废弃。除非作为进行中的工作, 否则引用本文档是不合适的。 这一即将发布的推荐标准的未来更新可能会纳入 新特性

本文档由一个按照 W3C 专利 政策运作的工作组编制。 W3C 维护着一个 与该工作组可交付成果有关的任何专利 披露的公开列表; 该页面还包括 披露专利的说明。任何实际 知悉其认为包含 必要权利要求 的专利的个人,必须按照 W3C 专利政策第 6 节披露该信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档管辖。

1. 引言

本文档描述了 SPARQL 1.2 协议,这是一种将 SPARQL 查询和更新从客户端 传送到 SPARQL 处理器的方式。SPARQL 协议被设计为兼容 SPARQL 1.2 查询语言以及 SPARQL 1.2 更新。本文档主要面向有兴趣 实现 SPARQL 查询和更新服务及客户端的软件开发者。

SPARQL 协议由两个 HTTP 操作组成:用于 执行 SPARQL 查询语言查询的查询操作,以及用于执行 SPARQL 更新语言请求的更新 操作。SPARQL 协议客户端向 SPARQL 协议服务发送 HTTP 请求, 这些服务处理请求,并将 HTTP 响应发送回 发起请求的客户端。

另一个单独的文档描述了 SPARQL 1.2 图存储 协议,该协议描述了以 REST 架构风格 使用 HTTP 操作来管理一组图的用途。

1.1 文档约定

当本文档使用 mustmust notshouldshould notmay 等词,并且这些词以强调文本出现时,它们必须 按照 [RFC2119] 中所述进行 解释。

1.2 术语

SPARQL 协议客户端
一个 HTTP 客户端(定义见 第 3.3 节:连接、 客户端和 服务器,出自 HTTP 语义 [RFC9110]),它为 SPARQL 协议操作发送 HTTP 请求。(也称为:客户端。)
一个 HTTP 客户端(定义见 RFC 9110 [RFC9110]),它为 SPARQL 协议操作发送 HTTP 请求。(也称为:客户端
SPARQL 协议服务
一个 HTTP 服务器,它为 SPARQL 协议 操作提供 HTTP 请求服务并返回 HTTP 响应。SPARQL 协议服务监听请求的 URI 通常 称为 SPARQL 端点。(也称为:服务
SPARQL 端点
SPARQL 协议服务用于监听来自 SPARQL 协议客户端请求的 URI。
SPARQL 协议操作
符合本文档定义的协议的 HTTP 请求和响应。
RDF 数据集
一个默认图和零个或多个命名图的集合,如 SPARQL 1.2 查询语言所定义。

2. SPARQL 协议操作

SPARQL 协议由两个操作组成:query 和 update。协议操作定义以下内容的组合:

SPARQL 1.2 协议建立在 HTTP 之上。所有关于请求和响应的 HTTP 要求 must 得到遵循。

2.1 版本公告

向端点发送查询或更新操作时,该操作的版本 MAY 通过使用 语法上的 version 指令来公告, 或通过传递 version 参数来公告(这取决于所使用的 HTTP 方法)。

当版本同时在语法和参数中指明时, 预期它们是相同的。 如果它们不同, 解析器会使用参数中的版本,并可能发出关于不匹配的警告。

为尽可能广泛地保持与旧解析器的兼容性, 仅鼓励使用 SPARQL 1.2 特有功能的查询 公告其版本(也就是说,对于未使用 SPARQL 1.2 特有功能的查询,不鼓励公告版本)。

对操作的响应 MAY 也包含版本公告。 SPARQL results versionRDF version 不一定与请求中指定的 operation version 相同。 相反,版本公告取决于响应及其格式,例如 SPARQL 1.2 查询结果 JSON 格式RDF 1.2 Turtle

版本字符串的值在 RDF 1.2 概念与抽象 数据模型中讨论。

2.2 查询操作

query 操作用于向服务发送 SPARQL 查询,并接收 查询结果。 查询操作 must 使用 HTTP GET 或 HTTP POST 方法调用。 此操作的客户端请求 must 恰好包含一个 SPARQL 查询字符串 (参数名:query) 并且 may 包含一个版本(参数名:version), 以及零个或多个默认图 URI(参数名:default-graph-uri)和命名图 URI(参数名:named-graph-uri)。

对查询请求的响应 must 采用与 SPARQL Results 或 RDF 对应的格式, 具体取决于查询形式内容协商 [RFC9110]。 这些格式的示例包括:

  HTTP 方法 查询字符串参数 请求内容类型 请求消息正文
通过 GET 发送 query GET query(恰好 1 个)
version(0 或 1 个)
default-graph-uri(0 个或多个)
named-graph-uri(0 个或多个)
通过 URL 编码 POST 发送 query POST application/x-www-form-urlencoded URL 编码、以与号分隔的查询参数。
query(恰好 1 个)
version(0 或 1 个)
default-graph-uri(0 个或多个)
named-graph-uri(0 个或多个)
直接通过 POST 发送 query POST default-graph-uri(0 个或多个)
named-graph-uri(0 个或多个)
application/sparql-query(带可选的 version 媒体类型 参数) 未编码的 SPARQL 查询字符串

query 请求的参数 must 按照以下三个 选项之一发送:

2.2.1 通过 GET 发送 query

协议客户端 may 通过 HTTP GET 方法发送协议请求。使用 GET 方法时,客户端 must 对所有参数进行 URL 百分号编码, 并将其作为查询参数字符串 [RFC3986] 包含在请求中,名称 使用 上文给出的名称。

HTTP 查询字符串参数 must 使用与号 (&)字符分隔。客户端可以按任意顺序包含这些查询字符串参数。

HTTP 请求 must not 包含消息正文。

2.2.2 通过带 URL 编码参数的 POST 发送 query

协议客户端 may 通过 HTTP POST 方法发送协议请求,做法是对 参数进行 URL 编码。使用此方法时,客户端 must 对所有参数进行 URL 百分号编码 [RFC3986], 并通过 application/x-www-form-urlencoded 媒体类型,以参数形式将它们包含在请求正文中,名称使用上文给出的名称。参数 must 使用与号(&)字符分隔。客户端 可以按任意顺序包含这些参数。HTTP 请求的内容类型标头 must 设置为 application/x-www-form-urlencoded

2.2.3 直接通过 POST 发送 query

协议客户端 may 通过 HTTP POST 方法发送协议请求,做法是将 查询直接且未编码地包含为 HTTP 请求消息正文。使用此 方法时,客户端 must 在请求的消息正文中包含未编码的 SPARQL 查询字符串,且不能包含其他内容。 客户端 must 将 HTTP 请求的内容类型 标头设置为 application/sparql-query,并可带可选的 version 媒体类型参数。客户端 may 在请求 URI 中将可选的 default-graph-urinamed-graph-uri 参数作为 HTTP 查询字符串参数包含。注意,UTF-8 是此处唯一有效的 charset。

2.2.4 指定 RDF 数据集

SPARQL 查询会针对一个 RDF 数据集执行。查询的 RDF 数据集 可以通过 SPARQL 协议中的 default-graph-urinamed-graph-uri 参数指定, 也可以在 SPARQL 查询字符串中使用 FROMFROM NAMED 关键字指定。如果协议请求和 SPARQL 查询 字符串中指定了不同的 RDF 数据集,则 SPARQL 服务 must 使用协议请求中给出的 RDF 数据集执行查询。

注意,如果服务 不允许协议客户端指定 RDF 数据集,则服务 may 以 HTTP 响应代码 400 拒绝查询。

如果在协议请求或 SPARQL 查询字符串中均未指定 RDF 数据集,则 实现 may 针对一个 由实现定义的默认 RDF 数据集执行查询。

2.2.5 可接受的响应格式

协议客户端 should 使用 HTTP 内容协商 [RFC9110] 来 请求 客户端能够使用的响应格式。关于可能的响应格式,请参见下文。

2.2.6 成功响应

SPARQL 协议使用 HTTP 中定义的响应状态码来指示操作成功或失败。 有关每个状态码的详细定义,请查阅 HTTP 规范 [RFC9110]。 虽然协议服务 should 对成功的查询使用 2XX HTTP 响应代码,但它 may 按照 HTTP 选择改用 3XX 响应代码。

带 2XX 响应的成功查询操作的响应正文为以下之一:

成功查询操作响应的内容类型必须是为 响应正文格式定义的媒体类型。

2.2.7 失败响应

适用于失败查询操作的 HTTP 响应代码包括:

  • 400,如果请求中提供的 SPARQL 查询不是 SPARQL 语法定义的语言中的合法字符序列;或者,
  • 500,如果服务无法执行该查询。SPARQL 协议服务也可以在拒绝执行查询时返回 500 响应代码。此响应并不表明 服务器是否可以处理后续相同的一个或多个请求。

失败查询请求的响应正文由实现定义。实现 may 使用 HTTP 内容协商来提供关于失败查询请求的、人类可读或机器可处理 (或两者皆有)的信息。

协议服务 may 按照 HTTP,为其他失败 条件使用其他 4XX 或 5XX HTTP 响应代码。

2.3 更新操作

update 操作用于向服务发送 SPARQL 更新请求。更新 操作 must 使用 HTTP POST 方法调用。此操作的客户端请求 must 恰好包含一个 SPARQL 更新请求字符串(参数 名:update),并且 may 包含一个版本(参数名: version)以及零个或多个默认图 URI(参数名:using-graph-uri)和命名图 URI(参数名: using-named-graph-uri)。对更新请求的响应通过 HTTP 响应状态码指示请求的成功或失败。

  HTTP 方法 查询字符串参数 请求内容类型 请求消息正文
通过 URL 编码 POST 发送 update POST application/x-www-form-urlencoded URL 编码、以与号分隔的查询参数。
version(0 或 1 个)
update(恰好 1 个)
using-graph-uri(0 个或多个)
using-named-graph-uri(0 个或多个)
直接通过 POST 发送 update POST using-graph-uri(0 个或多个)
using-named-graph-uri(0 个或多个)
application/sparql-update(带可选的 version 媒体类型 参数) 未编码的 SPARQL 更新请求字符串

update 请求的参数 must 按照以下两个 选项之一发送:

2.3.1 通过带 URL 编码参数的 POST 发送 update

协议客户端 may 通过 HTTP POST 方法发送更新协议请求,做法是对 参数进行 URL 编码。使用此方法时,客户端 must 对所有参数进行 URL 百分号 编码,并通过 application/x-www-form-urlencoded 媒体类型,以参数形式将它们包含在请求正文中,名称使用上文给出的名称。参数 must 使用与号(&)字符分隔。客户端 可以按任意顺序包含这些参数。HTTP 请求的内容类型标头 must 设置为 application/x-www-form-urlencoded

2.3.2 直接通过 POST 发送 update

协议客户端 may 通过 HTTP POST 方法发送更新协议请求,做法是 将更新请求直接且未编码地包含为 HTTP 请求消息正文。使用 此方法时,客户端 must 在请求的消息正文中包含未编码的 SPARQL 更新请求字符串, 且不能包含其他内容。客户端 must 将 HTTP 请求的内容类型标头设置为 application/sparql-update,并可带 可选的 version 媒体类型参数。客户端 may 在请求 URI 中将 可选的 using-graph-uriusing-named-graph-uri 参数作为 HTTP 查询字符串参数包含。

2.3.3 指定 RDF 数据集

SPARQL Update 请求针对 Graph Store 执行,Graph Store 是由 SPARQL 服务管理的 RDF 图的可变容器。SPARQL 更新 DELETE/INSERT 操作WHERE 子句 会匹配 RDF 数据集中的数据,该数据集是 Graph Store 的一个子集。更新操作的 RDF 数据集可以在操作 字符串本身中使用 USINGUSING NAMED 和/或 WITH 关键字指定,也可以通过 using-graph-uriusing-named-graph-uri 参数指定。

当使用此协议传送包含使用 USINGUSING NAMEDWITH 子句的 操作的 SPARQL 1.2 Update 请求时,提供 using-graph-uriusing-named-graph-uri 参数是一个错误。

SPARQL Update 处理器应将更新协议操作中每一次出现的 using-graph-uri=g 参数视为在 SPARQL 1.2 Update 请求中的每个操作中都包含了一个 USING <g> 子句。 类似地,SPARQL Update 处理器 应将更新协议操作中每一次出现的 using-named-graph-uri=g 参数视为在 SPARQL 1.2 Update 请求中的每个 操作中都包含了一个 USING NAMED <g> 子句。

2.3.4 成功响应

SPARQL 协议使用 HTTP 中定义的响应状态码来指示操作成功或失败。 有关每个状态码的详细定义,请查阅 HTTP 规范 [RFC9110]。 虽然协议服务 should 对成功处理的更新请求使用 2XX HTTP 响应代码, 但它 may 按照 HTTP 选择改用 3XX 响应代码。

成功更新请求的响应正文由实现定义。实现 may 使用 HTTP 内容协商来提供关于已完成更新请求的 人类可读和机器可处理信息。

2.3.5 失败响应

失败更新请求的 HTTP 响应代码应该是:

  • 400,如果 SPARQL 更新请求字符串不是 SPARQL Update 语法定义的语言中的合法字符序列;或者,
  • 500,如果服务无法执行该更新请求。SPARQL 协议服务也可以在拒绝执行更新请求时返回 500 响应代码。此响应 并不表明服务器是否可以处理后续相同的一个或 多个请求。

失败更新请求的响应正文由实现定义。实现 may 使用 HTTP 内容协商来提供关于失败更新请求的、人类可读或机器可处理 (或两者皆有)的信息。

协议服务 may 按照 HTTP,为其他失败 条件使用其他 4XX 或 5XX HTTP 响应代码。

2.4 确定基准 IRI

SPARQL 查询或 SPARQL 更新请求字符串中的 BASE 关键字定义了 用于按照 统一资源标识符(URI):通用 语法第 5.1.1 节“内容中嵌入的基准 URI”解析相对 IRI 的基准 IRI。SPARQL 协议 不解引用查询 URI,因此第 5.1.3 节不适用。最后,根据第 5.1.4 节,SPARQL 协议服务 must 定义自己的基准 URI,该 URI may 是服务端点。

3. SPARQL 协议 请求示例(资料性)

以下 HTTP 跟踪示例说明了在几种不同场景下对 queryupdate 操作的调用方式。某些示例跟踪按以下方式 从完整 HTTP 跟踪中抽象出来:

  1. 在某些示例中,字符串 "EncodedQuery" 表示示例中给出的 SPARQL 查询字符串对应的 URL 编码字符串;字符串 "UnencodedQuery" 表示示例中给出的、未经过任何编码的准确 SPARQL 查询字符串。
  2. 对于 query 操作示例,仅显示包含查询结果的 部分响应正文。

3.1 SPARQL 查询示例

3.1.1 带 服务提供的 RDF 数据集的 SELECT

此 SPARQL 查询

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

通过 HTTP GET 传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

该 SPARQL 查询服务针对服务提供的 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>
   <result>
     <binding name="book"><uri>http://www.example/book/book5</uri></binding>
     <binding name="who"><bnode>r29392923r2922</bnode></binding>
   </result>
...
</sparql>

3.1.2 带简单 RDF 数据集的 SELECT

此 SPARQL 查询

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

被传送到 SPARQL 查询服务 http://www.other.example/sparql/,如下 HTTP 跟踪所示:

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

该 SPARQL 查询 服务针对由 default-graph-uri 参数值 http://www.other.example/books 标识的 RDF 数据集执行该查询后,返回以下查询结果:

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

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

3.1.3 带简单 RDF 数据集和 HTTP 内容协商的 CONSTRUCT

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

响应如下所示:

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

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

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

3.1.4 带简单 RDF 数据集的 ASK

此 SPARQL 查询

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

响应如下所示:

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

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

3.1.5 带简单 RDF 数据集的 DESCRIBE

此 SPARQL 查询

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下所示:

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

响应如下所示:

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

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

3.1.6 带复杂 RDF 数据集的 SELECT

此 SPARQL 查询

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

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下所示(为便于阅读加入了 换行):

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

响应如下所示:

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

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

3.1.7 带 仅查询 RDF 数据集的 SELECT

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

响应如下所示:

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

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

3.1.8 带 有歧义 RDF 数据集的 SELECT

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

此协议操作包含一个有歧义的 RDF 数据集:查询中指定的数据集 与协议中(通过 default-graph-urinamed-graph-uri 参数)指定的数据集不同。符合要求的 SPARQL 协议服务必须通过针对协议中指定的 RDF 数据集执行查询来解决此歧义:

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

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

3.1.9 带 格式错误查询故障的 SELECT

此语法无效的 SPARQL 查询

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

错误响应如下所示:

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

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

3.1.10 带 查询请求被拒绝故障的 SELECT

此 SPARQL 查询

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

错误响应如下所示:

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

SPARQL Processing Service: Query Request Refused

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

3.1.11 使用带 URL 编码的 POST 的长 SELECT 查询

某些 SPARQL 查询(可能由机器生成)可能长到无法通过 2.1.1 通过 GET 发送 query 中描述的 HTTP GET 绑定可靠传送。 在这些情况下,可以使用 2.1.2 通过带 URL 编码参数的 POST 发送 query 中描述的 POST 绑定。此 SPARQL 查询

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

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

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

响应如下所示:

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

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

3.1.12 使用直接 POST 的 长 SELECT 查询

SPARQL 查询也可以直接 POST,而不进行 URL 编码,如 2.1.3 直接通过 POST 发送 query 中所述。前一个示例中使用的同一查询被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

UnencodedQuery

响应与前一个示例相同。

3.1.13 带 国际化的 SELECT

SPARQL 查询可以包含国际化字符或字符集。此 SPARQL 查询

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

被传送到 SPARQL 查询服务 http://www.example/sparql/,如下 HTTP 跟踪所示:

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

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

3.1.14 带 具体化三元组模式的 SELECT

SPARQL 查询可以以具体化三元组为目标。此 SPARQL 查询

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX ex: <http://example.org/>
SELECT ?name ?person
WHERE { << _:a foaf:name ?name >> ex:statedBy ?person . }

被传送到 SPARQL 查询服务 http://www.example/sparql/。由于该查询 使用 SPARQL 1.2 语法,并且该查询未以语法方式公告 1.2 版本,因此 GET 请求使用 version=1.2 参数发出。如下 HTTP 跟踪所示:

GET /sparql/?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0APREFIX%20ex%3A%20%3Chttp%3A%2F%2Fexample.org%2F%3E%0ASELECT%20%3Fname%20%3Fperson%0AWHERE%20%7B%20%3C%3C%28%20_%3Aa%20foaf%3Aname%20%3Fname%20%29%3E%3E%20ex%3AstatedBy%20%3Fperson%20.%20%7D&version=1.2
Host: www.example
User-agent: sparql-client/0.1
HTTP/1.1 200 OK
Date: Wed, 03 Aug 2005 12:48:25 GMT
Server: Apache/1.3.29 (Unix)
Connection: close
Content-Type: application/sparql-results+xml

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

3.1.15 使用直接 POST 的、带 1.2 查询和 1.2 响应的 SELECT

下面的查询使用 isTRIPLE 函数。由于这是一个 SPARQL 1.2 特性,它 以语法方式公告其版本:

VERSION "1.2"
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX ex: <http://example.org/>
SELECT ?statement ?person
WHERE { ?statement ex:statedBy ?person . FILTER (isTRIPLE(?statement)) }

虽然查询以语法方式公告了其版本,但 SPARQL 客户端决定使用 version=1.2 媒体类型发送直接 POST 请求;如果版本已经以语法方式公告, 这是允许的,但不是必需的。如下 HTTP 跟踪所示:

POST /sparql HTTP/1.1
Host: www.example
User-agent: sparql-client/0.1
Content-Type: application/sparql-query; version=1.2

UnencodedQuery

由于响应将包含 RDF 1.2 三元组项,服务器会以 version=1.2 媒体类型参数进行响应:

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; version=1.2

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

3.2 SPARQL 更新示例

3.2.1 使用 URL 编码参数的 UPDATE

下面展示了使用 URL 编码参数形式的一个示例请求的序列化,该请求被发送到 http://localhost:8888/test,用于查询 INSERT DATA { <a> <p> <b> }

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

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

3.2.2 直接使用 POST 的 UPDATE

更新请求可以作为带有 application/sparql-update Content-Type 的 POST 请求发送:

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

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

3.2.3 指定数据集并直接使用 POST 的 UPDATE

可以使用 using-graph-uriusing-named-graph-uri 参数为更新请求指定数据集。下面展示了发送到 http://localhost:8888/test、并指定默认图为 http://localhost:8888/people 的数据集的示例请求的序列化。

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

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

3.2.4 使用 URL 编码参数的多操作 UPDATE

一个请求中可以包含由 ';' (分号)分隔的一系列多个操作。下面展示了发送到 http://localhost:8888/test、用于以下查询的示例请求的序列化:

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

如下所示,使用 URL 编码参数形式。

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

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

3.2.5 指定数据集并使用 URL 编码 参数的多操作 UPDATE

使用 URL 编码参数 POST 更新请求时,数据集参数 using-graph-uriusing-named-graph-uri 会与 序列化请求一起在 POST 正文中指定。下面展示了发送到 http://localhost:8888/test、用于以下查询的示例请求的序列化:

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

并指定带有命名图 http://localhost:8888/alice/foaf.rdfhttp://localhost:8888/eve/foaf.rdf 的数据集,如下所示。

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

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

3.2.6 指定数据集并直接使用 POST 的多操作 UPDATE

下面展示了发送到 http://localhost:8888/test、并指定带有命名图 http://localhost:8888/alice/foaf.rdfhttp://localhost:8888/eve/foaf.rdf 的数据集的示例请求的序列化。

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

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

4. 政策考虑事项

4.1 安全

针对 SPARQL 协议服务,至少存在两种可能的拒绝服务攻击来源。 首先,约束不足的查询可能产生非常大量的结果,这 可能需要大量计算资源来处理、组装或返回。另一种可能 来源是包含非常复杂的 RDF 数据集描述的查询——复杂可能来自资源大小、 需要检索的资源数量,或大小与数量的组合—— 服务可能无法在不显著消耗资源的情况下组装这些描述, 包括带宽、CPU 或二级存储。在某些情况下,这类消耗实际上可能 构成拒绝服务攻击。SPARQL 协议服务 may 对 它检索的资源或外部资源被检索的速率施加 限制。针对 SPARQL 查询 处理服务,可能还存在其他拒绝服务攻击来源。

由于 SPARQL 协议服务可能代表其客户端向其他源服务器发出 HTTP 请求, 它可能被用作攻击其他站点或服务的载体。因此,SPARQL 协议服务实际上可能充当第三方客户端的代理。此类服务 may 对它们检索的资源或外部资源可被检索的速率施加 限制。SPARQL 协议服务 may 记录客户端请求, 以便于结合第三方源服务器或 服务对其进行追踪。

SPARQL 协议服务 may 选择检测这些以及其他代价高昂或以其他方式 不安全的查询,对查询施加时间或内存限制,或施加其他限制 以降低服务(以及其他服务)遭受拒绝服务攻击的脆弱性。它们也 may 拒绝处理此类查询 请求

SPARQL 协议服务可以通过更新操作移除、插入和更改底层数据。为了 防范恶意或破坏性更新,实现可以选择不 实现更新操作。或者,实现可以选择使用 HTTP 认证 机制或其他由实现定义的机制,以防止未经授权调用 更新操作。

不同的 IRI 可能具有相同的外观。不同文字中的字符可能看起来相似(西里尔字母 “о” 可能看起来类似于拉丁字母 “o”)。一个字符后跟组合 字符可能与另一个字符具有相同的视觉表示(LATIN SMALL LETTER E 后跟 COMBINING ACUTE ACCENT 与 LATIN SMALL LETTER E WITH ACUTE 具有相同的视觉表示)。SPARQL 用户必须注意使用与数据中的 IRI 匹配的 IRI 构造查询。关于相似字符匹配的更多信息可见于 Unicode 安全考虑事项国际化资源标识符 (IRI)第 8 节。

5. 一致性

除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。 本规范中的其他所有内容均为规范性内容。

本文档中的关键词 MAY 应按照 BCP 14 [RFC2119] [RFC8174] 中所述解释,当且仅当它如这里所示以全部 大写形式出现时。

5.1 一致性

SPARQL 1.2 协议(本文档)各部分的状态如下:

符合要求的 SPARQL 协议 服务

  1. must 按照本文档(“SPARQL 1.2 协议”)中描述的方式实现 query 操作或 update 操作中的任一个;
  2. may 同时实现 queryupdate 操作;
  3. must 符合 RFC2119 关键词 [RFC2119] 所指示、并在 4. 政策 考虑事项中描述的规范性约束。

A. SPARQL 1.1 协议和 SPARQL 1.2 协议之间的变更

本节为非规范性内容。

本规范扩展并更新了 2013 年 3 月的 SPARQL 1.1 协议。主要变更 包括:

B. SPARQL 1.0 协议和 SPARQL 1.1 协议之间的变更

本节为非规范性内容。

本规范扩展并更新了 2008 年 1 月的 RDF 用 SPARQL 协议。主要变更 包括:

C. 隐私考虑事项

TODO

D. 安全考虑事项

TODO

E. 国际化 考虑事项

TODO

F. 索引

F.1 本规范定义的术语

F.2 通过引用定义的术语

G. 参考文献

G.1 规范性参考文献

[RDF12-CONCEPTS]
RDF 1.2 概念与抽象数据 模型. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 2026 年 4 月 7 日。W3C 候选推荐标准。URL:https://www.w3.org/TR/rdf12-concepts/
[RFC2119]
用于 RFC 中表示 要求级别的关键词. S. Bradner. IETF. 1997 年 3 月。最佳当前实践。URL:https://www.rfc-editor.org/rfc/rfc2119
[RFC3986]
统一资源标识符(URI):通用 语法. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005 年 1 月。互联网 标准。URL:https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
国际化资源标识符 (IRI). M. Duerst; M. Suignard. IETF. 2005 年 1 月。提议标准。URL:https://www.rfc-editor.org/rfc/rfc3987
[RFC8174]
RFC 2119 关键词中大小写的歧义. B. Leiba. IETF. 2017 年 5 月。最佳当前实践。URL:https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTP 语义. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022 年 6 月。互联网标准。URL:https://httpwg.org/specs/rfc9110.html
[SPARQL12-GRAPH-STORE-PROTOCOL]
SPARQL 1.2 图存储 协议. Andy Seaborne; Thomas Pellissier Tanon. W3C. 2024 年 12 月 19 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-graph-store-protocol/
[SPARQL12-QUERY]
SPARQL 1.2 查询语言. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 4 月 23 日。 W3C 工作草案。URL:https://www.w3.org/TR/sparql12-query/
[SPARQL12-UPDATE]
SPARQL 1.2 更新. Ruben Taelman; Andy Seaborne; Thomas Pellissier Tanon. W3C. 2026 年 4 月 23 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-update/
[UTR36]
Unicode 安全 考虑事项. Mark Davis; Michel Suignard. Unicode Consortium. 2014 年 9 月 19 日。Unicode 技术报告 #36。URL:https://www.unicode.org/reports/tr36/tr36-15.html

G.2 资料性参考文献

[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 2020 年 7 月 16 日。W3C 推荐标准。URL:https://www.w3.org/TR/json-ld11/
[RDF12-N-TRIPLES]
RDF 1.2 N-Triples. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 4 月 24 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-n-triples/
[RDF12-TURTLE]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 2026 年 4 月 23 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-turtle/
[RDF12-XML]
RDF 1.2 XML 语法. Gregg Kellogg; Jerven Bolleman. W3C. 2026 年 4 月 9 日。W3C 工作草案。URL:https://www.w3.org/TR/rdf12-xml/
[SPARQL12-CONCEPTS]
SPARQL 1.2 概念. W3C RDF & SPARQL 工作组。W3C。W3C 编辑草案。URL:https://w3c.github.io/sparql-concepts/spec/
[SPARQL12-ENTAILMENT]
SPARQL 1.2 蕴涵机制. Peter Patel-Schneider. W3C. 2026 年 4 月 9 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-entailment/
[SPARQL12-FEDERATED-QUERY]
SPARQL 1.2 联合 查询. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作草案。 URL:https://www.w3.org/TR/sparql12-federated-query/
[SPARQL12-NEW]
SPARQL 1.2 新增内容. W3C RDF & SPARQL 工作组。W3C。W3C 编辑草案。URL:https://w3c.github.io/sparql-new/spec/
[SPARQL12-RESULTS-CSV-TSV]
SPARQL 1.2 查询结果 CSV 和 TSV 格式. Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-results-csv-tsv/
[SPARQL12-RESULTS-JSON]
SPARQL 1.2 查询结果 JSON 格式. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-results-json/
[SPARQL12-RESULTS-XML]
SPARQL 1.2 查询结果 XML 格式. Ruben Taelman; Dominik Tomaszuk; Thomas Pellissier Tanon. W3C. 2024 年 12 月 27 日。W3C 工作草案。URL:https://www.w3.org/TR/sparql12-results-xml/
[SPARQL12-SERVICE-DESCRIPTION]
SPARQL 1.2 服务 描述. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作 草案。URL:https://www.w3.org/TR/sparql12-service-description/