Neo4j 急切加载 ActiveRel
Neo4j eager load ActiveRel
我正在尝试获取可能仅与特定用户和 return 关系相关的特定关键字。
Keyword.where(text: ['key1', 'key2'])
.tagged_users(:u, :rel)
.where(uid: [100, 101])
.pluck(:rel).each_with_object({}) do |rel, obj|
uid = rel.to_node.uid
keyword = rel.from_node.text
obj[uid] ? obj[uid] << keyword : obj[uid] = [keyword]
end
假设我们与用关键字 'key2' 标记的用户 100 只有一个关系,所需的结果是 { 100 => ['key2'] }
上面的代码有效,但是对于每个 rel
它正在对数据库执行 2 次查询;一份用于 rel.to_node
一份用于 rel.from_node
.
我希望有 'eager load' rel.from_node
和 rel.to_node
的解决方案,因此整个代码段只会执行一个查询。
(另一种解决方案是每个关键字 运行 并为其标记用户,但这也需要很多查询。)
解决方案是添加 with_associations
所以我们甚至不需要关系对象。
def self.uids_to_keywords(keywords, user_ids)
Keyword.where(text: keywords).tagged_users.with_associations(:keywords)
.where(user_id: user_ids).each_with_object({}) do |user, obj|
obj[user.user_id] = keywords & user.keywords.map(&:text)
end
end
我正在尝试获取可能仅与特定用户和 return 关系相关的特定关键字。
Keyword.where(text: ['key1', 'key2'])
.tagged_users(:u, :rel)
.where(uid: [100, 101])
.pluck(:rel).each_with_object({}) do |rel, obj|
uid = rel.to_node.uid
keyword = rel.from_node.text
obj[uid] ? obj[uid] << keyword : obj[uid] = [keyword]
end
假设我们与用关键字 'key2' 标记的用户 100 只有一个关系,所需的结果是 { 100 => ['key2'] }
上面的代码有效,但是对于每个 rel
它正在对数据库执行 2 次查询;一份用于 rel.to_node
一份用于 rel.from_node
.
我希望有 'eager load' rel.from_node
和 rel.to_node
的解决方案,因此整个代码段只会执行一个查询。
(另一种解决方案是每个关键字 运行 并为其标记用户,但这也需要很多查询。)
解决方案是添加 with_associations
所以我们甚至不需要关系对象。
def self.uids_to_keywords(keywords, user_ids)
Keyword.where(text: keywords).tagged_users.with_associations(:keywords)
.where(user_id: user_ids).each_with_object({}) do |user, obj|
obj[user.user_id] = keywords & user.keywords.map(&:text)
end
end