首页 > 解决方案 > gremlin fold()展开()抛出错误:“删除了 id 70 的顶点”和“传入的对象不可删除”

问题描述

此查询有效:

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() 展开()的替代方法?我试过了:

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

标签: gremlintinkerpopgremlin-server

解决方案


您的第一次尝试:

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

没有你想的那么贵。的if部分choose()(即第一个子遍历)不会迭代所有用户。true如果找到一个“用户” ,它会立即返回“。您的then子遍历将迭代所有“用户”顶点。此外,在这种情况下,您没有提供falsechoose(),我相信您最终会调用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()withoutchoose()会删除所有找到的“用户”顶点,或者如果没有找到,什么也不做。

对于此遍历:

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

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

我不完全确定,但根据您剩余的遍历示例,我认为您choose()通常可能会误用。您似乎不需要if/thenorswitch样式操作。使用 Gremlin,您无需检查是否存在某物即可将其删除,事实上,如前所述不这样做会更便宜。


推荐阅读