neo4j Cypher Grouping

时间:2016-02-19 02:31:45

标签: neo4j cypher graph-databases nosql

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

到目前为止我已经

match(n:Tweet)return distinct(n.userId),n

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

2 个答案:

答案 0 :(得分:1)

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

通常在sum(或{{1}中使用聚合函数(例如countcollectRETURN等...)时说话Neo4j将自动按子句中的其他列分组。以下是您可能会做的一些示例:

WITH

这将为每条推文userdd#1234提供一行,并为每条推文提供转推数量。

答案 1 :(得分:1)

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

因此,如果您想了解用户是否进行过对话,请执行以下操作:

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索引中查找。