我有一个tweet节点数据库,每条推文都有一个userId字段,其中的关系基于是否回复了推文。我正在尝试编写一个查询,我按用户对所有推文进行分组,同时保留推文关系以查看用户之间的关系。
到目前为止我已经
了match(n:Tweet)return distinct(n.userId),n
但这不起作用,因为不保留关系。有人知道怎么做吗?
答案 0 :(得分:1)
我不太确定你在问什么...你在谈论关系,但你没有匹配。
通常在sum
(或{{1}中使用聚合函数(例如count
,collect
,RETURN
等...)时说话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
索引中查找。