Самый быстрый способ выполнить массовое добавление/вставку в 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 запросами.