【问题标题】:Filter using edges / vertices使用边/顶点过滤
【发布时间】:2013-12-19 19:39:50
【问题描述】:

我尝试过滤节点:

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

问候,

【问题讨论】:

  • 你想达到什么目的?

标签: graph neo4j gremlin


【解决方案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();

希望这里的某些内容能让您在正确的轨道上找到答案。

【讨论】:

    【解决方案2】:

    你想达到什么目标?

    抱歉,这些天我的小精灵知识接近于零。

    在密码中它可能看起来像这样

    START user=node(42), comp=node:comparisons("id:*")
    MATCH comp-[:COMPARED_VALUE1]->()<-[:VOTED*2]-(user)
    RETURN count(*)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2021-11-24
      相关资源
      最近更新 更多