Самый быстрый способ выполнить массовое добавление/вставку в Neo4j с помощью Python?

Я обнаружил, что Neo4j медленно добавляет узлы и отношения/дуги/ребра при использовании REST API через py2neo для Python. Я понимаю, что это связано с тем, что каждый вызов REST API выполняется как одна автономная транзакция.

В частности, добавление нескольких сотен пар узлов с отношениями между ними занимает несколько секунд при работе на локальном хосте.

Каков наилучший подход для значительного повышения производительности при использовании Python?

Будет ли использование bulbflow и Gremlin способом построения транзакции массовой вставки?

Спасибо!


person wodow    schedule 28.09.2012    source источник
comment
не знаю, как это в python, но обычно в java вы можете использовать пакетную обработку. в py тоже должны быть подобные вещи.   -  person ulkas    schedule 01.10.2012
comment
Я попробовал py2neo и обнаружил, что он слишком медленный для пакетной вставки (или чего-то еще). Использование необработанной конечной точки REST было намного быстрее.   -  person twneale    schedule 27.02.2014


Ответы (5)


Существует несколько способов массового создания с помощью py2neo, каждый из которых выполняет только один вызов сервера.

  1. Используйте метод create для создания нескольких узлов и отношений в одном пакете.
  2. Используйте оператор Cypher CREATE.
  3. Используйте новый класс WriteBatch (только что выпущенный на этой неделе), чтобы вручную создать пакет узлов и отношений (на самом деле это просто ручная версия 1).

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

Привет, Найдж

person Nigel Small    schedule 29.09.2012
comment
Хороший ответ с вариантами, чтобы попробовать. Спасибо за предложение вашего времени - я свяжусь с вами, если я отклеюсь. - person wodow; 01.10.2012
comment
Я по-прежнему считаю, что создание 600 000 простых отношений между узлом категории и узлом данных с помощью get_or_create_relationships() занимает несколько часов. Есть идеи? - person Will; 20.12.2012
comment
Это все еще самые быстрые способы записи в Neo4j? Как насчет создания элементов внутри транзакции и фиксации, когда все сделано? - person confused00; 23.08.2016
comment
@NigelSmall, это предпочтительнее двухэтапного процесса, когда вы создаете файл GEOFF, а затем выполняете пакетный импорт, используя Load2Neo? - person zelusp; 20.12.2016
comment
@NigelSmall, какие-нибудь указатели на этот сообщение py2neo SO? - person zelusp; 28.12.2016

Производительность записи Neo4j низкая, если вы не выполняете пакетную вставку.

Пакетный импортер Neo4j (https://github.com/jexp/batch-import) — это самый быстрый способ загрузить данные в Neo4j. Это утилита Java, но вам не нужно знать Java, потому что вы просто запускаете исполняемый файл. Он обрабатывает типизированные данные и индексы, а также импортирует их из CSV-файла.

Чтобы использовать его с моделями Bulb (http://bulbflow.com/), используйте метод модели get_bundle() для получения данных. , имя индекса и ключи индекса, который подготовлен для вставки, а затем выводит данные в файл CSV. Или, если вы не хотите моделировать свои данные, просто выведите данные из Python в файл CSV.

Будет ли это работать для вас?

person espeed    schedule 01.10.2012
comment
Является ли пакетный импортер Neo4j лучшим вариантом? - person songololo; 10.06.2014

В Интернете так много старых ответов на этот вопрос, что мне потребовалась целая вечность, чтобы понять, что есть инструмент импорта, который поставляется с neo4j. Это очень быстро и лучший инструмент, который я смог найти.

Вот простой пример, если мы хотим импортировать студенческие узлы:

bin/neo4j-import --into [path-to-your-neo4j-directory]/data/graph.db --nodes students

Файл студентов содержит данные, которые выглядят так, например:

studentID:Id(Студент),имя,год:int,:LABEL

1111,Эми,2000,Студентка

2222,Джейн,2012,Студентка

3333,Джон,2013,Студент

Объяснение:

  • Заголовок объясняет, как следует интерпретировать данные под ним.
  • studentID — это свойство с типом Id(Student).
  • имя имеет строковый тип, который используется по умолчанию.
  • год - целое число
  • :LABEL — это метка, которую вы хотите использовать для этих узлов, в данном случае это Student.

Вот документация для него: http://neo4j.com/docs/stable/import-tool-usage.html

Примечание. Я понимаю, что в вопросе конкретно упоминается python, но в другом полезном ответе упоминается решение, отличное от python.

person Nadine    schedule 24.06.2015

Ну, у меня самого была потребность в массовой производительности от neo4j. В итоге я делаю следующие вещи, чтобы улучшить производительность графа.

  1. Отказался от py2neo, так как с ним было много проблем. Кроме того, очень удобно использовать конечную точку REST, предоставляемую neo4j, просто обязательно используйте сеансы запросов.
  2. Используйте необработанные шифрованные запросы для массовой вставки вместо любого OGM (Object-Graph Mapper). Это очень важно, если вам нужна высокопроизводительная система.
  3. Производительности по-прежнему не хватало для моих нужд, поэтому я закончил писать кастомную систему, которая объединяет 6-10 запросов вместе, используя предложения WITH * AND UNION. Это улучшило производительность в 3-5 раз.
  4. Используйте больший размер транзакции с не менее чем 1000 запросов.
person hspandher    schedule 24.06.2015
comment
Мне было бы интересно узнать, какие у вас проблемы с py2neo. - person Nigel Small; 25.06.2015

Вставить большую часть узлов на очень высокой скорости в Neo4K

Пакетная вставка

http://neo4j.com/docs/stable/batchinsert-examples.html

В моем случае я работаю над Java.

person Wesam Na    schedule 24.12.2015