本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Gremlin 查询提示 repeatMode
Neptune repeatMode
查询提示指定 Neptune 引擎计算 Gremlin 遍历中的 repeat()
步骤的方式:广度优先、深度优先或分块深度优先。
在使用 repeat()
步骤查找或跟踪路径时,该步骤的计算模式非常重要,而不只是将步骤重复有限次数。
语法
通过向查询添加 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
,但查询占用的内存太多,这也会很有用。
示例
以下各节介绍了重复模式对 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)
在探索下一个解之前,这将跟踪每个单独的解,直至最大深度。