

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Amazon Neptune 中使用 SPARQL 1.1 图形存储 HTTP 协议 (GSP)
<a name="sparql-graph-store-protocol"></a>

在 [SPARQL 1.1 图形存储 HTTP 协议](https://www.w3.org/TR/sparql11-http-rdf-update/)建议中，W3C 定义了一种用于管理 RDF 图形的 HTTP 协议。它定义了用于删除、创建和替换 RDF 图形内容以及向现有内容添加 RDF 语句的操作。

图形存储协议 (GSP) 提供了一种无需编写复杂的 SPARQL 查询即可操作整个图形的便捷方式。

Neptune 完全支持该协议。

图形存储协议 (GSP) 的端点是：

```
https://{{your-neptune-cluster}}:{{port}}/sparql/gsp/
```

要使用 GSP 访问默认图形，请使用：

```
https://{{your-neptune-cluster}}:{{port}}/sparql/gsp/?default
```

要使用 GSP 访问命名图形，请使用：

```
https://{{your-neptune-cluster}}:{{port}}/sparql/gsp/?graph={{named-graph-URI}}
```

## Neptune GSP 实现的特别细节
<a name="sparql-graph-store-protocol-special"></a>

Neptune 完全实现了定义 GSP 的 [W3C 建议](https://www.w3.org/TR/sparql11-http-rdf-update/)。但是，此规范没有涵盖某些情况。

其中一种情况是，`PUT` 或 `POST` 请求在请求正文中指定了一个或多个命名图形，这些图形与由请求 URL 指定的图形不同。只有当请求正文 RDF 格式支持命名图形时，才会发生这种情况，例如使用 `Content-Type: application/n-quads` 或 `Content-Type: application/trig`。

在这种情况下，Neptune 会添加或更新正文中存在的所有命名图形，以及在 URL 中指定的命名图形。

例如，假设您从一个空数据库开始，您发送 `PUT` 请求将选票更新插入到三个图形中。其中一个图形名为 `urn:votes`，它包含所有选举年份的所有选票。另外两个名为 `urn:votes:2005` 和 `urn:votes:2019` 的图形包含特定选举年份的选票。请求及其有效负载如下所示：

```
PUT "http://{{your-Neptune-cluster}}:{{port}}/sparql/gsp/?graph=urn:votes"
  Host: example.com
  Content-Type: application/n-quads

  PAYLOAD:

  <urn:JohnDoe> <urn:votedFor> <urn:Labour> <urn:votes:2005>
  <urn:JohnDoe> <urn:votedFor> <urn:Conservative> <urn:votes:2019>
  <urn:JaneSmith> <urn:votedFor> <urn:LiberalDemocrats> <urn:votes:2005>
  <urn:JaneSmith> <urn:votedFor> <urn:Conservative> <urn:votes:2019>
```

请求执行后，数据库中的数据如下所示：

```
<urn:JohnDoe>   <urn:votedFor> <urn:Labour>           <urn:votes:2005>
<urn:JohnDoe>   <urn:votedFor> <urn:Conservative>     <urn:votes:2019>
<urn:JaneSmith> <urn:votedFor> <urn:LiberalDemocrats> <urn:votes:2005>
<urn:JaneSmith> <urn:votedFor> <urn:Conservative>     <urn:votes:2019>
<urn:JohnDoe>   <urn:votedFor> <urn:Labour>           <urn:votes>
<urn:JohnDoe>   <urn:votedFor> <urn:Conservative>     <urn:votes>
<urn:JaneSmith> <urn:votedFor> <urn:LiberalDemocrats> <urn:votes>
<urn:JaneSmith> <urn:votedFor> <urn:Conservative>     <urn:votes>
```

另一种模棱两可的情况是，使用 `PUT`、`POST`、`GET` 或 `DELETE` 中的任何一个操作在请求 URL 本身中指定多个图形。例如：

```
POST "http://{{your-Neptune-cluster}}:{{port}}/sparql/gsp/?graph=urn:votes:2005&graph=urn:votes:2019"
```

或：

```
GET "http://{{your-Neptune-cluster}}:{{port}}/sparql/gsp/?default&graph=urn:votes:2019"
```

在这种情况下，Neptune 返回 HTTP 400，并显示一条消息指示在请求 URL 中只能指定一个图形。