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/then
或 switch
风格的操作。使用 Gremlin,您无需检查是否存在某些内容即可将其删除,而且如前所述,不这样做实际上更便宜。
此查询有效:
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/then
或 switch
风格的操作。使用 Gremlin,您无需检查是否存在某些内容即可将其删除,而且如前所述,不这样做实际上更便宜。