neo4j cypher查询获取每个用户的第一篇文章

时间:2014-05-20 16:33:39

标签: neo4j cypher

我想从一组用户那里得到每个用户的第一篇文章。

(想象节点1,2,3 4是用户节点)

此查询返回所有用户之间最早的帖子:

START user=node(1, 2, 3, 4)
MATCH user <-[:creator]- post
WITH user, min(post.createdAt) as earliest
MATCH user <-[:creator]- post
WHERE post.createdAt = earliest
RETURN post

哪个查询会返回每个用户的最早/第一篇帖子?

1 个答案:

答案 0 :(得分:1)

我相信这会给你你想要的东西(每个用户的最早的帖子):

START user=node(1, 2, 3, 4)
MATCH user <-[:creator]- post
WITH user, min(post.createdAt) as earliest

MATCH (user2) <-[:creator]- (post2 {createdAt : earliest})
WHERE ID(user2) = ID(user)

RETURN user2,post

您的查询的第一部分显示正确,但在您的第二个MATCH语句中,您正在寻找任何(用户)&lt; - [:creator] - (post),其中帖子具有最早创建的时间。正如您所指出的,这只会返回一个(可能)条目。

为了获得每个用户最早的帖子,你的第二个MATCH需要以某种方式明确指定每个用户。我的示例使用 WHERE ID(user2)= ID(用户),但至少有一种其他方式可能更可取。如果您有一个用户的唯一属性,那么您可以在我的示例中指定属性值,就像(post2 {createdAt:earliest})一样。例如,您可以执行(user2 {username:user.username})之类的操作。请注意,在我的所有示例中,您还应该在第二个MATCH语句中使用另一个变量名来消除查询的歧义(如果没有别的话)(我不清楚它是否可以使用相同的变量名,但如果它们的话,它肯定会更加混乱)同样的)。

另外,我假设你是查询的缩写,你可能正在使用标签,所以查询看起来像这样:

 START user=node(1, 2, 3, 4)
 MATCH (user:USER) <-[:creator]- (post:POST)
 WITH user, min(post.createdAt) as earliest

 MATCH (user2:USER) <-[:creator]- (post2:POST {createdAt : earliest})
 WHERE ID(user2) = ID(user)

 RETURN user2,post

我希望这很清楚,随时澄清一下是不是。