【问题标题】:Cypher returning duplicate results when relationship is referenced引用关系时,Cypher 返回重复的结果
【发布时间】:2021-12-20 04:50:52
【问题描述】:

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

这是密码查询:

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

【问题讨论】:

  • 你可以总结兴趣水平,我猜这很有意义
  • 是的,我想是的。谢谢

标签: neo4j cypher neo4j-driver


【解决方案1】:

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

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

也就是说,我将查询如下:

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 我认为它使查询更容易理解ab。

【讨论】:

  • 谢谢,但使用MAX(interestRel.interestLevel) 将返回用户的最高兴趣,而ORDER 将返回用户的最高兴趣,这使得所有推荐用户的ORDERing 相同。我认为我需要的是sum(interestRel.interestLevel),它将sum interestLevel 用于找到recommendedUser 的所有路径。这使得每个recommendedUserinterestLevel 都不同。
  • 你也可以使用 SUM() ,这取决于你的需要。你可能会得到 20 个匹配的 1 级,而 4 个匹配的 5 级......
猜你喜欢
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多