Самый быстрый способ выполнить массовое добавление/вставку в Neo4j с помощью Python?
Я нахожу Neo4j медленным добавлять узлы и отношения/дуги/ребра при использовании REST API через py2neo для Python. Я понимаю, что это связано с тем, что каждый вызов API REST выполняется как отдельная автономная транзакция.
В частности, добавление нескольких сотен пар узлов с отношениями между ними занимает несколько секунд, работая на localhost.
Каков наилучший подход к значительному повышению производительности при работе с Python?
Будет ли использование bulbflow и Gremlin способом построения транзакции объемной вставки?
Спасибо!
Ответы
Ответ 1
Существует несколько способов создания массива с py2neo, каждый из которых делает только один вызов сервера.
- Используйте метод
create
для создания нескольких узлов и отношений в одной партии.
- Используйте оператор cypher CREATE.
- Используйте новый класс
WriteBatch
(только что выпущенный на этой неделе), чтобы вручную сделать партию узлов и отношений (это действительно просто ручная версия 1).
Если у вас есть код, я рад посмотреть на него и внести предложения по настройке производительности. Есть также немало тестов, на которые вы можете получить вдохновение.
Cheers,
Nige
Ответ 2
Производительность записи Neo4j медленная, если вы не делаете пакетную вставку.
Импортер партии Neo4j (https://github.com/jexp/batch-import) является самым быстрым способом загрузки данных в Neo4j. Это утилита Java, но вам не нужно знать ни одну Java, потому что вы просто запускаете исполняемый файл. Он обрабатывает типизированные данные и индексы и импортирует их из CSV файла.
Чтобы использовать его с лампочками (http://bulbflow.com/), используйте метод модели get_bundle()
для получения данных, имени индекса и индексные ключи, которые подготовлены для вставки, а затем выводят данные в файл CSV. Или, если вы не хотите моделировать свои данные, просто выведите данные из Python в CSV файл.
Будет ли это работать для вас?
Ответ 3
Там так много старых ответов на этот вопрос онлайн, что навсегда потребовалось реализовать инструмент импорта, который поставляется с neo4j. Это очень быстро и лучший инструмент, который я смог найти.
Вот простой пример, если мы хотим импортировать узлы узла:
bin/neo4j-import --into [path-to-your-neo4j-directory]/data/graph.db --nodes students
Файл студентов содержит данные, которые выглядят следующим образом:
studentID: Id (Student), имя, год: ИНТ,: LABEL
1111, Amy, 2000, студент
2222, Джейн, 2012, студент
3333, Джон, 2013, студент
Объяснение:
- Заголовок объясняет, как следует интерпретировать данные ниже.
- studentID - это свойство с идентификатором типа (Student).
- name имеет тип string, который является значением по умолчанию.
- year - целое число
- : LABEL - это метка, которую вы хотите для этих узлов, в этом случае это "Студент"
Вот документация для него: http://neo4j.com/docs/stable/import-tool-usage.html
Примечание. Я понимаю, что в вопросе конкретно упоминается python, но в другом полезном ответе упоминается решение, отличное от python.
Ответ 4
Ну, мне самому нужна огромная производительность от neo4j. В результате я улучшаю производительность графиков.
- Ditched py2neo, так как с ним было много проблем. Кроме того, очень удобно использовать конечную точку REST, предоставленную neo4j, просто убедитесь, что вы используете сеансы запросов.
- Используйте необработанные запросы cypher для массовой вставки вместо любого OGM (Object-Graph Mapper). Это очень важно, если вам нужна высокопроизводительная система.
- Производительности было недостаточно для моих нужд, поэтому я закончил писать пользовательскую систему, которая объединяет 6-10 запросов вместе с предложениями WITH * AND UNION. Это улучшило производительность в 3 - 5 раз.
- Используйте более крупный размер транзакции с наименее 1000 запросами.
Ответ 5
Вставить большую часть узлов с очень высокой скоростью в Neo4K
Batch Inserter
http://neo4j.com/docs/stable/batchinsert-examples.html
В моем случае я работаю над Java.