如何通过入边 属性 值大于出边 属性 值来查询 gremlin 顶点

how to query gremlin vertices by in-edge property value is greater than out-edge property value

在我的图中,我想得到gate3,入边的幂之和大于出边。

我试过查询:

g.V().where(inE().has("period",202006).values("power").sum().is(gt(outE().has("period",202006).values("power").sum()))).values("name")

但这会导致异常:

Cannot compare '70' (Long) and '[VertexStep(OUT,edge), HasStep([period.eq(202006)]), PropertiesStep([power],value), SumGlobalStep]' (DefaultGraphTraversal) as both need to be an instance of Number or Comparable (and of the same type)

如有任何帮助,我们将不胜感激。谢谢。

附加我的 gremlin 控制台脚本:

graph = TinkerGraph.open()
g = graph.traversal()
v6 = g.addV("gate").property("name", "gate1").next()
v0 = g.addV("trans").property("name", "trans0").next()
g.addE("consumed").from(v6).to(v0).property(id, 6).property("ammeter", 0).property("period",202006).property("power", 70)
v7 = g.addV("gate").property("name", "gate2").next()
v9 = g.addV("trans").property("name", "trans9").next()
g.addE("consumed").from(v7).to(v9).property("ammeter", 9).property("period",202006).property("power", -10)
v1 = g.addV("device").property("name", "device1").next()
v2 = g.addV("device").property("name", "device2").next()
v3 = g.addV("gate").property("name", "gate3").next()
g.addE("consumed").from(v0).to(v1).property("ammeter", 1).property("period",202005).property("power", 45)
g.addE("consumed").from(v0).to(v1).property("ammeter", 1).property("period",202006).property("power", 35)
g.addE("consumed").from(v0).to(v2).property("ammeter", 2).property("period",202006).property("power", 25)
g.addE("consumed").from(v0).to(v3).property("ammeter", 3).property("period",202006).property("power", 10)
g.addE("consumed").from(v9).to(v3).property("ammeter", 9).property("period",202006).property("power", 10)
v4 = g.addV("device").property("name", "device4").next()
v5 = g.addV("device").property("name", "device5").next()
g.addE("consumed").from(v3).to(v4).property("ammeter", 4).property("period",202006).property("power", 8)
g.addE("consumed").from(v3).to(v5).property("ammeter", 5).property("period",202006).property("power", 10)

graph

也许有更优化的方法来做到这一点。

但我觉得这个最清楚(代码方面)

g.V().where(project('inPower', 'outPower').
      by(coalesce(inE().values('power').sum(),constant(0))).
      by(coalesce(outE().values('power').sum(),constant(0))).
    math('inPower - outPower').is(gt(0)))

如果您只需要 "gate" 个顶点或特定顶点,您应该在 where 步骤之前对其进行过滤。

示例:https://gremlify.com/bxehbun5w9f8