neo4.rb: итерация использования памяти подмножеством узлов - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть модель Neo4j с узлами, которые являются людьми и птицами

(jim:Person)-[:LIKES]->(pigeon:Bird)

У меня есть 10 миллионов человек и 100 тысяч птиц, и я создаю Cypher с помощью невероятного neo4j.rb. Отношения имеют свойство timestamp, и я хотел бы удалить все отношения, которые старше определенной даты.

У меня есть Ruby метод delete_likes, который принимает птичий ActiveNode и делает это удаление отношения, которое работает нормально. Чтобы перебрать птиц, я затем

Bird.all.each { |bird| delete_likes(bird) }

Это работает, но медленно, поскольку есть много птиц, которым не нравится удалять, но я все равно перебираю их. Я думал, что смогу ускорить процесс с помощью

Bird
  .as(:bird)
  .liked_by(:person, :like)
  .where('like.timestamp < ?', cutoff)
  .pluck(:bird)
  .each { |bird| delete_likes(bird) }

, другими словами, выполнить запрос, чтобы найти только те узлы, к которым применима функция. Хотя этот код дает те же результаты в модульных тестах, я обнаружил, что в сравнении с графиком размером c он использует всю память на моем (приличном) ноутбуке и приводит к сбою на моем сервере Rails, что меня огорчает.

Я немного озадачен, почему итерация по всем птицам практически не использует память, в то время как итерация по подмножеству использует так много. Я делаю что-то глупое здесь? Есть ли лучший способ?

...