Драйвер Neo4j Python, использующий Unwind со списком словарей

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

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 })"
        ^}

Я понятия не имею, почему это происходит, любая помощь очень ценится.

Пожалуйста, исправьте синтаксис вашего кода. Благодарю.

jose_bacoy 02.12.2022 20:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, вам потребуется настроить синтаксис запроса 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 может обрабатывать записи создания и сопоставления.

jose_bacoy 02.12.2022 20:55
Ответ принят как подходящий

Ниже приведен рабочий код использования 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()

образец результата:

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