JanusGraph中vertex.edges()返回RelationConstructor而非Iterator<Edge>问题
JanusGraph vertex.edges() 返回 RelationConstructor 而非 Iterator 的问题解决
嘿,这个问题我之前做JanusGraph开发时也踩过坑,本质是JanusGraph的事务延迟优化和API调用时机的问题,给你梳理下原因和解决办法:
1. 核心原因:未提交事务的临时状态
JanusGraph为了提升写入性能,会把刚创建的边关系暂存在RelationConstructor中,直到事务提交才会持久化并生成可迭代的边对象。如果你在创建边后立刻调用vertex.edges(),此时事务还处于未提交状态,得到的就是这个暂存用的构造器,而非标准的Iterator<Edge>。
解决办法:先提交事务
在查询边之前,先执行事务提交操作,再调用edges()就能得到正常的迭代器了:
gremlin> person = graph.addVertex(label, 'person') ==>v[123] gremlin> address = graph.addVertex(label, 'address') ==>v[456] gremlin> person.addEdge('lives_at', address) ==>e[789][123-lives_at->456] gremlin> graph.tx().commit() # 提交事务 ==>null gremlin> person.edges() ==>e[789][123-lives_at->456] # 此时返回标准的边迭代器
2. Gremlin控制台的自动提交差异
你提到有时能正常返回ResultSetIterator,是因为Gremlin控制台默认有隐式自动提交机制:当你执行查询类语句时,会自动提交之前的写操作。但如果是连续执行写操作后立刻查询,控制台还没触发自动提交,就会出现返回RelationConstructor的情况。
更稳妥的控制台查询方式
改用Gremlin遍历语法查询,而非直接调用顶点的底层方法,这种方式会强制走规范的遍历流程:
gremlin> g.V(person).outE() ==>e[789][123-lives_at->456]
3. 推荐的API调用规范
JanusGraph顶点的edges()属于底层实现API,并不完全符合TinkerPop的通用API规范。更推荐使用标准的Gremlin遍历语法来查询边,比如:
- 查询顶点的所有出边:
g.V(vertexId).outE() - 查询顶点的所有入边:
g.V(vertexId).inE() - 查询顶点的所有边:
g.V(vertexId).bothE()
这种方式不仅能保证返回标准的Iterator<Edge>,还能兼容其他TinkerPop兼容的图数据库,代码的可移植性更强。
内容的提问来源于stack exchange,提问作者Tharaka
相关产品推荐
相关产品推荐

