

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

# Gremlin repeatMode 查询提示
<a name="gremlin-query-hints-repeatMode"></a>

Neptune `repeatMode` 查询提示指定 Neptune 引擎计算 Gremlin 遍历中的 `repeat()` 步骤的方式：广度优先、深度优先或分块深度优先。

在使用 `repeat()` 步骤查找或跟踪路径时，该步骤的计算模式非常重要，而不只是将步骤重复有限次数。

## 语法
<a name="gremlin-query-hints-repeatMode-syntax"></a>

通过向查询添加 `withSideEffect` 步骤来指定 `repeatMode` 查询提示。

```
g.withSideEffect('Neptune#repeatMode', 'mode').gremlin-traversal
```

**注意**  
所有 Gremlin 查询提示副作用的前缀为 `Neptune#`。

**可用模式**
+ `BFS`

  广度优先搜索

  `repeat()` 步骤的默认执行模式。这将在沿路径深入之前获取所有同级节点。

  此版本为内存密集型的，边界可以非常大。查询将耗尽内存并被 Neptune 引擎取消的风险更高。这与其他 Gremlin 实施最匹配。
+ `DFS`

  深度优先搜索

  在继续下一个解之前，跟踪每条路径至最大深度。

  这将使用更少的内存。在类似从多个跃点外的起点查找单一路径这样的情况下，它可提供更好的性能。
+ `CHUNKED_DFS`

  分块深度优先搜索

  一种混合方式，它在 1000 个节点（既不是 1 个节点 (`DFS`) ，也不是所有节点 (`BFS)`) ）组成的区块中，以深度优先方式搜索图形。

  Neptune 引擎将在每个级别获得多达 1000 个节点，然后更深入地跟踪该路径。

  这是一种速度和内存使用率之间的平衡方法。

  如果您要使用 `BFS`，但查询占用的内存太多，这也会很有用。



## 示例
<a name="gremlin-query-hints-repeatMode-example"></a>

以下各节介绍了重复模式对 Gremlin 遍历的影响。

在 Neptune 中，`repeat()` 步骤的默认模式是对所有遍历实施广度优先 (`BFS`) 执行策略。

在大多数情况下， TinkerGraph 实现使用相同的执行策略，但在某些情况下，它会改变遍历的执行。

例如， TinkerGraph 实现修改了以下查询。

```
g.V("3").repeat(out()).times(10).limit(1).path()
```

此遍历中的 `repeat()` 步骤将“展开”到以下遍历，这将导致执行深度优先 (`DFS`) 策略。

```
g.V(<id>).out().out().out().out().out().out().out().out().out().out().limit(1).path()
```

**重要**  
Neptune 查询引擎不会自动执行此操作。

广度优先 (`BFS`) 是默认的执行策略，与大多数 TinkerGraph 情况下的执行策略类似。但是，在特定情况下会优先选择深度优先 (`DFS`) 策略。

 

**BFS（默认）**  
广度优先 (BFS) 是 `repeat()` 运算符的默认执行策略。

```
g.V("3").repeat(out()).times(10).limit(1).path()
```

Neptune 引擎将完全探索前九个跃点边界，然后再向外扩展十个跃点查找解。这在许多情况（如最短路径查询）下很有效率。

但是，对于上述示例，遍历使用 `repeat()` 运算符的深度优先 (`DFS`) 模式将快得多。

**DFS**  
以下查询使用 `repeat()` 运算符的深度优先 (`DFS`) 模式。

```
g.withSideEffect("Neptune#repeatMode", "DFS").V("3").repeat(out()).times(10).limit(1)
```

在探索下一个解之前，这将跟踪每个单独的解，直至最大深度。