Neo4j py2neo合并

时间:2018-01-29 19:11:20

标签: python neo4j py2neo

我对如何在py2neo中利用graph.merge()有一些疑问。 我正在尝试在Neo4j中搜索是否存在已存在的account_node并将其与payment_change_event链接。

        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_node将payment_account_id作为约束属性,而email,bank_name和account_number是非约束属性。

现在我已经在neo4j中拥有了这个account_node。

account_node:payment_account_id ='123',email ='abc @ abc.com',bank_name ='mybank',account_number ='123456'

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

如果不是,我不想触摸它,只需将其链接到payment_change_event_node。

我尝试做

Node('Payment_account', payment_account_id=payment_account_id, email=email, bank_name=bank_name, account_number=account_number)

但它会在merge()上抱怨。

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)

1 个答案:

答案 0 :(得分:1)

当您MERGE节点neo4j查找该节点的所有属性时。

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

在您的情况下,已存在Payment_account的{​​{1}}节点。合并节点时使用相同的节点 payment_account_id但不同的payment_account_idemail属性,neo4j尝试创建具有指定属性的新节点。

由于bank_name上有唯一性约束,因此无法创建节点。

解决方案仅针对唯一属性payment_account_id,然后更新其他属性(就像您在示例中所做的那样)。

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

MERGE