无法正确排序和限制子节点; WITH + OPTIONAL MATCH

时间:2015-10-19 17:43:50

标签: neo4j cypher

假设我有以下节点关系:

(:User)-[:MEMBER]->(:Room)<-[:HAS]-(:Photo)

同样:User可以是(:User)-[:FRIEND]-(:User)到其他:User

:Room可能有照片,也可能没有。

我想要实现的目标 - 按:Room排序5 .creationdate,每个房间获得4 :Photo个并按.date排序(如果有照片),并且还有5位朋友,他们是这个房间的成员,没有任何排序。我试图在一个查询中执行此操作,但我几乎放弃了,也许没有办法做到这一点,我需要将其作为单独的数据库请求?

到目前为止,查找逻辑正确的查询不起作用 - 例如,它只返回4 :Photo个总计,其中一些没有任何与其他节点的连接。

查询:

MATCH (u:User {id:'E17YfQyRgl'})-[:MEMBER]-(r:Room)
WITH r ORDER BY r.creationdate LIMIT 5 
OPTIONAL MATCH r-[:HAS]-(ph:Photo) 
WITH ph ORDER BY ph.date LIMIT 4 
OPTIONAL MATCH r-[:MEMBER]-(fr:User)-[:FRIEND]-(u:User {id:'E17YfQyRgl'})
return r,COLLECT(ph),COLLECT(fr)[..5]

正如你所看到的那样,我使用了COLLECT,LIMIT和ORDER BY等不一致的混搭......但我现在迷失了,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

只要您将标识符留在WITH子句之外,就会将其置于后面,它将变为未绑定。您认为您正在使用标识符,但此时您实际上正在匹配所有节点。

特别是

WITH ph ORDER BY ph.date LIMIT 4 
OPTIONAL MATCH r-[:MEMBER]-(fr:User)-[:FRIEND]-(u:User {id:'E17YfQyRgl'})

您的r不再受任何约束。它没有包含在之前的WITH子句中;你只携带ph。您可以选择在所有节点上进行匹配。尝试这样的事情:

MATCH (:User {id:'E17YfQyRgl'})-[:MEMBER]-(r:Room)
WITH r ORDER BY r.creationdate LIMIT 5 
OPTIONAL MATCH (r)-[:HAS]-(ph:Photo) 
WITH r, ph ORDER BY ph.date
WITH r, COLLECT(ph)[..5] AS photos
OPTIONAL MATCH (r)-[:MEMBER]-(fr:User)-[:FRIEND]-(:User {id:'E17YfQyRgl'})
RETURN r, photos, COLLECT(fr)[..5]