我尝试过滤节点:
user = g.v(42);
g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']]
.filter{
if (it.out('COMPARED_VALUE1').in('VOTED').in('VOTES').next().equals(user))
{
return true;
}
return false;
}.count();
我真的不明白管道是如何工作的,但我知道next()在过滤器“循环”中打破了一些东西。
我应该得到2个结果,但我没有。
此致
答案 0 :(得分:1)
我可能需要修改我的答案,因为我可能需要更多关于你想要实现的内容(如@Michael所要求的),但如果你认为你的问题是next()
,那么请考虑以下事项:
user = g.v(42);
g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']]
.filter{it.out('COMPARED_VALUE1').in('VOTED').in('VOTES').next().equals(user)}.count();
首先,请注意上面的过滤器闭包可以立即减少(当然会产生相同的错误)。鉴于过滤器闭包,您假设在next()
时用户顶点将从管道中出来。情况可能并非如此。因此,我会将过滤器闭包重写为:
user = g.v(42);
g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']].filter{
def p = it.out('COMPARED_VALUE1').in('VOTED').in('VOTES')
p.hasNext() ? p.next().equals(user) : false
}.count();
考虑到您只需要评估管道p
中的第一个项目(这实际上是您之前所做的),这应该可以解决您的问题。我想知道你是否不能简单地在这里使用except/retain pattern来得到你的答案,因为它有点不那么令人费解:
user = g.v(42);
g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']]
.out('COMPARED_VALUE1').in('VOTED').in('VOTES').retain([user])
.count();
希望这里的某些内容能让您在正确的轨道上找到答案。
答案 1 :(得分:0)
你想要达到什么目的?
抱歉,这些天我的gremlin知识接近于零。
在密码中它可能看起来像这样
START user=node(42), comp=node:comparisons("id:*")
MATCH comp-[:COMPARED_VALUE1]->()<-[:VOTED*2]-(user)
RETURN count(*)