Плагин Neo4J APOC (3.1.3.6) работает очень медленно

Я недавно обновил свой Neo4j до 3.1.3, и, кроме того, получил самый последний плагин APOC (3.1.3.6).

У меня был небольшой код, который работал нормально и мог создать ~3 миллиона отношений за полторы минуты. Но теперь он работает более 8 часов и не показывает никаких признаков остановки...

Поскольку код использовался без проблем, я надеюсь, что между версиями что-то изменилось, что привело к тому, что мой код был потерян.

Это rock_n_roll это должно быть изменено (может быть apoc.periodic.commit с позиционными аргументами что ли)? Спасибо за понимание.

Вот что я бегу.

CALL apoc.periodic.rock_n_roll(
  "MATCH (c:ChessPlayer),(r:Record) WHERE c.ChessPlayer_ID = r.ChessPlayer RETURN c,r",
  "CYPHER planner=rule WITH {c} AS c, {r} AS r CREATE (c)-[:HAD_RECORD]->(r)",
  200000)

1 ответ

Насколько я понимаю, что вызов запрашивает декартово произведение ChessPlayers и Records, а затем пытается отфильтровать их построчно, а затем выполнить пакетное обновление этих окончательных результатов (что потребляет много памяти, я думаю, что это одна транзакция открытия это то, что тебя убивает) Поэтому, если вы можете разбить его так, чтобы каждая транзакция могла касаться как можно меньшего количества узлов, она должна иметь возможность работать значительно лучше (особенно, если индексирован r.ChessPlayer, так как теперь вам не нужно загружать все из них)

CALL apoc.periodic.rock_n_roll(
  "MATCH (c:ChessPlayer) WHERE NOT EXISTS((c)-[:HAD_RECORD]->()) RETURN c",
  "MATCH (r:Record) WHERE c.ChessPlayer_ID = r.ChessPlayer WITH c,r CREATE UNIQUE (c)-[:HAD_RECORD]->(r)",
  100000)

period.commit() будет работать по аналогичному принципу. Чем меньше (меньше всего затронутых узлов) вы можете сделать каждую транзакцию, тем быстрее станет пакет.

Другие вопросы по тегам