Скажем, я хочу обновить значительное количество уже существующих узлов, используя данные, которые, например, хранятся в pd.Dataframe. Поскольку я знаю, как написать параметризованный запрос, который будет обрабатывать обновление одного узла, мое основное решение - задать этот запрос в цикле и запустить его для каждой строки во фрейме данных.
for _,row in df.iterrows():
query='''MATCH (p:Person)
WHERE p.name = {name} AND p.surname = {surname}
SET p.description = {description} '''
tx.run(query,name=row['name'],surname=row['surname'],
description=row['description'])
Однако должен быть более прямой (и более быстрый) способ передачи этой информации в запрос, чтобы итерация «управлялась» на стороне сервера. Это правда? Мне не удалось найти для этого никакой документации.





Вы можете сделать это, выполнив запрос cypher НАГРУЗКА и предоставив файл csv, содержащий ваши данные:
LOAD CSV WITH HEADERS FROM 'file:///file.csv' as csvLine fieldterminator ';'
MATCH (p:Person {name:csvLine.name, p.surname:csvLine.surname})
SET p.description=csvLine.description
Но я не думаю, что есть решение передать массив данных в цикл сопоставления.
Вместо того, чтобы зацикливаться, как это, с одним запросом Cypher, выполняемым для каждой записи, вы должны собрать все это в параметр списка объектов карты и сделать один запрос Cypher (вы можете выполнить пакетный запрос, если у вас есть> 100k или около того записей для обработки). У Майкла Хунгера есть хорошая запись в блоге об этом подходе.
Вы можете использовать UNWIND в параметре списка, чтобы преобразовать его в строки и обрабатывать все сразу. Предполагая, что вы передали список как data:
UNWIND $data as row
MATCH (p:Person)
WHERE p.name = row.name AND p.surname = row.surname
SET p.description = row.description
Основная проблема уже решена в ответе InverseFalcon, но чтобы дать полный ответ, включая py2neo и pandas bits, я отправляю код ниже:
query='''UNWIND {batch} AS row
MATCH (p:Person)
WHERE p.name=row.name AND p.surname = row.surname
SET p.description=row.description '''
graph.run(query,batch=df.to_dict(orient='records'))
Итак, в конце концов, это был больше вопрос neo4j, чем вопрос py2neo, и соответствующая часть информации в документации neo4j - здесь
Похоже на что-то вроде взлома ... Но все равно спасибо. Посмотрим, появится ли что-нибудь получше.