Я столкнулся с технической проблемой, связанной с использованием Neo4j, которая на некоторое время поставила меня в тупик. Моя организация использует Neo4j для моделирования моделей взаимодействия с клиентами. График вырос до размера около 2 миллионов узлов и 7 миллионов ребер. Все узлы и ребра имеют от 5 до 10 свойств метаданных. Каждый день мы экспортируем данные обо всех наших клиентах из Neo4j в серию процессов Python, которые выполняют бизнес-логику.
Наш оригинальный метод экспорта данных заключался в использовании разбитых на страницы шифровых запросов для извлечения необходимых нам данных. Для каждого клиентского узла запросы шифров должны были собирать множество типов окружающих узлов и ребер, чтобы бизнес-логика могла выполняться в необходимом контексте. К сожалению, с ростом размера и плотности данных эти постраничные запросы стали занимать слишком много времени, чтобы быть практичными.
Наш текущий подход использует собственную процедуру Neo4j для итерации по узлам, сбора необходимых окружающих узлов и ребер, сериализации данных и помещения их в очередь Kafka для последующего потребления. Этот метод работал в течение некоторого времени, но теперь занимает достаточно много времени, так что он также становится непрактичным, особенно если учесть, что мы ожидаем, что график вырастет на порядок величины.
Я пробовал проекты cypher-for-apache-spark и neo4j-spark-connector , ни один из которых не смог обеспечить скорость запросов и передачи данных, которые мы необходимость.
В настоящее время мы работаем на одном экземпляре Neo4j с 32 ГБ памяти и 8 ядрами. Поможет ли кластер смягчить эту проблему?
Есть ли у кого-нибудь какие-либо идеи или советы о том, как выполнить такой экспорт данных? Любое понимание проблемы будет с благодарностью!