问题描述
我有一个带有设置值属性 emails
和 phones
的 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()
步骤完成时删除所有属性以供遍历器通过。