使用边/顶点进行过滤

时间:2013-12-19 19:39:50

标签: graph neo4j gremlin

我尝试过滤节点:

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个结果,但我没有。

此致

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(*)