我对如何在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)
答案 0 :(得分:1)
当您MERGE
节点neo4j查找该节点的所有属性时。
如果找不到具有所有属性的节点,它将创建一个新节点。
在您的情况下,已存在Payment_account
的{{1}}节点。合并节点时使用相同的节点
payment_account_id
但不同的payment_account_id
,email
属性,neo4j尝试创建具有指定属性的新节点。
由于bank_name
上有唯一性约束,因此无法创建节点。
解决方案仅针对唯一属性payment_account_id
,然后更新其他属性(就像您在示例中所做的那样)。
如果您不想每次都设置节点属性,则必须检查该属性是否已存在。
MERGE