如何通过边缘属性值大于边缘属性值查询gremlin顶点

问题描述 投票:2回答:1

在我的图形中,我想要得到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

gremlin tinkerpop
1个回答
2
投票

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

但是这个感觉对我来说最清晰(代码方面)

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)))

如果仅需要“门”顶点或特定顶点,则应在where步骤之前对其进行过滤。

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

© www.soinside.com 2019 - 2024. All rights reserved.