Запрос производительности записи на neo4j с py2neo

В настоящее время я изо всех сил пытаюсь найти эффективный способ, выполняя несколько запросов с py2neo. Моя проблема в том, что у меня большой список запросов на запись в python, которые должны быть записаны в neo4j.

Я попробовал несколько способов решить проблему прямо сейчас. Лучший рабочий подход для меня был следующий:

from py2neo import Graph
queries = ["create (n) return id(n)","create (n) return id(n)",...] ## list of queries
g = Graph()
t = graph.begin(autocommit=False)
for idx, q in enumerate(queries):
    t.run(q)
    if idx % 100 == 0:
        t.commit()
        t = graph.begin(autocommit=False)
t.commit()

Это все еще занимает много времени для написания запросов. Я также попытался запустить многие из apoc безуспешно, запрос не был завершен. Я также попробовал тот же метод записи с автоматической фиксацией. Есть лучший способ сделать это? Есть ли какие-то хитрости, такие как удаление индексов, а затем добавление их после вставки данных?

- Изменить: Дополнительная информация:

Я использую Neo4j 3.4, Py2neo v4 и Python 3.7

1 ответ

Вы можете прочитать советы и хитрости Майкла Хангера для быстрого пакетного обновления.

Ключевой трюк заключается в использовании UNWIND для преобразования элементов списка в строки, а затем последующие операции выполняются для каждой строки.

Существуют вспомогательные функции, которые могут легко создавать списки для вас, например range ().

Например, если вы хотите создать 10k узлов и добавить свойство name, а затем вернуть имя узла и его идентификатор графа, вы можете сделать что-то вроде этого:

UNWIND range(1, 10000) as index
CREATE (n:Node {name:'Node ' + index})
RETURN n.name as name, id(n) as id

Аналогичным образом, если у вас есть достаточное количество данных для импорта, вы можете создать список карт параметров, вызвать запрос, а затем ОТКЛЮЧИТЬ список для одновременной обработки каждой записи, аналогично тому, как мы обрабатываем файлы CSV с помощью LOAD CSV.

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