

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

# `使用服务扩展在 Neptune 中使用 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 联合查询。

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

```
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*at。`http://neptune-2:8182/sparql`

1. *Neptune-2*评估结果*Q-2*并将结果发送回给。*Neptune-1*

1. *Neptune-1*加入两种模式的解决方案，并将结果发送回给客户。

下图显示了该流程。

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


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

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

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

考虑上一节中介绍的简单示例。 *Neptune-1*Neptune-2**使用与调用时相同的凭据进行呼叫。
+ 如果*Neptune-1*需要 IAM 身份验证和授权，但*Neptune-2*不需要，则您只需要相应的 IAM 权限*Neptune-1*即可进行联合查询。
+ 如果*Neptune-1*Neptune-2**两者都需要 IAM 身份验证和授权，则需要为两个数据库附加 IAM 权限才能进行联合查询。两个集群还必须位于同一个 Amazon 账户和同一区域。 Cross-region and/or 目前不支持跨账户联合查询架构。
+ 但是，如果*Neptune-1*不是 IAM-enabled 而是*Neptune-2*是，则无法进行联合查询。原因是*Neptune-1*无法检索您的 IAM 凭证并将其传递*Neptune-2*给以授权查询的第二部分。