2014-11-24 99 views
1

我可能在錯誤的軌道上,所以我可以使用一些有用的輸入。我通過CSV文件從其他系統接收數據,我可以使用CSV LOAD將其導入到我的數據庫中。到現在爲止還挺好。CSV加載和更新現有節點/創建新節點

當我需要重新加載CSV以跟進更新時,我發生了困難。我無法刪除以前的數據,因爲我可能已經附加了額外的用戶輸入,所以我需要一個查詢來導入CSV數據,進行匹配,當它找到節點時,它將使用SET來覆蓋現有屬性。說我不確定如何捕捉數據庫中沒有節點的情況(新記錄),我們需要創建一個節點。

LOAD CSV FROM "file:xxx.csv" AS csvLine 
MATCH (c:Customer {code:"ABC"}) 
SET c.name = name: csvLine[0] 
***OPTIONAL MATCH // Here I am unsure how to express when the node is not found*** 
MERGE (c:Customer { name: csvLine[0], code: csvLine[1]}) 

所以理想的Cypher會檢查該節點是否存在,並通過設置更新新的屬性與CSV來不來 - 如果節點無法找到 - 創建一個新的與CSV數據。

而且 - 作爲旁註:如何找到不在CSV文件中但在數據庫中的節點,以便將它們標記爲過時? (這可能無法導入,但也許有人有一個想法,如何解決這個問題,以保持數據庫清理已刪除的記錄 - 只有通過與最新的CSV導入比較才能發現 - 這對每個想法都很滿意)。

任何想法或提示如何在導入時編寫查詢以更新圖形?

回答

2

您需要使用MERGE s ON MATCH和/或ON CREATE處理程序,請參閱http://neo4j.com/docs/stable/query-merge.html#_use_on_create_and_on_match。我假定第二列中的客戶代碼是標識符 - 因此第一列中的名稱可能會更新:

LOAD CSV FROM "file:xxx.csv" AS csvLine 
MERGE (c:Customer {code:csvLine[1]}) 
ON CREATE SET c.name = csvLine[0] 
ON MATCH SET c.name = csvLine[0]