Neo4j 一组匹配项的筛选结果(超出筛选联合)

Neo4j 一组匹配项的筛选结果(超出筛选联合),neo4j,cypher,Neo4j,Cypher,下面是一个场景。我正在尝试创建一个收件箱,其中包含用户之间最近的(多条消息)对话,其中最近的消息(发送或接收)在列表中有一个简短的预览 (顺便说一句,我知道工会后的过滤问题是公开的:)但我不确定我的问题是否得到了充分的回答 让我们想象一下,它显示如下: MATCH (u:User)<-[r:SENDER|:RECEIVER]-(m:Message)-[:SENDER|:RECEIVER]->(u2:User) WHERE (u.username = "brendanh") WITH

下面是一个场景。我正在尝试创建一个收件箱,其中包含用户之间最近的(多条消息)对话,其中最近的消息(发送或接收)在列表中有一个简短的预览

(顺便说一句,我知道工会后的过滤问题是公开的:)但我不确定我的问题是否得到了充分的回答

让我们想象一下,它显示如下:

MATCH (u:User)<-[r:SENDER|:RECEIVER]-(m:Message)-[:SENDER|:RECEIVER]->(u2:User) 
WHERE (u.username = "brendanh")
WITH u2,m,type(r) as action ORDER BY m.created_at DESC
WITH u2,head(collect({type:type(r), msg: m})) as conv
RETURN  u2.username, conv.msg.body, conv.type

用户1的收件箱:

用户03-“嘿,进展如何,我…”

用户02-“yo用户2,我看到了wh…”

user04-“你知道我

user26-“亲爱的user01我只是…”


在图中,数据库对话用以下关系表示:

(:User)<-[s:SENDER]-(m:Message)-[r:RECEIVER]->(:User)
我想要的是:

body            sender        receiver

blah blah blah  brendanh      user2
foo foo foo     user3         brendanh
test test       brendanh      user4
我可以通过以下方式获得一组独特的对话参与者:

MATCH (u:User {username:'brendanh'})<-[]-(m:Message)-[]->(u2:User) 
return distinct(u2.username)
MATCH(u:User{username:'brendanh'})(u2:User)
返回不同的(u2.username)
但这并不是说我可以将单个用户名列表进行“For”匹配,并返回每个用户名的第一条消息匹配。(我的意思是在密码查询中)

我可以收集对话参与者的列表(我在Golang中运行这个),然后针对每个结果运行graphdb查询,但这看起来很混乱

我尝试过使用UNWIND和前面描述的查询中的用户名列表,该查询列出了对话伙伴,但我再次得到了每条消息,而不仅仅是每个用户的第一条消息

我这里有没有特别明显的遗漏

感谢您的帮助,谢谢


另外,理想情况下,我想限制回复的数量,这样如果我只想显示前十个结果,假设用户有>10次对话,但这不太重要,不太容易理解你想要什么,但我想我已经明白了

您希望每个合作伙伴在列表中只出现一次,并且第一次出现吗?信息

也许是这样的:

MATCH (u:User)<-[r:SENDER|:RECEIVER]-(m:Message)-[:SENDER|:RECEIVER]->(u2:User) 
WHERE (u.username = "brendanh")
WITH u2,m,type(r) as action ORDER BY m.created_at DESC
WITH u2,head(collect({type:type(r), msg: m})) as conv
RETURN  u2.username, conv.msg.body, conv.type
匹配(u:用户)(u2:用户)
其中(u.username=“brendanh”)
使用u2,m,键入(r)作为m在DESC处创建的动作顺序
使用u2,head(collect({type:type(r),msg:m}))作为conv
返回u2.username、conv.msg.body、conv.type

不太容易理解你想要什么,但我想我明白了

您希望每个合作伙伴在列表中只出现一次,并且第一次出现吗?信息

也许是这样的:

MATCH (u:User)<-[r:SENDER|:RECEIVER]-(m:Message)-[:SENDER|:RECEIVER]->(u2:User) 
WHERE (u.username = "brendanh")
WITH u2,m,type(r) as action ORDER BY m.created_at DESC
WITH u2,head(collect({type:type(r), msg: m})) as conv
RETURN  u2.username, conv.msg.body, conv.type
匹配(u:用户)(u2:用户)
其中(u.username=“brendanh”)
使用u2,m,键入(r)作为m在DESC处创建的动作顺序
使用u2,head(collect({type:type(r),msg:m}))作为conv
返回u2.username、conv.msg.body、conv.type
我收到一个错误“r未定义”,我不熟悉type(),在文档中没有看到它(尽管可能我没有在正确的位置搜索)。编辑:哦!我想你的意思是:
使用u2,head(collect({type:action,msg:m}))作为conv
,我想这是可行的!好极了非常感谢。我得到了一个错误“r not defined”,我不熟悉type(),并且在文档中没有看到它(尽管可能我没有在正确的位置搜索)。编辑:哦!我想你的意思是:
使用u2,head(collect({type:action,msg:m}))作为conv
,我想这是可行的!好极了非常感谢。