

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

# SPARQL 查詢引擎在 Neptune 的運作方式
<a name="sparql-explain-engine"></a>

若要使用 SPARQL `explain` 功能提供的資訊，您需要了解一些 Amazon Neptune SPARQL 查詢引擎運作方式的詳細資訊。

此引擎會將每個 SPARQL 查詢轉換為運算子管道。從第一個運算子開始，名為*繫結清單*的中繼解決方案將套用至此運算子管道。您可以將繫結清單視為資料表，其中資料表標頭是查詢中所用的部分變數。因此，資料表中的每一列代表評估時間點之前的結果。

假設系統已為我們的資料定義兩個命名空間前綴：

```
  @prefix ex:   <http://example.com> .
  @prefix foaf: <http://xmlns.com/foaf/0.1/> .
```

以下是此內容中簡單繫結清單的範例：

```
  ?person       | ?firstName
  ------------------------------------------------------
  ex:JaneDoe    | "Jane"
  ex:JohnDoe    | "John"
  ex:RichardRoe | "Richard"
```

對於三個人中的每一個人，清單會將 `?person` 變數繫結至該人員的識別符，且將 `?firstName` 變數繫結至該人員的名字。

一般情況下，變數可以維持在未繫結的狀態，例如，對於資料中不存在值的查詢中變數的 `OPTIONAL` 選項。

`PipelineJoin` 運算子是 `explain` 輸出中存在 Neptune 查詢引擎運算子的範例。它會將輸入做為上個運算子的傳入繫結集，並針對三重模式來進行聯結，也就是 `(?person, foaf:lastName, ?lastName)`。這個運算子會在此輸入串流使用 `?person` 變數的繫結，將這些繫結取代為三重模式，並從資料庫中查詢三元素。

當從上個資料表中在傳入繫結內容中執行時，`PipelineJoin` 會評估三個查詢，也就是下列項目：

```
  (ex:JaneDoe,    foaf:lastName, ?lastName)
  (ex:JohnDoe,    foaf:lastName, ?lastName)
  (ex:RichardRoe, foaf:lastName, ?lastName)
```

這種方法稱為 *as-bound* 評估。系統會根據傳入解決方案重新聯結這個評估程序的解決方案，並在傳入解決方案中填補偵測到的 `?lastName`。假設您找到所有三個人員的姓氏，運算子會產生一個傳出繫結清單，這會像下面這樣：

```
  ?person       | ?firstName | ?lastName
  ---------------------------------------
  ex:JaneDoe    | "Jane"     | "Doe"
  ex:JohnDoe    | "John"     | "Doe"
  ex:RichardRoe | "Richard"  | "Roe"
```

這個傳出繫結清單則做為輸入，供管道中下一個運算子使用。最後，管道中最後一個運算子的輸出會定義查詢結果。

運算子管道通常是線性的，這是因為每個運算子會為單一連線的運算子發出解決方案。不過，在某些情況下，他們可以擁有更為複雜的結構。例如，SPARQL 查詢中的 `UNION` 運算子會映射到 `Copy` 操作。這個操作會複製繫結並將副本轉送到兩個子計劃，一個用於 `UNION` 的左側而另一個用於右側。

如需運算子的詳細資訊，請參閱 [Neptune SPARQL `explain` 運算子](sparql-explain-operators.md)。