gpt4 book ai didi

ruby - 在 Neo4j.rb 中设置 "friends"(双向关系)的正确方法

转载 作者:数据小太阳 更新时间:2023-10-29 09:03:25 28 4
gpt4 key购买 nike

在具有双向关系的 User 之间创建关系的正确方法是什么?

假设我有:

class User
include Neo4j::ActiveNode

property :name, type: String
property :created_at, type: DateTime
property :updated_at, type: DateTime

has_many :both, :friends, model_class: 'User', type: 'connection' unique: true
has_many :in, :followers, model_class: 'User', type: 'connection', unique: true
has_many :out, :following, model_class: 'User', type: 'connection', unique: true
end

然后,

users = [
User.create(name: 'Foo'),
User.create(name: 'Bar'),
User.create(name: 'Baz'),
]

这会是合适的方法吗?这似乎非常低效:

users.each do |user|
user.friends << users.reject { |u| u == user }
end

最佳答案

如果你想确保user.friends返回其他两个用户,我实际上会这样做:

users.each do |user|
other_users = users.reject { |u| u == user || user.friends.include?(u) }
user.friends << other_users
end

现在 效率极低!它创建一个新数组并针对每个用户对数据库执行额外的查找。 (FWIW,include? 查找速度非常快。您也可以删除 reject 并再次遍历 users 以加快速度。)仍然有必要完成此操作,否则,您将创建重复关系.

设置unique: true在你的协会中只会在一个方向上拯救你。针对 has_many :both 的查询协会使用与方向无关的 Cypher MATCH但是CREATE Action 总是需要方向的,所以它们从左边的节点到右边的节点。 user1.friends << user2user2.friends << user1将在两个节点之间创建两个关系,每个方向一个。

编辑

正如您在 your own comment 中指出的那样使用 user.friends = [other_friends] 解决 Neo4j.rb 上的问题将始终清除所有现有关系并防止重复。这是解决问题的一种非常酷的方法。

关于ruby - 在 Neo4j.rb 中设置 "friends"(双向关系)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29781450/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com