使用where...by过滤AWS Neptune Gremlin查询报错排查
问题分析与修正
你的查询存在三个关键问题:
遍历上下文被重置
第二个V()会重新启动一个遍历,遍历所有顶点,这会导致后续select('p1r1')无法找到之前定义的别名——因为p1r1属于第一个V()启动的遍历分支,和第二个V()的上下文完全隔离。这就是错误提示里“start does not map to a value”的核心原因。where语法使用错误
当前的where(eq('p1r2'))写法逻辑混乱,eq()接收的应该是比较值而非别名。你需要的是比较p1r2和p1r1的pid属性,正确的where结构应该是通过别名关联两边的属性。别名引用的语法错误
select('p1r1','p1r2')里的p1r2多了一个多余的反引号,应该改为'p1r2'`。
修正后的查询示例
假设你想要找到seg_1_of_2边的pid与seg_cont边的pid匹配的记录,正确的遍历应该保持上下文连贯,比如从dest1继续遍历seg_cont边,或者使用match来关联两个分支:
方式一:保持上下文连贯(推荐)
g.V().outE('seg_1_of_2').as('p1r1') .inV().as('dest1') // 从dest1出发遍历seg_cont边,而非重新调用V() .outE('seg_cont').as('p1r2') // 比较两边的pid属性 .where('p1r2', eq('p1r1')).by('pid').by('pid') .select('p1r1', 'p1r2') .limit(1)
方式二:使用match关联两个分支
如果你的逻辑需要完全独立的两个分支,可以用match来明确关联:
g.match( __.V().outE('seg_1_of_2').as('p1r1'), __.V().outE('seg_cont').as('p1r2') ).where('p1r2', eq('p1r1')).by('pid').by('pid') .select('p1r1', 'p1r2') .limit(1)
内容的提问来源于stack exchange,提问作者user3637771
相关产品推荐
相关产品推荐

