使用Gremlingo创建顶点间边时遇Traverser映射错误
解决gremlingo-go创建边时"The provided traverser does not map to a value"错误
问题分析
这个错误通常是因为AddE的From/To子遍历没有返回单个有效顶点,或者遍历实例复用导致的逻辑混乱。结合你提供的代码,核心问题可从以下几个方向排查修复:
解决方案
1. 不要复用同一个GraphTraversal实例
gremlingo的*gremlingo.GraphTraversal是不可变链式结构,每次调用方法都会生成新的遍历实例。复用同一个t执行AddV和AddE,会导致遍历步骤叠加混乱(比如把AddE追加到之前的AddV步骤后)。
正确做法是每次创建独立遍历:
// 创建顶点时使用独立遍历 g.Traversal().AddV("somenode").Property("some_id", someID).Iterate() g.Traversal().AddV("someothernode").Property("some_id", someID).Iterate() // 创建边时同样使用新的遍历实例 g.Traversal().AddE("someedge"). From( __.V().HasLabel("somenode").Has("some_id", someID), ). To( __.V().HasLabel("someothernode").Has("some_id", someID), ). Iterate()
2. 确保子遍历返回单个顶点
如果some_id未设置唯一索引,子遍历可能返回多个顶点,导致无法映射到单个值。可添加Limit(1)强制返回单个结果,同时建议给some_id创建唯一索引提升可靠性:
g.Traversal().AddE("someedge"). From(__.V().HasLabel("somenode").Has("some_id", someID).Limit(1)). To(__.V().HasLabel("someothernode").Has("some_id", someID).Limit(1)). Iterate()
3. 先获取顶点再创建边(更易排查问题)
若直接用子遍历出错,可先显式获取顶点对象,再创建边,这样能提前排查是否找到目标顶点:
// 获取起点顶点 fromVertex, err := g.Traversal().V().HasLabel("somenode").Has("some_id", someID).Next() if err != nil { // 处理"未找到顶点"的错误 log.Fatal(err) } // 获取终点顶点 toVertex, err := g.Traversal().V().HasLabel("someothernode").Has("some_id", someID).Next() if err != nil { log.Fatal(err) } // 创建边 g.Traversal().AddE("someedge").From(fromVertex).To(toVertex).Iterate()
4. 检查变量类型与值
确保创建边时传入的someID和创建顶点时完全一致(比如字符串/数字类型不匹配、值有拼写错误)。Gremlin Console用硬编码值能成功,大概率是Go代码中someID变量传递存在问题。
内容的提问来源于stack exchange,提问作者norym
相关产品推荐
相关产品推荐

