假设我有以下节点关系:
(: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等不一致的混搭......但我现在迷失了,任何帮助都会受到赞赏。
答案 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]