Gremlin.Net操作JanusGraph新增/更新顶点属性不生效如何解决?
问题根因
你遇到的问题核心是复用了同一个GraphTraversal实例先执行终端操作HasNext(),再追加更新步骤。Gremlin遍历对象是一次性的,只要调用了HasNext()、ToList()、Iterate()这类终端操作,遍历就会被触发执行并标记为完成状态,后续再追加的Property等步骤不会被实际执行,所以你看不到属性更新也不会报错。你之前验证得出的「HasNext()调用不影响」的结论存在偏差,这是Gremlin.Net的标准行为。
另外存在一个潜在风险点:你的VertexDto中Id属性定义为string类型,但传入的参数id是数值1234,若你JanusGraph中顶点的id是数值类型,类型不匹配会导致查询不到顶点,不过你当前没有抛出不存在的异常,说明这个问题暂时未触发,建议后续将Id属性类型和数据库存储的id类型保持一致,避免踩坑。
解决方案
将存在性校验的遍历和更新用的遍历拆分为两个独立实例,不要复用同一个遍历对象:
public async Task EditVertexProperty(VertexDto vertexDto) { // 单独创建遍历做存在性校验 var existTraversal = this.g.V(vertexDto.Id); if (!string.IsNullOrWhiteSpace(vertexDto.Label)) { existTraversal = existTraversal.HasLabel(vertexDto.Label); } // 推荐用异步方法避免同步阻塞 if (!await existTraversal.HasNextAsync()) { throw new Exception("顶点不存在"); } // 新建独立遍历执行属性更新 var updateTraversal = this.g.V(vertexDto.Id); if (!string.IsNullOrWhiteSpace(vertexDto.Label)) { updateTraversal = updateTraversal.HasLabel(vertexDto.Label); } foreach (var property in vertexDto.Properties) { updateTraversal = property.IsList ? updateTraversal.Property(Cardinality.List, property.PropertyKey, property.PropertyValue) : updateTraversal.Property(Cardinality.Single, property.PropertyKey, property.PropertyValue); } await updateTraversal.Promise(v => v.Iterate()).ConfigureAwait(false); }
如果要优化性能减少网络请求次数,也可以合并为单遍历实现,一次性完成校验和更新:
public async Task EditVertexProperty(VertexDto vertexDto) { var traversal = this.g.V(vertexDto.Id); if (!string.IsNullOrWhiteSpace(vertexDto.Label)) { traversal = traversal.HasLabel(vertexDto.Label); } // 内置存在性判断逻辑,不需要单独请求校验 traversal = traversal.Choose( t => t.Count().Is(0), t => t.Unfold().Throw(new Exception("顶点不存在")), t => t ); foreach (var property in vertexDto.Properties) { traversal = property.IsList ? traversal.Property(Cardinality.List, property.PropertyKey, property.PropertyValue) : traversal.Property(Cardinality.Single, property.PropertyKey, property.PropertyValue); } await traversal.Promise(v => v.Iterate()).ConfigureAwait(false); }
内容的提问来源于stack exchange,提问作者hpstory
相关产品推荐
相关产品推荐

