为何limit(1)无法删除单个Vertex?JanusGraph删除限制问题
JanusGraph-Java中限制Vertex删除操作的正确方式
测试场景问题分析
先梳理你测试的几种写法的核心问题:
drop().iterate():小数据量正常是因为iterate()触发了遍历执行,会删除所有匹配顶点,但大数据量下会因全表扫描引发性能问题。limit(1).drop():无效果是因为Gremlin遍历必须通过终端步骤(如iterate()、next())触发执行,仅构建遍历而不执行,不会产生任何修改。drop().limit(1):无效果原因有二,一是缺少终端步骤未触发执行;二是drop()返回Void类型结果,limit()作用于空结果集,无法限制删除数量。drop().limit(1).iterate():删除所有数据是因为drop()是修改类步骤,会先处理所有匹配顶点,后续的limit(1)因无输出结果可限制,无法起到作用。drop().iterate().limit(1):触发报错是因为iterate()是终端步骤,执行后遍历对象已锁定,无法再添加新的步骤(如limit())。
正确实现方式
要限制删除的顶点数量,必须在drop()之前使用limit()筛选目标顶点,再通过终端步骤iterate()触发执行。正确的遍历语句为:
g.V().limit(1).drop().iterate();
原理说明
Gremlin遍历按顺序执行:
g.V():获取所有顶点limit(1):筛选出第一个匹配的顶点drop():删除该顶点iterate():触发整个遍历的执行,完成修改操作
修正后的测试代码
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.janusgraph.core.JanusGraph; import org.janusgraph.core.JanusGraphFactory; import org.janusgraph.core.JanusGraphVertex; public class Test8 { private static final Logger logger = LogManager.getLogger(Test8.class); public static void main(String[] args) { JanusGraph janusGraph = JanusGraphFactory.build() .set("storage.backend", "cql") .set("storage.hostname", "localhost:29042") .open(); GraphTraversalSource g = janusGraph.traversal(); logger.info("初始顶点数: " + g.V().count().next()); createVertexes(janusGraph); logger.info("创建后顶点数: " + g.V().count().next()); // 正确的限制删除写法 g.V().limit(1).drop().iterate(); commitAndOpenJanusgraph(janusGraph); logger.info("删除1个顶点后数量: " + g.V().count().next()); janusGraph.close(); } private static void createVertexes(JanusGraph janusGraph) { JanusGraphVertex janusGraphVertex = janusGraph.addVertex(); janusGraphVertex.property("test", "test1"); janusGraphVertex = janusGraph.addVertex(); janusGraphVertex.property("test", "test2"); commitAndOpenJanusgraph(janusGraph); } private static void commitAndOpenJanusgraph(JanusGraph janusGraph) { janusGraph.tx().commit(); janusGraph.tx().open(); } }
运行效果
执行后会看到顶点数从2变为1,说明仅删除了1个顶点,符合预期。
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

