Gremlin遍历中基于前置边复杂属性判断后续边的可行性咨询
Gremlin实现跨边属性的复杂判断方案
Gremlin完全支持这类跨边的复杂属性判断,且可以通过内置步骤或Lambda实现,以下是具体解决方案:
需求回顾
从顶点v1经边e1到达v2,遍历v2的所有出边eX,判断规则为:若e1的属性是数组(如[0,1]),则eX属性数组中,e1数组内所有索引对应的数值不能同时为-1(即至少有一个对应索引的值≠-1)。符合条件的路径将被保留。
实现方案
假设边的属性名称为props(例如e1.props = [0,1],e2.props = [0,1],e4.props = [-1,-1]),提供两种实现方式:
方式1:使用Gremlin内置步骤(推荐,兼容性强)
这种方式完全依赖Gremlin原生步骤,适配绝大多数图数据库(如JanusGraph、TinkerGraph等):
g.V("v1"). outE().as("e1"). inV().outE().as("e2"). where( select("e1", "e2").by("props"). map( // 提取e1的索引列表与e2的属性数组 unfold().limit(1).unfold().as("indices"). select(keys).tail(1).unfold().as("e2Props"). // 验证是否存在至少一个索引对应的e2属性≠-1 select("indices").map(select("e2Props").get(it)).is(neq(-1)). any() ) ). path()
方式2:使用Lambda(需确认数据库支持)
部分图数据库支持Lambda表达式,可直接用更贴近你伪代码的逻辑实现:
g.V("v1"). outE().as("e1"). inV().outE().as("e2"). where( select("e1", "e2").by("props"). map { pair -> def e1Indices = pair.getAt(0) def e2Props = pair.getAt(1) // 检查e1索引列表中是否存在至少一个索引,对应e2属性≠-1 e1Indices.any { idx -> e2Props[idx] != -1 } } ). path()
说明
- 内置步骤方案兼容性更好,无Lambda的使用限制;
- Lambda方案逻辑更直观,但需确认你的图数据库是否支持(例如Amazon Neptune、Neo4j等对Lambda有严格限制);
- 两种方案都会过滤掉
eX对应e1所有索引位置均为-1的路径,最终得到你期望的v1-e1-v2-e2-v3和v1-e1-v2-e3-v4路径。
内容的提问来源于stack exchange,提问作者yumu
相关产品推荐
相关产品推荐

