Reputation: 23
In my graph, i want to get gate3, by the sum of power for in-edge is greater than out-edge.
I tried the query:
g.V().where(inE().has("period",202006).values("power").sum().is(gt(outE().has("period",202006).values("power").sum()))).values("name")
but this results in an exception:
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)
Any help would be greatly appreciated. Thanks.
Append my gremlin console scripts:
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)
Upvotes: 2
Views: 706
Reputation: 2856
Maybe there is a more optimized way to do this.
But this one feels the clearest to me (code-wise)
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)))
If you want only "gate" vertices or specific vertex you should filter it before the where
step.
example: https://gremlify.com/bxehbun5w9f8
Upvotes: 0