如何在一条Gremlin-Python查询语句中获取两个顶点ID?
问题分析与解决方案
错误原因
你的查询报错是因为**node2_id_prop10标签绑定的是节点ID的字符串值,而非node2节点本身**,后续用.by(T.id)尝试对字符串执行节点ID获取操作,而T.id仅支持图元素(节点/边),无法作用于字符串类型,因此触发TokenTraversal support of java.lang.String does not allow selection by id错误。
修正后的查询
以下是调整后的Gremlin查询,可正确获取包含两个节点ID的键值对列表:
g.V().hasLabel('node1') .as('node1', 'prop1', 'prop2', 'prop3', 'prop4', 'prop5', 'prop6', 'prop7', 'prop9') .inE('edge').outV().hasLabel('node2').as('node2') .select('prop1', 'prop2', 'prop3', 'prop4', 'prop5', 'prop6', 'prop7', 'prop9', 'node1_id', 'node2_id') .by('prop1').by('prop2').by('prop3').by('prop4').by('prop5') .by(values('prop6').fold()).by('prop7').by('prop9') .by(select('node1').id()) .by(select('node2').id()) .toList()
关键调整点
- 保留节点引用:将node1和node2分别用
as('node1')、as('node2')绑定,而非提前取出ID字符串。 - 正确获取ID:在
select阶段,通过select('node1').id()和select('node2').id()从节点引用中提取ID,避免类型不匹配。 - 简化标签结构:无需为节点ID单独设置冗余标签,直接通过节点引用关联获取。
另一种简洁写法
如果希望结构更清晰,也可以用project来组织节点属性和ID:
g.V().hasLabel('node1').as('node1') .inE('edge').outV().hasLabel('node2').as('node2') .project('node1_props', 'node2_id') .by(project('prop1', 'prop2', 'prop3', 'prop4', 'prop5', 'prop6', 'prop7', 'prop9', 'node1_id') .by('prop1').by('prop2').by('prop3').by('prop4').by('prop5') .by(values('prop6').fold()).by('prop7').by('prop9').by(id())) .by(id()) .toList()
内容的提问来源于stack exchange,提问作者Siranjeevi
相关产品推荐
相关产品推荐

