Я пытаюсь выполнить пакетное слияние для создания нескольких узлов. Используя приведенный ниже код,
def test_batches(tx,user_batch):
result= tx.run(f"Unwind {user_batch} as user\
MERGE (n:User {{id: user.id, name: user.name, username: user.username }})")
Однако я получаю эту ошибку. Обратите внимание, что я передаю список словарей.
CypherSyntaxError: {code: Neo.ClientError.Statement.SyntaxError} {message: Invalid input '[': expected "+" or "-" (line 1, column 8 (offset: 7))
"Unwind [{'id': 1596859520977969156, 'name': 'Bigspuds', 'username': 'bigspuds777'}, {'id': 1596860505662144513, 'name': 'JOHN VIEIRA', 'username': 'JOHNVIE67080352'}, {'id': 1596860610905448449, 'name': 'biru nkumat', 'username': 'NkumatB'}, {'id': 1513497734711738374, 'name': 'elfiranda Hakim', 'username': 'Kidonk182'}, {'id': 1596836234860859392, 'name': 'Ecat Miao', 'username': 'sylvanasMa'}] as user MERGE (n:User {id: user.id, name: user.name, username: user.username })"
^}
Я понятия не имею, почему это происходит, любая помощь очень ценится.
Возможно, вам потребуется настроить синтаксис запроса Cypher, чтобы он соответствовал спецификации языка запросов Neo4j Cypher. Например, в предложении MERGE следует использовать синтаксис ON CREATE и ON MATCH, чтобы указать действия, которые следует предпринять, если узел уже существует или нет.
Вот пример того, как можно переписать запрос Cypher для использования синтаксиса ON CREATE и ON MATCH:
def test_batches(tx,user_batch):
result = tx.run(f"UNWIND {user_batch} as user
MERGE (n:User {{id: user.id, name: user.name, username: user.username }})
ON CREATE SET n = user
ON MATCH SET n += user")
В запросе нет ничего плохого. Merge может обрабатывать записи создания и сопоставления.
Ниже приведен рабочий код использования UNWIND для списка словарей. Обратите внимание, что рекомендуется передавать значение в качестве параметра, а не работать со строкой значения в запросе.
from neo4j import GraphDatabase
uri = "neo4j://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "awesomepassword"))
def test_batches(tx, user_batch):
tx.run("UNWIND $user_batch as user \
MERGE (n:User {id: user.id, name: user.name, username: user.username})", user_batch=user_batch)
with driver.session() as session:
user_batch = [
{'id': 1596859520977969156, 'name': 'Bigspuds', 'username': 'bigspuds777'},
{'id': 1596860505662144513, 'name': 'JOHN VIEIRA', 'username': 'JOHNVIE67080352'},
{'id': 1596860610905448449, 'name': 'biru nkumat', 'username': 'NkumatB'},
{'id': 1513497734711738374, 'name': 'elfiranda Hakim', 'username': 'Kidonk182'},
{'id': 1596836234860859392, 'name': 'Ecat Miao', 'username': 'sylvanasMa'}]
session.write_transaction(test_batches, user_batch)
driver.close()
образец результата:
Пожалуйста, исправьте синтаксис вашего кода. Благодарю.