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