【问题标题】:Limiting one record to a Cypher COLLECTION将一条记录限制为 Cypher COLLECTION
【发布时间】:2016-08-25 20:46:10
【问题描述】:

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

我的密码是:

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 属性对结果进行排序,以便用户可以看到最后发送消息的人。

谢谢!

【问题讨论】:

    标签: php neo4j cypher


    【解决方案1】:

    要仅获取向具有所需用户名的人发送消息的每个人的最新消息,您可以使用这个稍作修改的查询:

    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”。

    注意:在#1 中,您实际上可以改用AS m,这样您就可以避免必须执行#2。但是,我选择使用不同的标识符,以使查询更易于理解和维护。

    【讨论】:

    • 非常感谢您限制顶部项目的方式。关于如何按最后发送消息的人排序的任何想法?
    • 非常感谢!我想出了其余的并从返回中的集合中取出消息,然后将用户与消息元素一起添加到返回中,这样我就可以按 message_id DESC 对其进行排序
    • 只是一个想法:HEAD(COLLECT(m)) 可能比COLLECT(m)[0] 更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多