1

我有一个密码查询,它返回推荐给用户关注的用户列表,但是在执行密码时得到重复的结果。

这是密码查询:

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) 关系?

4

1 回答 1

1

在您的情况下,DISTINCT 过滤掉了推荐用户、interestRel、用户的不同组合,而不仅仅是不同的用户。因此,当您有一个与用户有两个共同兴趣的推荐用户时,他出现两次是合乎逻辑的。

您似乎有兴趣返回对高度感兴趣recommendedUser的事物感兴趣的 s user

也就是说,我将按如下方式编写查询:

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

注意:我使用单数版本,所以推荐用户 b/c 我认为它使查询更容易理解 ab。

于 2021-11-06T18:59:12.267 回答