我有一个cypher查询,它返回推荐给用户跟踪的用户列表,但在执行cypher时得到重复的结果。
下面是cypher查询:
MATCH (user:User { id: $userId })
MATCH (user)-[interestRel:INTERESTED_IN]->()<-[:INTERESTED_IN]-(recommendedUsers)
WITH DISTINCT recommendedUsers, interestRel, user
WHERE NOT recommendedUsers = user AND
NOT exists((user)-[:FOLLOWING]->(recommendedUsers))
RETURN recommendedUsers {
.id,
following: false
} ORDER BY interestRel.interestLevel DESC SKIP $skip LIMIT $limit我知道会有重复,因为一个用户可能是INTERESTED_IN多个节点,所以当遍历INTERESTED_IN关系时,对于每个具有INTERESTED_IN关系的节点,将返回重复的用户。但是我正在返回DISTINCT用户,所以我不明白为什么仍然返回重复的用户。
我注意到,当INTERESTED_IN关系绑定到查询中使用的变量(interestRel)时,就会返回重复的结果。
如何在去掉重复项的同时仍然引用INTERESTED_IN (interestRel)关系?
发布于 2021-11-06 18:59:12
DISTINCT在您的例子中过滤掉recommendedUsers、interestRel、user的不同组合,而不仅仅是distinct用户。因此,当您有一个与用户有两个共同兴趣的recommendedUser时,他出现两次是合乎逻辑的。
您似乎有兴趣返回对user高度感兴趣的内容感兴趣的recommendedUser。
也就是说,我将按如下方式编写查询:
MATCH (user:User { id: $userId })-[interestRel:INTERESTED_IN]->()<-[:INTERESTED_IN]-(recommendedUser)
WITH user,recommendedUser,
MAX(interestRel.interestLevel) AS interestLevel
WHERE NOT recommendedUser = user AND
NOT exists((user)-[:FOLLOWING]->(recommendedUser))
RETURN interestLevel,
recommendedUser {
.id,
following: false
} ORDER BY interestLevel DESC SKIP $skip LIMIT $limit注意:我使用单数形式,所以recommendedUser b/c我认为它使查询更容易理解。
https://stackoverflow.com/questions/69864989
复制相似问题