

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

# Neptune 中使用 `SERVICE` 扩展的 SPARQL 联合查询
<a name="sparql-service"></a>

Amazon Neptune 完全支持使用 `SERVICE` 关键字的 SPARQL 联合查询扩展。（有关更多信息，请参阅 [SPARQL 1.1 联合查询](https://www.w3.org/TR/sparql11-federated-query/)。）

`SERVICE` 关键字指示 SPARQL 查询引擎针对远程 SPARQL 终端节点执行查询的一部分，并组成最终查询结果。只能执行 `READ` 操作。不支持 `WRITE` 和 `DELETE` 操作。Neptune 只能对在其虚拟私有云 (VPC) 中可访问的 SPARQL 端点运行联合查询。但是，您也可以在 VPC 中使用反向代理使外部数据源在 VPC 内可供访问。

**注意**  
当使用 SPARQL `SERVICE` 将查询联合到同一 VPC 中的两个或更多 Neptune 集群时，必须将安全组配置为允许所有这些 Neptune 集群相互通信。

**重要**  
将查询和参数传递到外部 SPARQL 终端节点时，SPARQL 1.1 Federation 代表您发出服务请求。您负责验证外部 SPARQL 终端节点是否满足应用程序的数据处理和安全要求。

## Neptune 联合查询的示例
<a name="sparql-service-example-1"></a>

以下简单示例显示了如何使用 SPARQL 联合查询。

假设某位客户向 *Neptune-1*（位于 `http://neptune-1:8182/sparql`）发送了以下查询。

```
SELECT * WHERE {
   ?person rdf:type foaf:Person .
   SERVICE <http://neptune-2:8182/sparql> {
       ?person foaf:knows ?friend .
    }
}
```

1. *Neptune-1* 计算第一个查询模式 (*Q-1*)（即 `?person rdf:type foaf:Person`），使用结果在 *Q-2* (`?person foaf:knows ?friend`)中对 `?person` 求解，然后将生成的模式转发给 *Neptune-2*（位于 `http://neptune-2:8182/sparql`）。

1. *Neptune-2* 对 *Q-2* 进行计算，并将结果发送回 *Neptune-1*。

1. *Neptune-1* 联接两个模式的解，并将结果发回给客户。

下图显示了该流程。

![\[显示评估 SPARQL 联合查询模式并将响应发送回客户端的流程图。\]](http://docs.aws.amazon.com/zh_cn/neptune/latest/userguide/images/federated.png)


**注意**  
默认情况下，优化器决定在查询执行的哪个时刻执行 `SERVICE` 指令。您可以使用 [joinOrder](sparql-query-hints-joinOrder.md) 查询提示覆盖此位置。

## Neptune 中联合查询的访问控制
<a name="sparql-service-auth"></a>

Neptune 使用 AWS Identity and Access Management (IAM) 进行身份验证和授权。联合查询的访问控制可以涉及多个 Neptune 数据库实例。这些实例可能对访问控制有不同的要求。在某些情况下，这可能会限制您进行联合查询的能力。

请考虑上一节介绍的简单示例。*Neptune-1* 使用与调用它时相同的凭证调用 *Neptune-2*。
+ 如果 *Neptune-1* 需要 IAM 身份验证和授权，而 *Neptune-2* 不需要，那么只要您有适当的 IAM 权限就可以让 *Neptune-1* 进行联合查询。
+ 如果 *Neptune-1* 和 *Neptune-2* 都需要 IAM 身份验证和授权，则您需要为两个数据库都附加 IAM 权限才能进行联合查询。两个集群还必须位于同一个 AWS 账户和同一区域。目前不支持 and/or 跨区域跨账户联合查询架构。
+ 但是，在 *Neptune-1* 未启用 IAM 但 *Neptune-2* 启用 IAM 的情况下，您无法进行联合查询。原因是 *Neptune-1* 无法检索您的 IAM 凭证并将其传递给 *Neptune-2* 来授权执行查询的第二部分。