我试图理解我是否可以使用包含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不允许我这样做?
答案 0 :(得分:1)
不确定您在cypher中对HAVING
的引用是什么,但这不是查询的问题。
WHERE
- 在密码中,您WHERE
一次,然后您可以使用所需的所有二进制乐趣扩展它r2
),但第二个过滤条件测试聚合(count(q)
)。您无法同时在同一模式下测试平面图案和聚合p
?)您可能还想更改第二个MATCH
,m
已绑定,但您要将其与刚刚创建的标签重新匹配。总而言之,尝试像
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
来自哪里。