【发布时间】:2018-12-06 18:25:04
【问题描述】:
我正在尝试遍历顶点上的任意数量的边并将当前迭代器/循环计数分配给边。我该怎么做呢?
伪代码 g.V(12345).outE('contains').loop{through all outE contains edges}{__.property('ordinal',it.loopCount)}
类似的东西?
【问题讨论】:
标签: gremlin janusgraph
我正在尝试遍历顶点上的任意数量的边并将当前迭代器/循环计数分配给边。我该怎么做呢?
伪代码 g.V(12345).outE('contains').loop{through all outE contains edges}{__.property('ordinal',it.loopCount)}
类似的东西?
【问题讨论】:
标签: gremlin janusgraph
以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
【讨论】:
.count("x") 或 .incr("x") 或 .set("x", 1, sum) 即将出现。一般来说,我们需要一些全局计数器或标量值。
您可以使用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() 基本上会保留循环计数,您可以将其分配给您的边缘。
【讨论】:
==> [weight:0.4, ordinal:0] ==> [weight:0.4, ordinal:1] ==> [weight:0.4, ordinal:2] 仍然在学习我的图表方式,所以我可能会以错误的方式思考它。再次感谢。我有一个查询按我想要的顺序获取边缘,但需要使用我称为 ordinal 的属性在边缘上显式设置该顺序。
withSack(-1) 定义初始 sack 值,这样当它在第一个循环上递增时,sack() 值以 @ 递增987654327@ 到 0。