neo4j - 无法正确排序和限制子节点; WITH + 可选匹配

标签 neo4j cypher

假设我有以下节点关系:

(: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/

相关文章:

java - Neo4j 堆大小

neo4j - 如何解释 Cypher 的 LOAD CSV 子句的性能?

neo4j - 如何计算与特定节点相关的所有其他节点

java - Neo4j 通过 REST 批处理请求

Neo4j:Cypher WHERE 子句与 MATCH 子句中的花括号 - 哪个更好?

python - 在 python 中的 Cypher 查询中传递变量

neo4j - 计算结果中的重复项数

neo4j - Neo4j Cypher中有多个不相关的查询?

Neo4j-密码 : merge duplicate relationships

neo4j - 如何在 cypher 中检查节点的类型?