gremlin fold() unfold() 抛出错误:"Vertex with id 70 was removed" 和 "The incoming object is not removable"

gremlin fold() unfold() throwing errors: "Vertex with id 70 was removed" and "The incoming object is not removable"

此查询有效:

choose(V().hasLabel("user"), V().hasLabel("user").drop())

但是正在搜索顶点“用户”的2次,我想将其优化为1次,所以我将其更改为:

choose(V().hasLabel("user").fold(), unfold().drop())

如果我在查询中多次执行该技巧,它会抛出:

Error: ResponseError: Server error: Vertex with id 70 was removed. (500)

我不明白那是什么意思,也许 fold() 不会覆盖以前的 fold() 调用,我不知道。

对于这个用例,是否有替代 fold() unfold() 的方法?我试过:

choose(V().hasLabel("user").as("u"), select("u").drop())

但这不起作用,似乎 .as() 在内部调用时不保存任何内容 choose()

我也试过:

choose(V().hasLabel("user").store("u"), select("u").drop())

但是抛出另一个我不明白的错误:The incoming object is not removable

您的第一次尝试:

choose(V().hasLabel("user"), V().hasLabel("user").drop())

没有你想象的那么贵。 choose()if 部分(即第一个子遍历)不会迭代所有用户。如果找到一个“用户”,它会立即 returns true。您的 then 子遍历将迭代所有“用户”顶点。此外,您不提供 false 的值为 choose() 所以在那种情况下,我相信你最终会在两种情况下调用 drop() 遍历:

gremlin> g.inject(1).choose(V().hasLabel('no-exist'),constant(1))
==>1
gremlin> g.inject(1).choose(V().hasLabel('no-exist'),constant(1),constant(2))
==>2

当然,我想知道为什么你需要在这里做一个 if/then 因为调用 V().hasLabel("user").drop() 没有 choose() 会删除所有找到的“用户”顶点,或者如果none都找到了,什么都不做。

对于这次遍历:

choose(V().hasLabel("user").fold(), unfold().drop())

请注意,V().hasLabel("user").fold() 将始终 return“真”,因为您 fold() 这是一个减少步骤,它将 return List 中的项目流。如果流是空的,你会得到一个空的 List,因此 choose() 将在那里使用 true 路径。无论如何,您的 unfold() 不会展开从第一个 choose() 参数 return 编辑的内容 - 它会展开传递给 choose() 步骤的相同 Traverser 对象.你没有 choose() 之前的内容,所以我不能说那是什么。

我不完全确定,但根据您剩下的遍历示例,我认为您通常可能误用了 choose()。您似乎不需要 if/thenswitch 风格的操作。使用 Gremlin,您无需检查是否存在某些内容即可将其删除,而且如前所述,不这样做实际上更便宜。