Gremlin阶模式和使用循环的边更新

时间:2018-06-27 19:08:54

标签: gremlin janusgraph

我正在尝试遍历顶点上任意数量的边,并将当前的迭代器/循环计数分配给边。我将如何去做?

伪代码 g.V(12345).outE('contains')。loop {通过所有outE包含边} {__。property('ordinal',it.loopCount)}

类似的东西吗?

2 个答案:

答案 0 :(得分:1)

您可以使用sack()完成此操作。例如,我将使用TinkerPop随附的“现代”玩具图:

gremlin> g.withSack(0).V(1).
......1>   repeat(outE().
......2>          sack(sum).
......3>            by(constant(1)).
......4>          property('loops',sack()).
......5>          inV())
gremlin> g.V(1).outE().valueMap()
==>[weight:0.4,loops:1]
==>[weight:0.5,loops:1]
==>[weight:1.0,loops:1]
gremlin> g.V(1).outE().inV().outE().valueMap()
==>[weight:1.0,loops:2]
==>[weight:0.4,loops:2]

因此sack()基本上将保留循环计数,您可以将其分配给边缘。

答案 1 :(得分:1)

1开头:

gremlin> g.V(1).outE().
           groupCount("x").
             by(constant("c")).
           property("ordinal", select("x").select("c")).iterate()
gremlin> g.V(1).outE().valueMap(true)
==>[id:9,weight:0.4,ordinal:1,label:created]
==>[id:7,weight:0.5,ordinal:2,label:knows]
==>[id:8,weight:1.0,ordinal:3,label:knows]

要从0开始,您需要做一些额外的工作:

gremlin> g.withSideEffect("x", ["c": 0L]).V(1).outE().
           property("ordinal", select("x").select("c")).
           groupCount("x").
             by(constant("c")).iterate()
gremlin> g.V(1).outE().valueMap(true)
==>[id:9,weight:0.4,ordinal:0,label:created]
==>[id:7,weight:0.5,ordinal:1,label:knows]
==>[id:8,weight:1.0,ordinal:2,label:knows