1

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

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

如果您music.users对这些用户有类似的查询,并且想要识别您的朋友。从视觉上看,您想添加一个功能来识别这些朋友,也许您的所有朋友的个人资料上都有一个星号,而非朋友则独自一人。

检查每个用户是否是朋友真的是低效/昂贵吗?替代方法?

4

1 回答 1

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

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

.optional(:friends, :friend)就像 call 一样.friends(:friend),但是使用密码而OPTIONAL MATCH不是 aMATCH来查询关联。

对于is_friend部分,这转化为RETURN friend IS NOT NULL AS is_friend. 实际上,由于这是 a pluckAS所以 没有必要,所以它可能只是.pluck(:user, 'friend IS NOT NULL')。由于它正在执行OPTIONAL MATCHfriend因此查询中的变量(即)仅在结果行中的 与 为朋友时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在这种情况下我将其替换为。

于 2015-03-09T11:21:37.347 回答