

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 1.1 聯合會在將查詢和參數傳遞至外部 SPARQL 端點時，代您提出服務請求。您有責任驗證外部 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_tw/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* 不需要，則您只需要 *Neptune-1* 的適當 IAM 許可，即可進行聯合查詢。
+ 如果 *Neptune-1* 和 *Neptune-2* 都需要 IAM 身分驗證和授權，您需要連線兩個資料庫的 IAM 許可才能進行聯合查詢。兩個叢集也必須位於相同 AWS 帳戶和相同區域。目前不支援跨區域和/或跨帳戶聯合查詢架構。
+ 不過，在 *Neptune-1* 未啟用 IAM，但 *Neptune-2* 卻啟用它的情況下，您無法進行聯合查詢。原因是 *Neptune-1* 無法擷取您的 IAM 憑證，並將其傳遞至 *Neptune-2*，以授權查詢的第二個部分。