考虑这个密码查询
MATCH (a : User)-[c : Commented]->(b) RETURN DISTINCT a.username AS
username, b.postId AS postId, COLLECT({commentBody : c.comments,
commentedOn : c.time})[0..5] AS commentData LIMIT 20;
查询从1开始返回'c'并将其限制为5.我如何获取最后五个'c'然后通过commentedOn对它们进行排序。注意**'a'和'c'之间关系数的计数是未知的,可能是1可能是1000。
我想要实现的是,返回20个'a'节点,该路径的最后5个相关关系'c'。 例如。你的Instagram主页可以有20个帖子,每个帖子可能在一个帖子集合下有很多评论,对吧?我能够实现到这里,我可以收集前5个关系'c',我的问题是我如何收集最后5个关系'c',因为我必须匹配20'a'节点。
答案 0 :(得分:0)
如果我正确理解了这个问题,你想获取最后五条评论 - 即按时间戳(降序)对它们进行排序,然后排在前5位。使用WITH
将查询链接在一起,例如:< / p>
MATCH (a : User)-[c : Commented]->(b)
WITH DISTINCT
a.username AS username,
b.postId AS postId,
c.comments AS commentBody,
c.time AS commentedOn
ORDER BY commentedOn DESC
LIMIT 5
RETURN
username, collect({postId : postId, commentBody : commentBody, commentedOn : commentedOn}) AS commentData
LIMIT 20
答案 1 :(得分:0)
您希望使用WITH,以便您可以使用查询的第一部分匹配20个用户,然后与这些用户一起收集每个用户的最后5条评论。
这样的事情应该起作用或至少让你输掉
MATCH (a : User)
// only interested in users that have commented
WHERE (a)-[:Commented]->()
WITH a LIMIT 20
// for those 20 users, get all their comments
MATCH (a)-[c : Commented]->(b)
// order results by time so we collect comments in order later
WITH a, c, b
ORDER BY c.time DESC
// return results, getting only the slice of 5 collected comments for each user
RETURN a.username AS username, COLLECT({commentBody : c.comments, commentedOn : c.time, postId : b.postId})[0..5] AS commentData