为什么这个 Gremlin 遍历返回空?

问题描述

我有一个带有设置值属性 emailsphones 的 Gremlin 顶点。作为更新逻辑的一部分,我试图删除并重新创建这些属性

String key = ThreadLocalRandom.current().nextInt()
def dropped = vtx.as(key).properties('emails','phones').drop().<Vertex>select(key)

我的期望是顶点会被as标记,然后我遍历属性删除它们,然后使用select返回顶点进行进一步处理。但是,执行此操作始终会导致空遍历。

我已经能够让遍历返回结果,而是说

def dropped = vtx.sideEffect(__.properties('emails','phones').drop())

但我想确保在继续之前严格删除这些属性,然后我会继续重新插入它们。

为什么原始遍历的行为不像我预期的那样?对于 sideEffect 版本,我是否需要添加 barrier() 以确保正确性,如果是这样,就足够了吗?

解决方法

请注意,drop() 是一个过滤步骤,因此它不会产生遍历器。进入它的所有内容都从流中删除。这样,您的 select() 永远不会被调用。您可以使用 profile() 看到这一点:

gremlin> g.V().as('a').drop().select('a').profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkerGraphStep(vertex,[])@[a]                                       808         808           1.922    19.04
DropStep                                                                                       8.138    80.60
SelectOneStep(last,a)                                                                          0.010     0.10
NoOpBarrierStep(2500)                                                                          0.026     0.26
                                            >TOTAL                     -           -          10.097        -

您使用 sideEffect() 的方法是做您想做的事情的正确方法。副作用遍历应该在继续之前迭代到完成,因此我希望在 sideEffect() 步骤完成时删除所有属性以供遍历器通过。