

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

# Neptune SPARQL `explain` 運算子
<a name="sparql-explain-operators"></a>

以下各節描述目前 Amazon Neptune 中可用的 SPARQL `explain` 功能運算子和參數。

**重要**  
SPARQL `explain` 功能仍在進行改善，這裡記載的運算子和參數在未來的版本中可能會加以變更。

**Topics**
+ [`Aggregation`運算子](#sparql-explain-operator-aggregation)
+ [`ConditionalRouting`運算子](#sparql-explain-operator-conditional-routing)
+ [`Copy`運算子](#sparql-explain-operator-copy)
+ [`DFENode`運算子](#sparql-explain-operator-dfenode)
+ [`Distinct`運算子](#sparql-explain-operator-distinct)
+ [`Federation`運算子](#sparql-explain-operator-federation)
+ [`Filter`運算子](#sparql-explain-operator-filter)
+ [`HashIndexBuild`運算子](#sparql-explain-operator-hash-index-build)
+ [`HashIndexJoin`運算子](#sparql-explain-operator-hash-index-join)
+ [`MergeJoin`運算子](#sparql-explain-operator-merge-join)
+ [`NamedSubquery`運算子](#sparql-explain-operator-named-subquery)
+ [`PipelineJoin`運算子](#sparql-explain-operator-pipeline-join)
+ [`PipelineCountJoin`運算子](#sparql-explain-operator-pipeline-count-join)
+ [`PipelinedHashIndexJoin`運算子](#sparql-explain-operator-pipeline-hash-index-join)
+ [`Projection`運算子](#sparql-explain-operator-projection)
+ [`PropertyPath`運算子](#sparql-explain-operator-property-path)
+ [`TermResolution`運算子](#sparql-explain-operator-term-resolution)
+ [`Slice`運算子](#sparql-explain-operator-slice)
+ [`SolutionInjection`運算子](#sparql-explain-operator-solution-injection)
+ [`Sort`運算子](#sparql-explain-operator-sort)
+ [`VariableAlignment`運算子](#sparql-explain-operator-variable-alignment)

## `Aggregation`運算子
<a name="sparql-explain-operator-aggregation"></a>

該運算子會執行一個或多個彙總，以實作 `count`、`max`、`min`、`sum` 等 SPARQL 彙總運算子的語意。

`Aggregation` 附帶使用 `groupBy` 子句的選用分組，以及選用的 `having` 限制。

**引數**
+ `groupBy` – (*選用*) 提供的 `groupBy` 子句會根據分組的傳入解決方案來指定運算式序列。
+ `aggregates` – (*必要*) 指定彙總運算式的排序清單。
+ `having` – (*選用*) 會按照 SPARQL 查詢中 `having` 子句的指示，將限制新增至群組中的篩選條件。

## `ConditionalRouting`運算子
<a name="sparql-explain-operator-conditional-routing"></a>

該運算子會根據指定的條件路由傳入解決方案。符合該條件的解決方案會路由至 `Out #1` 所參考的運算子 ID，而不符合條件的解決方案則會路由至 `Out #2` 參考的運算子。

**引數**
+ `condition` – (*必要*) 路由條件。

## `Copy`運算子
<a name="sparql-explain-operator-copy"></a>

該運算子會依指定模式的規定來委派解決方案串流。

**模式**
+ `forward` – 將解決方案轉送至 `Out #1` 識別的下游運算子。
+ `duplicate` – 複製解決方案並將其分別轉送至 `Out #1` 和 `Out #2` 識別的兩個運算子。

`Copy` 並沒有任何引數。

## `DFENode`運算子
<a name="sparql-explain-operator-dfenode"></a>

這個運算子是 DFE 替代查詢引擎所執行之計畫的抽象。詳細的 DFE 計畫會在此運算子的引數中加以概述。引數目前已過載，以包含 DFE 計畫的詳細執行期統計資料。它包含按 DFE 查詢執行的各個步驟所花費的時間。

DFE 查詢計畫的邏輯最佳化抽象語法樹 (AST) 會與規劃時所考慮之運算子類型的相關資訊，以及要執行運算子的相關聯最佳和最差成本一起列印。AST 目前由以下類型的節點組成：
+ `DFEJoinGroupNode` – 代表一個或多個 `DFEPatternNodes` 的聯結。
+ `DFEPatternNode` – 使用從基礎資料庫中投影出來的相符元組封裝基礎模式。

子區段 `Statistics & Operator histogram` 包含有關 `DataflowOp` 計畫執行時間，以及每個運算子所使用之 CPU 時間明細的詳細資訊。這個子區段下面有一個資料表，其會列印 DFE 所執行之計畫的詳細執行期統計資料。

**注意**  
由於對 SPARQL 的 DFE 支援是一項實驗性功能，其`explain`輸出的確切格式可能會變更。

## `Distinct`運算子
<a name="sparql-explain-operator-distinct"></a>

該運算子會運算變數子集上不同的投影，藉此消除重複項目。因此，流入的解決方案數量會大於或等於流出的解決方案數量。

**引數**
+ `vars` – (*必要*) 要套用 `Distinct` 投影的變數。

## `Federation`運算子
<a name="sparql-explain-operator-federation"></a>

將指定的查詢傳遞至指定的遠端 SPARQL 端點。

**引數**
+ `endpoint` – (*必要*) SPARQL `SERVICE` 陳述式中的端點 URL。這可以是常數字串，或者如果查詢端點是根據相同查詢中的變數來決定，則它可以是變數名稱。
+ `query` – (*必要*) 要傳送至遠端端點的重建查詢字串。即使用戶端未指定任何字首，引擎也會將預設字首新增至此查詢。
+ `silent` – (*必要*) 布林值，指出 `SILENT` 關鍵字是否出現在此關鍵字之後。`SILENT` 會告知引擎，即使遠端 `SERVICE` 部分失敗，也不要讓整個查詢失敗。

## `Filter`運算子
<a name="sparql-explain-operator-filter"></a>

該運算子會篩選傳入的解決方案。唯有符合篩選條件的解決方案可轉送至上游運算子，其他所有解決方案則會遭到捨棄。

**引數**
+ `condition` – (*必要*) 篩選條件。

## `HashIndexBuild`運算子
<a name="sparql-explain-operator-hash-index-build"></a>

該運算子會接受繫結清單並將其多工緩衝處理至雜湊索引，該雜湊索引的名稱是由 `solutionSet` 引數所定義。後續的運算子通常會對這個解決方案集執行聯結操作，再用該名稱指向解決方案集。

**引數**
+ `solutionSet` – (*必要*) 雜湊索引解決方案集的名稱。
+ `sourceType` – (*必要*) 所取得雜湊索引中存放繫結的來源類型：
  + `pipeline` – 將運算子管道中來自下游運算子的傳入解決方案多工緩衝處理至雜湊索引。
  + `binding set` – 將 `sourceBindingSet` 引數指定的固定繫結集多工緩衝處理至雜湊索引。
+ `sourceBindingSet` – (*選用*) 如果 `sourceType` 引數值為 `binding set`，則此引數會指定將靜態繫結集多工緩衝處理至雜湊索引。

## `HashIndexJoin`運算子
<a name="sparql-explain-operator-hash-index-join"></a>

該運算子會對 `solutionSet` 引數辨識的雜湊索引解決方案集執行傳入解決方案聯結操作。

**引數**
+ `solutionSet` – (*必要*) 要據以聯結的解決方案集名稱。這必須是在先前步驟中使用 `HashIndexBuild` 運算子建構的雜湊索引解決方案。
+ `joinType` – (*必要*) 要執行的聯結類型：
  + `join` – 一般聯結，所有共用變數間需要有完全相符的項目。
  + `optional` – `optional` 聯結，其會使用 SPARQL `OPTIONAL` 運算子語義。
  + `minus` – `minus` 操作會使用 SPARQL `MINUS` 運算子語義來保留沒有任何聯結夥伴的映射。
  + `existence check` – 檢查是否有聯結夥伴，並將 `existenceCheckResultVar` 變數繫結至檢查結果。
+ `constraints` – (*選用*) 進行聯結時所考量的其他聯結限制。不符合這些限制的聯結皆會予以捨棄。
+ `existenceCheckResultVar` – (*選用*) 只能用在 `joinType` 等於 `existence check` 的聯結 (請參閱先前提及的 `joinType` 引數)。

## `MergeJoin`運算子
<a name="sparql-explain-operator-merge-join"></a>

該運算子會對 `solutionSets` 辨識的多個解決方案集執行合併聯結。

**引數**
+ `solutionSets` – (*必要*) 要互相聯結的解決方案集。

## `NamedSubquery`運算子
<a name="sparql-explain-operator-named-subquery"></a>

該運算子會針對 `subQuery` 引數識別的子查詢觸發評估作業，並將結果多工緩衝處理至 `solutionSet` 引數指定的解決方案集。運算子的傳入解決方案會轉送至該子查詢，接著轉送至下一個運算子。

**引數**
+ `subQuery` – (*必要*) 要評估的子查詢名稱；輸出中會明確呈現該子查詢。
+ `solutionSet` – (*必要*) 用來儲存子查詢結果的解決方案集名稱。

## `PipelineJoin`運算子
<a name="sparql-explain-operator-pipeline-join"></a>

該運算子會接收先前運算子的輸出做為輸入，並將其聯結至 `pattern` 引數定義的元組模式。

**引數**
+ `pattern` – (*必要*) 這個模式會採用 subject-predicate-object 三元組格式，並選擇性地使用做為聯結基礎的圖形元組。如果 `distinct` 為指定的模式值，則聯結僅會從 `projectionVars` 引數指定的投影變數中擷取不同解決方案，而不是所有相符的解決方案。
+ `inlineFilters` – (*選用*) 要套用至模式中變數的一組篩選條件。系統會一併評估模式與這些篩選條件。
+ `joinType` – (*必要*) 要執行的聯結類型：
  + `join` – 一般聯結，所有共用變數間需要有完全相符的項目。
  + `optional` – `optional` 聯結，其會使用 SPARQL `OPTIONAL` 運算子語義。
  + `minus` – `minus` 操作會使用 SPARQL `MINUS` 運算子語義來保留沒有任何聯結夥伴的映射。
  + `existence check` – 檢查是否有聯結夥伴，並將 `existenceCheckResultVar` 變數繫結至檢查結果。
+ `constraints` – (*選用*) 進行聯結時所考量的其他聯結限制。不符合這些限制的聯結皆會予以捨棄。
+ `projectionVars` – (*選用*) 投影變數。此引數需與 `distinct := true` 結合使用，以在指定的一組變數內強制擷取不同投影。
+ `cutoffLimit` – (*選用*) 擷取的聯結夥伴數量截止限制。雖然沒有任何預設限制，但您可以在執行聯結操作時將此引數設為 1 以實作 `FILTER (NOT) EXISTS` 子句，其足以證明或駁斥聯結夥伴的存在。

## `PipelineCountJoin`運算子
<a name="sparql-explain-operator-pipeline-count-join"></a>

該運算子為 `PipelineJoin` 的變體；其不會執行聯結操作，而是計算相符的聯合夥伴數量，並將計數繫結至 `countVar` 引數指定的變數。

**引數**
+ `countVar` – (*必要*) 應繫結計數結果 (即聯結夥伴數量) 的變數。
+ `pattern` – (*必要*) 這個模式會採用 subject-predicate-object 三元組格式，並選擇性地使用做為聯結基礎的圖形元組。如果 `distinct` 為指定的模式值，則聯結僅會從 `projectionVars` 引數指定的投影變數中擷取不同解決方案，而不是所有相符的解決方案。
+ `inlineFilters` – (*選用*) 要套用至模式中變數的一組篩選條件。系統會一併評估模式與這些篩選條件。
+ `joinType` – (*必要*) 要執行的聯結類型：
  + `join` – 一般聯結，所有共用變數間需要有完全相符的項目。
  + `optional` – `optional` 聯結，其會使用 SPARQL `OPTIONAL` 運算子語義。
  + `minus` – `minus` 操作會使用 SPARQL `MINUS` 運算子語義來保留沒有任何聯結夥伴的映射。
  + `existence check` – 檢查是否有聯結夥伴，並將 `existenceCheckResultVar` 變數繫結至檢查結果。
+ `constraints` – (*選用*) 進行聯結時所考量的其他聯結限制。不符合這些限制的聯結皆會予以捨棄。
+ `projectionVars` – (*選用*) 投影變數。此引數需與 `distinct := true` 結合使用，以在指定的一組變數內強制擷取不同投影。
+ `cutoffLimit` – (*選用*) 擷取的聯結夥伴數量截止限制。雖然沒有任何預設限制，但您可以在執行聯結操作時將此引數設為 1 以實作 `FILTER (NOT) EXISTS` 子句，其足以證明或駁斥聯結夥伴的存在。

## `PipelinedHashIndexJoin`運算子
<a name="sparql-explain-operator-pipeline-hash-index-join"></a>

這是一體化的建置雜湊索引和聯結運算子。它會取得繫結清單、將它們多工緩衝處理至雜湊索引，然後針對雜湊索引聯結傳入的解決方案。

**引數**
+ `sourceType` – (*必要*) 所取得雜湊索引中儲存繫結的來源類型：
  + `pipeline` – 導致 `PipelinedHashIndexJoin` 將運算子管道中來自下游運算子的傳入解決方案多工緩衝處理至雜湊索引。
  + `binding set` – 導致 `PipelinedHashIndexJoin` 將 `sourceBindingSet` 引數指定的固定繫結集多工緩衝處理至雜湊索引。
+ `sourceSubQuery ` – (*選用*) 如果 `sourceType` 引數值為 `pipeline`，此引數會指定進行評估並多工緩衝處理至雜湊索引的子查詢。
+ `sourceBindingSet ` – (*選用*) 如果 `sourceType` 引數值為 `binding set`，則此引數會指定將靜態繫結集多工緩衝處理至雜湊索引。
+ `joinType` – (*必要*) 要執行的聯結類型：
  + `join` – 一般聯結，所有共用變數間需要有完全相符的項目。
  + `optional` – `optional` 聯結，其會使用 SPARQL `OPTIONAL` 運算子語義。
  + `minus` – `minus` 操作會使用 SPARQL `MINUS` 運算子語義來保留沒有任何聯結夥伴的映射。
  + `existence check` – 檢查是否有聯結夥伴，並將 `existenceCheckResultVar` 變數繫結至檢查結果。
+ `existenceCheckResultVar` – (*選用*) 只會用於 `joinType` 等於 `existence check` 的聯結 (請參閱上述的 joinType 引數)。

## `Projection`運算子
<a name="sparql-explain-operator-projection"></a>

該運算子會在變數子集上進行投影。流入的解決方案數量會等同於流出的解決方案數量，但解決方案的圖形會因模式設定而異。

**模式**
+ `retain` – 僅在解決方案中保留由 `vars` 引數指定的變數。
+ `drop` – 捨棄由 `vars` 引數指定的所有變數。

**引數**
+ `vars` – (*必要*) 要保留或捨棄的變數，取決於模式設定。

## `PropertyPath`運算子
<a name="sparql-explain-operator-property-path"></a>

啟用遞迴屬性路徑，例如 `+` 或 `*`。Neptune 根據 `iterationTemplate` 引數指定的範本實作固定點迭代方法。系統會針對每個固定點反覆運算項目將已知的左側或右側變數繫結至範本，直到找不到任何新的解決方案為止。

**引數**
+ `iterationTemplate` – (*必要*) 用來實作固定點迭代的子查詢範本名稱。
+ `leftTerm` – (*必要*) 位於屬性路徑左側的字詞 (變數或常值)。
+ `rightTerm` – (*必要*) 位於屬性路徑右側的字詞 (變數或常值)。
+ `lowerBound` – (*必要*) 固定點迭代的下限 (適用於 `*` 查詢的 `0`，或適用於 `+` 查詢的 `1`)。

## `TermResolution`運算子
<a name="sparql-explain-operator-term-resolution"></a>

該運算子會將內部字串識別符值轉換為各自對應的外部字串，或將外部字串轉換為內部字串識別符值，視模式而定。

**模式**
+ `value2id` – 將常值和 URI 等字詞映射至對應的內部 ID 值 (內部值編碼)。
+ `id2value` – 將內部 ID 值映射至對應的常值和 URI 等字詞 (內部值解碼)。

**引數**
+ `vars` – (*必要*) 指定字串或內部字串 ID 需進行映射的變數。

## `Slice`運算子
<a name="sparql-explain-operator-slice"></a>

該運算子會使用 SPARQL `LIMIT` 和 `OFFSET` 子句的語意，在傳入解決方案串流上實作配量。

**引數**
+ `limit` – (*選用*) 對要轉送之解決方案的限制。
+ `offset` – (*選用*) 評估解決方案以進行轉送的偏移量。

## `SolutionInjection`運算子
<a name="sparql-explain-operator-solution-injection"></a>

該運算子不會接收任何輸入，其會將靜態解決方案插入查詢計劃，並在 `solutions` 引數中加以記錄。

查詢計劃一律會從插入的靜態項目開始執行。如果可以結合各種來源的靜態繫結，進而從查詢本身衍生取得 (例如從 `VALUES` 或 `BIND` 子句) 要插入的靜態解決方案，則 `SolutionInjection` 運算子就會插入這些衍生的靜態解決方案。在最簡單的情況下，這會反映出外部 `VALUES` 子句所指示的繫結。

如果不能自查詢衍生取得任何靜態解決方案，`SolutionInjection` 就會插入空白的解決方案，也就是所謂的通用解決方案。在整個查詢評估過程中，系統會擴展並倍增這個解決方案。

**引數**
+ `solutions` – (*必要*) 運算子插入的解決方案序列。

## `Sort`運算子
<a name="sparql-explain-operator-sort"></a>

該運算子會使用指定排序條件來排列解決方案集。

**引數**
+ `sortOrder` – (*必要*) 變數的排序清單，各包含 `ASC` (遞增) 或 `DESC` (遞減) 識別符，其會按照順序來排列解決方案集。

## `VariableAlignment`運算子
<a name="sparql-explain-operator-variable-alignment"></a>

該運算子會逐一檢查所有解決方案，並針對其中的兩個變數執行校準作業。此處的變數指的是指定的 `sourceVar` 值和指定的 `targetVar` 值。

如果解決方案中的 `sourceVar` 和 `targetVar` 值相同，系統就會將該變數視為已經過校準並轉送解決方案，然後投射出多餘的 `sourceVar`。

若變數繫結至不同值，解決方案就會完全遭到排除。

**引數**
+ `sourceVar` – (*必要*) 要與目標變數相比的來源變數。若在解決方案中成功完成校準，表示兩個變數擁有相同值，且系統會投射出來源變數。
+ `targetVar` – (*必要*) 與來源變數相比的目標變數。即使校準成功，該值仍會保留不變。