将一条记录限制为Cypher COLLECTION

时间:2016-04-30 19:53:15

标签: php neo4j cypher

我正在创建一个消息传递系统,我希望索引页面显示发送类似于大多数电子邮件和聊天应用程序的电子邮件的人的首要信息。问题是我似乎无法将消息的结果限制为1,也可以通过“created_at”排序结果。消息的日期而不是发送消息的人。

我的Cypher是:

MATCH (p:Person)-[:SENT]->(m:Message)-[:SENT_TO]->(op:Person{username:"the_username"})
WHERE NOT p.username = "the_username"
WITH p,m
ORDER BY m.created_at DESC
RETURN DISTINCT p.first_name as first_name, 
                p.last_name as last_name, 
                p.username as username, 
                p.image_name as image_name,
                COLLECT({subject:m.subject, 
                         created_at:m.created_at, 
                         body:m.body, 
                         message_id:id(m),
                         status:m.status}) as message

我希望结果生成输入的顶部消息(通过Message节点上的created_at属性),然后通过created_at属性对结果进行排序,以便用户可以看到最后发送消息的人。

谢谢!

1 个答案:

答案 0 :(得分:2)

要仅向每个使用所需用户名发送消息的人发送最新消息,您可以使用此略微修改的查询:

MATCH (p:Person)-[:SENT]->(m:Message)-[:SENT_TO]->(op:Person{username:"the_username"})
WHERE NOT p.username = "the_username"
WITH p,m
ORDER BY m.created_at DESC
WITH p, (COLLECT(m))[0] AS m0
RETURN DISTINCT p.first_name as first_name, 
                p.last_name as last_name, 
                p.username as username, 
                p.image_name as image_name,
                COLLECT({subject:m0.subject, 
                         created_at:m0.created_at, 
                         body:m0.body, 
                         message_id:id(m0),
                         status:m0.status}) as message

变化是:

  1. 此条款已添加:WITH p, (COLLECT(m))[0] AS m0。这会聚合每个发件人的所有邮件(按降序created_at顺序),并保留第一条邮件,并为其指定标识符“m0”。
  2. 后续条款是使用“m0”而不是“m”的更改。
  3. 注意:在#1中,您实际上可以使用AS m代替,这样可以避免必须执行#2。但是,我选择使用不同的标识符,以使查询更容易理解和维护。