gremlin - 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
解决方案
您的第一次尝试:
choose(V().hasLabel("user"), V().hasLabel("user").drop())
没有你想的那么贵。的if
部分choose()
(即第一个子遍历)不会迭代所有用户。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()
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/then
orswitch
样式操作。使用 Gremlin,您无需检查是否存在某物即可将其删除,事实上,如前所述不这样做会更便宜。
推荐阅读
- java - 启动进程'命令'C:\Program Files\AdoptOpenJDK\jdk-11.0.6.10-hotspot\bin\java.exe''
- reactjs - React 新手:任何帮助将不胜感激
- websocket - 连接来自 Angular 项目的 Laravel 回声
- excel - 我可以从未打开的工作簿中提取特定数据,例如使用 VBA 的 v-lookup 吗?
- python - Django - 迭代时如何减少数据库查询
- angular - 在 Angular 应用程序中使用本机加密模块
- entity-framework - 将 efcore 迁移到 3.1 版时出错
- python - 如何在python中执行随机参数MC扫描?
- python - Flask 在端点上阻塞而不允许另一个端点调用
- python - Python:将 JSON 条目转换为 SQL 命令(按列和属性划分)