假设我有以下节点关系:
(:User)-[:MEMBER]->(:Room)<-[:HAS]-(:Photo)
还有 :User
可以是(:User)-[:FRIEND]-(:User)
到其他:User
:Room
可能有照片也可能没有。
我想要实现的目标 - 获得 5 :Room
按 .creationdate
排序, 得到 4 :Photo
对于每个房间,并按 .date
对它们进行排序(如果有照片的话),还有5个 friend ,都是这个房间的成员,没有任何排序。我试图在一个查询中执行此操作,但我几乎放弃了,也许没有办法做到这一点,我需要将其作为单独的数据库请求进行吗?
到目前为止,寻找我的逻辑正确的查询不起作用 - 例如它只返回 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 混搭...但我现在迷路了,感谢任何帮助。
最佳答案
一旦您将标识符留在 WITH
子句之外,它就会成为未绑定(bind)的。你认为你正在使用一个标识符,但你实际上是在此时匹配所有节点。
特别是,
WITH ph ORDER BY ph.date LIMIT 4
OPTIONAL MATCH r-[:MEMBER]-(fr:User)-[:FRIEND]-(u:User {id:'E17YfQyRgl'})
您的 r
不再绑定(bind)任何东西。它没有包含在前面的 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]
关于neo4j - 无法正确排序和限制子节点; WITH + 可选匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33220696/