使用带有字典列表的Unwind的Neo4j Python驱动程序

6ie5vjzr  于 2022-12-18  发布在  Python
关注(0)|答案(2)|浏览(137)

我正在尝试批量合并来创建多个节点。使用下面的代码,

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

我不知道为什么会发生这种情况,任何帮助都非常感谢。

gt0wga4j

gt0wga4j1#

下面是一个使用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()

样品结果:

wpcxdonn

wpcxdonn2#

您可能需要调整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")

相关问题