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
)只有在结果行中的 user
与 current_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
。
只是想在设计和效率方面对此发表意见。
假设您有一个喜欢音乐的社交网络。
如果您有类似 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
)只有在结果行中的 user
与 current_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
。