返回给予用户聊天的所有用户以及对话中的最新消息

时间:2014-11-05 14:20:51

标签: neo4j cypher

我的人际关系看起来像这样

A-[:CHATS_WITH]->B - denotes that the user have sent at least 1 mesg to the other user

然后是消息

A-[:FROM]->message-[:SENT_TO]->B

反之亦然

B-[:FROM]->message-[:SENT_TO]->A

等等

现在我想选择给定用户聊天的所有用户以及两者之间的最新消息。

现在我已设法通过此查询获取两个用户之间的所有消息

MATCH (me:user)-[:CHATS_WITH]->(other:user) WHERE me.nick = 'bazo' 
WITH me, other 
MATCH me-[:FROM|:SENT_TO]-(m:message)-[:FROM|:SENT_TO]-other  
RETURN other,m ORDER BY m.timestamp DESC

如何才能为每次对话返回最新消息?

1 个答案:

答案 0 :(得分:1)

根据您已有的内容,您只想将LIMIT 1标记为查询的结尾?

图形商店中的优先方式是手动管理链接列表以模拟交互流,在这种情况下,您只需选择列表的头部或尾部。这是因为您正在玩图形强度(遍历)而不是从每个Message节点读取数据。

编辑 - 每个不同联系人的最后留言。

我认为你必须将所有的消息收集到一个有序的集合中然后返回头部,但是如果你有很多朋友/消息,这听起来会变得很慢。

MATCH (me:user)-[:CHATS_WITH]->(other:user) WHERE me.nick = 'bazo' 
WITH me, other 
MATCH me-[:FROM|:SENT_TO]-(m:message)-[:FROM|:SENT_TO]-other  
WITH other, m 
ORDER BY m.timestamp DESC
RETURN other, HEAD(COLLECT(m))

请参阅:Neo Linked ListsNeo Modelling a Newsfeed