JanusGraph图遍历中如何引用已存储边的属性作为has步过滤条件
问题原因
你遇到的问题根源是has()步骤不支持传入动态遍历结果作为匹配值,它的第二个参数只能接收字面量常量。你写的select('action_edge').values('used_user_key')会被has步骤判定为非法参数直接忽略,相当于没有加任何过滤条件,所以所有3条called-by边都会被返回,才会出现计数为3、返回随机用户的现象。
正确写法
要实现两个动态属性的等值匹配,应该使用where()步骤搭配谓词进行过滤,修改后的遍历代码如下:
首先需要提前导入gremlin的依赖:
from gremlin_python.process.graph_traversal import __ from gremlin_python.process.traversal import eq
然后修改查询语句:
user_perming_the_action = g.V(action).outE('performed-by').as_('action_edge').inV() \ .outE('called-by') \ # 匹配called-by的user_key和performed-by的used_user_key相等 .where(__.values('user_key').eq(__.select('action_edge').values('used_user_key'))) \ .inV()
执行后你会得到符合预期的结果:计数为1,返回的节点就是user_a。
补充说明
如果希望写法更简洁,也可以提前提取需要匹配的属性值存入别名,后续直接用别名匹配:
user_perming_the_action = g.V(action).outE('performed-by').values('used_user_key').as_('target_key') \ .V(controller).outE('called-by').where(__.values('user_key').eq('target_key')) \ .inV()
这种写法遍历链路更短,在大数据量场景下性能会更好。
内容的提问来源于stack exchange,提问作者Bogdan Sulima
相关产品推荐
相关产品推荐

