Запрос производительности записи на 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.