如何基于另一Gremlin查询结果过滤当前查询输出?
解决Gremlin跨查询结果过滤的问题
你的需求是用Friend节点的name结果过滤Person节点的name输出,原来的where用法不符合Gremlin语法,这里提供两种可行的解决方法:
方法1:用within结合折叠后的结果
先把Friend的所有name折叠成集合,再用within谓词过滤Person的结果:
g.V().hasLabel('Person').values('name').where(within(g.V().hasLabel('Friend').values('name').fold()))
如果你的查询环境支持变量定义,可以拆分写法,可读性更强:
// 先获取所有Friend的name集合 friendNames = g.V().hasLabel('Friend').values('name').fold() // 用集合过滤Person的name g.V().hasLabel('Person').values('name').where(within(friendNames))
方法2:用where子查询匹配
通过子查询验证当前Person的name是否存在于Friend的name列表中:
g.V().hasLabel('Person') .where( __.values('name').as('personName'), g.V().hasLabel('Friend').values('name').as('friendName'), eq('personName').by('friendName') ) .values('name')
原语句错误原因
你之前写的where('names', g.V().hasLabel('Friend').values('name'))不符合Gremlin的where语法规则,where需要搭配谓词(如within、eq)或者子查询匹配逻辑,不能直接传入字符串和查询语句。
内容的提问来源于stack exchange,提问作者Avijit Dasgupta
相关产品推荐
相关产品推荐

