

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

# `evaluationStrategy` SPARQL 查詢提示
<a name="sparql-query-hints-evaluationStrategy"></a>

`evaluationStrategy` 查詢提示會告訴 Amazon Neptune 查詢引擎，應該將標註的查詢片段當做獨立單位由下而上評估。這表示之前評估步驟的解決方案不會用來計算查詢片段。查詢片段被當做獨立單位而評估，其生成的解決方案在計算後與查詢的其餘部分聯結。

使用 `evaluationStrategy` 查詢提示暗示區塊化 (非管道化的) 查詢計畫，這意味著使用查詢提示標註的片段解決方案，在主記憶體中會具體化和緩衝。使用此查詢提示可能會大幅增加評估查詢所需的主記憶體，尤其是在標註的查詢片段計算大量結果時。

## `evaluationStrategy` SPARQL 提示語法
<a name="sparql-query-hints-evaluationStrategy-syntax"></a>

`evaluationStrategy` 查詢提示是以三重模式指定，該模式包含在 SPARQL 查詢中。

為更清楚起見，以下語法使用已定義並包含在查詢中的 `hint` 字首，指定 Neptune 查詢提示命名空間：

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
hint:SubQuery hint:evaluationStrategy "BottomUp" .
```

**可用範圍**
+ `hint:SubQuery`

**注意**  
只有巢狀子查詢支援此查詢提示。

如需更多查詢提示範圍的詳細資訊，請參閱 [Neptune 中的 SPARQL 查詢提示範圍](sparql-query-hints.md#sparql-query-hints-scope)。

## `evaluationStrategy` SPARQL 提示範例
<a name="sparql-query-hints-evaluationStrategy-example"></a>



本節示範使用和不使用 `evaluationStrategy` 查詢提示編寫的查詢以及相關的最佳化。

此範例假設資料集有下列特性：
+ 包含 1,000 個有標記 `:connectedTo` 的邊緣。
+ 每個 `component` 節點平均連接到 100 個其他 `component` 節點。
+ 節點之間四躍點循環連接的數量通常是大約 100 個。

典型的範例是，`evaluationStrategy` 提示有助於最佳化包含循環的查詢模式。

**無查詢提示**  
以下 SPARQL 查詢會擷取透過四個躍點彼此循環連接的所有 `component` 節點：

```
PREFIX : <https://example.com/>
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
  ?component1 :connectedTo ?component2 .
  ?component2 :connectedTo ?component3 .
  ?component3 :connectedTo ?component4 .
  ?component4 :connectedTo ?component1 .
}
```

Neptune 查詢引擎的做法是使用以下步驟評估此查詢：
+ 擷取圖中的全部 `connectedTo` 邊緣，共 1,000 個。
+ 擴大 100 倍 (從 component2 傳出的 `connectedTo` 邊緣數量)。

  中間結果：100,000 個節點。
+ 擴大 100 倍 (從 component3 傳出的 `connectedTo` 邊緣數量)。

  中間結果：10,000,000 個節點。
+ 掃描 10,000,000 個節點的循環結束。

這會得到串流查詢計畫，其主記憶體為不變數量。

**查詢提示和子查詢**  
您可能想要犧牲主記憶體空間換取加速運算。使用 `evaluationStrategy` 查詢提示重寫查詢，您可以強制引擎計算兩個較小、具體化子集的聯結。

```
PREFIX : <https://example.com/>
          PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
  {
    SELECT * WHERE {
      hint:SubQuery hint:evaluationStrategy "BottomUp" .
      ?component1 :connectedTo ?component2 .
      ?component2 :connectedTo ?component3 .
    }
  }
  {
    SELECT * WHERE {
      hint:SubQuery hint:evaluationStrategy "BottomUp" .
      ?component3 :connectedTo ?component4 .
      ?component4 :connectedTo ?component1 .
    }
  }
}
```

相較於反覆使用先前三重模式的結果做為即將發生模式的輸入時評估序列中的三重模式，`evaluationStrategy` 提示會使得兩個子查詢被獨立評估。兩種子查詢的中繼結果都是產生 100,000 個節點，然後聯結在一起形成最終輸出。

特別是，當您在較大的執行個體類型上執行 Neptune 時，將這兩個 100,000 子集臨時儲存在主記憶體中，會增加記憶體使用量，進而大幅加快評估速度。