簡體   English   中英

Neo4j py2neo合並

[英]Neo4j py2neo merge

我對如何在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作為約束屬性,而電子郵件,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)

當您MERGE的Neo4j查找該節點的所有屬性的節點。

如果找不到具有所有屬性的節點,它將創建一個新的節點。

在您的情況下,已經存在帶有payment_account_idPayment_account節點。 當您合並具有相同的payment_account_id但具有不同的emailbank_name屬性的節點時,neo4j會嘗試創建具有指定屬性的新節點。

由於您在payment_account_id上具有唯一性約束,因此無法創建該節點。

解決方案是僅對唯一屬性進行MERGE ,然后更新其他屬性(就像您在示例中所做的那樣)。

如果不想每次都設置節點屬性,則必須檢查該屬性是否已經存在。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM