Python Neo4j-py2neo合并

Python Neo4j-py2neo合并,python,neo4j,py2neo,Python,Neo4j,Py2neo,我有一些关于如何利用py2neo中的graph.merge的问题。 我正在尝试在Neo4j中搜索,以查找是否存在帐户节点,并将其与付款更改事件链接 account_node = graph.find_one('Payment_account', property_key="payment_account_id", property_value=payment_account_id) if not account_node: account_

我有一些关于如何利用py2neo中的graph.merge的问题。 我正在尝试在Neo4j中搜索,以查找是否存在帐户节点,并将其与付款更改事件链接

        account_node = graph.find_one('Payment_account', property_key="payment_account_id", property_value=payment_account_id)
        if not account_node:
            account_node = Node('Payment_account', payment_account_id=payment_account_id,\
                email=email, bank_name=bank_name, account_number=account_number
        changed_to_edge = Relationship(payment_change_event_node, 'CHANGED_TO', account_node)
        graph.create(changed_to_edge)
我正在考虑将逻辑更改为使用graph.merge,如下所示,而不是使用find_one并更新图表

            account_node = Node('Payment_account', payment_account_id=new_payment_account_id)
            graph.merge(account_node)
            account_node['email'], account_node['bank_name'] = email, bank_name
            account_node['account_numner'] = account_number
            graph.push(account_node)
            changed_to_edge = Relationship(payment_change_event_node, 'CHANGED_TO', account_node)
            graph.create(changed_to_edge)
但是,我的问题是,通过执行上述操作,我需要始终重写所有节点

py2neo是否有任何方法可以合并所有属性即使是非约束属性

假设account_节点的payment_account_id作为约束属性,email、bank_name和account_number是非约束属性

account_node = Node('Payment_account', payment_account_id=payment_account_id, email=email, bank_name=bank_name, account_number=account_number)
graph.merge(account_node)
graph.push(account_node)
changed_to_edge = Relationship(payment_change_event_node, 'CHANGED_TO', account_node)
graph.create(changed_to_edge)
现在我已经在neo4j中有了这个帐户节点

帐户节点:付款帐户\u id='123',电子邮件='abc@abc.com'银行名称='mybank',账号='123456'

然后我想运行进程来更改它,以检查此节点是否已更改。如果某些非约束属性发生更改,我希望更新它们

如果没有,我不想触摸它,只想将它链接到付款\更改\事件\节点

我试着去做

Node('Payment_account', payment_account_id=payment_account_id, email=email, bank_name=bank_name, account_number=account_number)
但它会抱怨合并

File "test_graph.py", line 159, in main
    graph.merge(account_node)

py2neo.database.status.ConstraintError: Node(443971) already exists with label `Payment_account` and property `payment_account_id` = 'xxxxxxxxxxxxxxx'
在py2neo中有没有有效的方法来实现这一点? 有这样的办法吗?我希望有一个函数只合并约束属性并更新更改的非约束属性

account_node = Node('Payment_account', payment_account_id=payment_account_id, email=email, bank_name=bank_name, account_number=account_number)
graph.merge(account_node)
graph.push(account_node)
changed_to_edge = Relationship(payment_change_event_node, 'CHANGED_TO', account_node)
graph.create(changed_to_edge)
合并节点时,neo4j将查找该节点的所有属性

如果未找到具有所有属性的节点,它将创建一个新节点

在您的情况下,具有Payment\u account\u id的Payment\u account节点已经存在。当您将一个节点与同一个节点合并时 payment_account_id但不同的电子邮件、银行名称属性,neo4j尝试创建具有指定属性的新节点

account_node = Node('Payment_account', payment_account_id=payment_account_id, email=email, bank_name=bank_name, account_number=account_number)
graph.merge(account_node)
graph.push(account_node)
changed_to_edge = Relationship(payment_change_event_node, 'CHANGED_TO', account_node)
graph.create(changed_to_edge)
由于您对付款账户id有唯一性约束,因此无法创建节点

解决方案是只合并unique属性,然后像在示例中那样更新其他属性

如果不希望每次都设置节点属性,则必须检查该属性是否已存在

account_node = Node('Payment_account', payment_account_id=new_payment_account_id)
graph.merge(account_node)
# check if you have to set a property
if account_node['email'] != email:
    account_node['email'] = email   
graph.push(account_node)

您对哪些属性有哪些约束/索引?我对付款账户有约束谢谢。我要找的实际上是某种部分合并。我们还能做吗?那是部分合并。没有py2neo函数用于此。您可以轻松地将其包装到merge_update函数中。