You need to enable JavaScript to run this app. JanusGraph图遍历中如何引用已存储边的属性作为has步过滤条件
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 15:15:03