Neo4j gem - 根据有效关系检查每个对象?

Neo4j gem - Checking each object against a relationship effecient?

只是想在设计和效率方面对此发表意见。

假设您有一个喜欢音乐的社交网络。

如果您有类似 music.users 的查询,并且您想从这些用户中识别出您的朋友。视觉上你想添加一个特征来识别这些朋友,也许你所有的朋友的个人资料上都有一个星号,而不是朋友。

检查每个用户是否是朋友真的inefficient/expensive吗?替代方法?

result = music.users(:user)
              .optional(:friends, :friend)
              .where(neo_id: current_user.neo_id)
              .pluck(:user, is_friend: 'friend IS NOT NULL')

这将 return 一个元组数组:关联中的每个用户,以及一个布尔值,说明他们是否是当前用户的朋友

.optional(:friends, :friend) 类似于调用 .friends(:friend),但是在密码中使用 OPTIONAL MATCH 而不是 MATCH 来查询关联。

对于 is_friend 部分,转换为 RETURN friend IS NOT NULL AS is_friend。实际上,因为这是一个 pluck,所以 AS 不是必需的,所以它可以只是 .pluck(:user, 'friend IS NOT NULL')。由于它正在执行 OPTIONAL MATCH,查询中的 friend 变量(即 current_user)只有在结果行中的 usercurrent_user.

您可以做的一件事是调用 to_cypher 以查看将生成什么查询,以帮助理解查询链将执行的操作。在这种情况下,那将是:

puts music.users(:user)
          .optional(:friends, :friend)
          .where(neo_id: current_user.neo_id)
          .return(:user, is_friend: 'friend IS NOT NULL')
          .to_cypher

pluck是一个return数组而不是查询链对象的方法,所以我在这种情况下将其替换为return