Neo4j стремится загрузить ActiveRel - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь получить конкретные ключевые слова, которые МОГУТ быть связаны ТОЛЬКО с конкретными пользователями, и вернуть отношения.

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

Предполагая, что у нас только одна связь с пользователем 100, помеченным ключевым словом 'key2', желаемый результат равен {100 => ['key2']}

Приведенный выше код работает, но для каждого rel он выполняет 2 запроса к БД; один для rel.to_node и один для rel.from_node.

Я надеялся, что есть решение для «быстрой загрузки» rel.from_node и rel.to_node, поэтому для всего фрагмента будет выполнен только один запрос.

(Другое решение - запускать для каждого ключевого слова и получать его помеченных пользователей, но это также требует много запросов.)

1 Ответ

0 голосов
/ 13 января 2019

Решением было добавить 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
...