neo4j 密码分组

neo4j Cypher Grouping

我有一个推文节点数据库,每条推文都有一个 userId 字段,该字段具有基于推文是否被回复的关系。我正在尝试编写一个查询,在其中按用户对所有推文进行分组,同时保留推文关系以查看用户之间的关系。

到目前为止我有

匹配(n:Tweet)return 不同(n.userId),n

但这不起作用,因为没有保留关系。有人知道怎么做吗?

我不太确定你在问什么......你在谈论关系,但你没有任何匹配。

一般来说,当您在 RETURN(或 WITH) 子句 Neo4j 将自动按子句中的其他列分组。以下是您可能会做的事情的示例:

MATCH (source_tweet:Tweet {userId: 1234})<-[:RETWEET_OF]-(retweet:Tweet)
RETURN source_tweet:Tweet.id, source_tweet:Tweet.text, count(retweet)

这将为您提供用户 ID #1234 发布的每条推文以及每条推文的转推次数的计数。

添加另一个答案以回应您的评论。

因此,如果您想了解用户是否进行过对话,您可以这样做:

MATCH (source_tweet:Tweet)<-[:REPLY_TO]-(reply_tweet:Tweet)
MATCH
  (source_user:User {userId: source_tweet.user}),
  (reply_user:User {userId: reply_tweet.user})
CREATE UNIQUE reply_user-[:REPLIED_TO]->(source_user)

那么你可以这样做:

MATCH (user1)-[:REPLIED_TO]-(user2)
WHERE ID(user1) < ID(user2)
RETURN user1.userId, user2.user_id

...获得所有组合。

虽然就像我说的,你真的应该在推文和用户之间建立关系,表明是哪个用户发了推文。如果你有查询可能是这样的:

MATCH (source_user:User)-[:WROTE]->(source_tweet:Tweet)<-[:REPLY_TO]-(reply_tweet:Tweet)<-[:WROTE]-(reply_user:User)
CREATE reply_user-[:REPLIED_TO]->(source_user)

而且这也应该快得多,因为您是在进行关系遍历而不是在 userId 索引中查找。