

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

# `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` 查询提示和相关优化编写的查询。

在此示例中，假定数据集具有以下特征：
+ 它包含 1000 个标记有 `: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 查询引擎的方法旨在使用以下步骤计算此查询：
+ 提取图形中的所有 1000 个 `connectedTo` 边缘。
+ 扩展 100 倍（component2 中的传出 `connectedTo` 边缘的数量）。

  中间结果：100000 个节点。
+ 扩展 100 倍（component3 中传出 `connectedTo` 边缘的数量）。

  中间结果：10000000 个节点。
+ 扫描 10000000 个节点以查找循环关闭。

这将产生一个流式处理查询计划，此计划具有固定数量的主内存。

**查询提示和子查询**  
您可能希望权衡主内存空间以加速计算。通过使用 `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` 提示不是按顺序计算三元组模式，而是使这两个子查询被单独计算。这两个子查询将为中间结果生成 100000 个节点，之后它们将互联以形成最终输出。

具体而言，当您在较大的实例类型上运行 Neptune 时，将这两个 100000 子集临时存储在主内存中会增加内存占用量，从而显著加快计算速度。