Gremlin:如何在查询中引用循环变量?

时间:2013-01-28 14:34:30

标签: gremlin

重新使用gremlin查询,根据作为参数传递给查询的键的排序列表,将rank值分配给节点。 由“uniqueId”值标识的每个节点应根据重新排列的数组中的出现顺序分配一个等级。

这有效:

reranked = [uniqueId1, uniqueId2, uniqueId3]
v.outE.as('e').inV.filter{it.key == reranked[2]}.back('e').sideEffect{it.rank = 2}

但这不会(用for-loop变量替换int):

reranked = [uniqueId1, uniqueId2, uniqueId3]
for (i in 1..reranked.size())
v.outE.as('e').inV.filter{it.key == reranked[i]}.back('e').sideEffect{it.rank = i}

你知道为什么这不起作用吗?我也很高兴能有更简单的想法达到同一目标。

2 个答案:

答案 0 :(得分:0)

好吧,看起来我找到了一个解决方案,可能很笨拙但嘿,它有效!

c=0
v.as('st').outE.as('e').inV.filter{it.key == reranked[c]}.back('e').sideEffect{
    it.rank = reranked.size() - c }.outV.loop('st'){ c++ < so.size() }

如果有针对上述情况的解决方案,并且可能采用更加优雅的解决方案,我仍会接受另一个答案。

答案 1 :(得分:0)

你可以使用Groovy的eachWithIndex来执行此操作:

reranked = [uniqueId1, uinqueId2, uniqueId3]
reranked.eachWithIndex{uniqueId, idx -> v.outE.as('e').inV.has('key', uniqueId).back('e').sideEffect{it.rank = idx} }

我在上面使用了Gremlin的has步骤,因为在查找简单属性的情况下,它比filter更有效。