Neo4j:WITH和HAVING在同一个查询中?

时间:2014-04-08 21:14:50

标签: sql count neo4j having with-statement

我试图理解我是否可以使用包含WITH和HAVING子句的Neo4j执行查询。到目前为止我有这个:

MATCH (n)-[r:RELATIONSHIP*1..3]->(m) 
SET m:LABEL
WITH m
MATCH (m:LABEL)-[r2:RELATIONSHIP]->(q:OTHERLABEL)
WHERE r2.time<100
RETURN p,r2,q;

我现在需要在SQL中添加一些与SQL相同的查询

MATCH (n)-[r:RELATIONSHIP*1..3]->(m)
SET m:LABEL
WITH m
MATCH (m:LABEL)-[r2:RELATIONSHIP]->(q:OTHERLABEL)
WHERE r2.time<100 
    AND WHERE count(q)=3
RETURN m,r2,q;

我知道Cypher不允许我在不使用类似HAVING子句的情况下使用它,但是当我尝试将其添加到我的查询时它与之前的WITH子句冲突。 这是可行的还是嵌套太多,Cypher不允许我这样做?

2 个答案:

答案 0 :(得分:1)

不确定您在cypher中对HAVING的引用是什么,但这不是查询的问题。

  • 删除第二个WHERE - 在密码中,您WHERE一次,然后您可以使用所需的所有二进制乐趣扩展它
  • 您的第一个过滤条件测试各个关系(r2),但第二个过滤条件测试聚合(count(q))。您无法同时在同一模式下测试平面图案和聚合
  • 返回您实际绑定的内容(什么是p?)

您可能还想更改第二个MATCHm已绑定,但您要将其与刚刚创建的标签重新匹配。总而言之,尝试像

这样的东西
MATCH (n)-[r:RELATIONSHIP*1..3]->(m)
SET m:LABEL
WITH m
MATCH (m)-[r2:RELATIONSHIP]->(q:OTHERLABEL)
WHERE r2.time<100
WITH m, collect(r2) as rr, collect(q) as qq
WHERE length(qq) = 3
RETURN p,rr,qq;

首先在平面关系r2上进行过滤,然后在聚合的大小上进行过滤,或者对于平面WHERE .. AND ..尝试类似

的过滤
MATCH (n)-[r:RELATIONSHIP*1..3]->(m)
SET m:LABEL
WITH m
MATCH (m)-[r2:RELATIONSHIP]->(q:OTHERLABEL)
WHERE r2.time<100 AND q.someProp = 10
RETURN m,r2,q;

答案 1 :(得分:1)

你可以拥有任意数量的语句,它只是将查询结果从一个部分传递到另一个部分。实际上WITH + WHERE =`HAVING``

MATCH (n)-[r:RELATIONSHIP*1..3]->(m)
SET m:LABEL
WITH m
MATCH (m:LABEL)-[r2:RELATIONSHIP]->(q:OTHERLABEL)
WHERE r2.time<100 
WITH m,collect([r2,q]) as paths
WHERE length(paths) = 3
RETURN m,paths;

顺便说一下。我不知道p来自哪里。