2016-11-24 57 views
1

我有一個節點表和邊緣表,它們都可以作爲CSV文件使用。 我設法通過加載節點表:如何使用Neo4j包含具有NULL值的屬性MERGE

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///NodesETL.csv' AS line 
CREATE (:InfoNodes {id: toString(line.id), description: toString(line.description)}) 

此查詢創建與CSV文件的字段值的InfoNodes作爲屬性:InfoNodes這是好的。

信息節點與其他信息節點具有關係,例如,這些關係存在於具有相同標籤的節點之間。 這些關係存儲在可作爲附加CSV文件提供的邊緣表中。 該Edge表的每一行都包含idfrom和idto字段,它們根據id屬性定義InfoNode之間的關係。 邊緣表格還包含3個表示關係屬性的附加字段。第一個屬性始終是一個字符串,並且從不爲NULL,例如從來沒有空的字符串。第二個屬性和第三個屬性都是類型字符串,可以具有「」的NULL值。所以secondproperty和/或thirdproperty可以包含NULL值。 我嘗試使用這個邊緣的創建表的[:{關係:, firstproperty :, secondproperty thirdproperty:}]之間的關係:借:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///EdgesETL.csv' AS line 
MATCH (from:InfoNodes{id: toString(line.idfrom)}) 
MATCH (to:InfoNodes{id: toString(line.idto)}) 
MERGE (from)-[:RELATION {firstproperty: toString(line.firstproperty), secondproperty: toString(line.secondproperty), thirdproperty: toString(line.thirdproperty)}]->(to) 

這第二個暗號腳本結果爲錯誤時secondproperty(InfoNodes) Edge表中的第三個屬性包含NULL值。 Neo4j錯誤消息是:無法合併使用第二屬性的空屬性值的關係。 當我從第二腳本secondproperty場和secondproperty刪除:屬性比同類型的錯誤發生時提thirdproperty:使用空屬性值thirdproperty 當我刪除secondproperty不能合併的關係,並從以前的腳本thirdproperty字段和屬性,則[:關係]創建信息節點之間的關係,包括以第一屬性存儲的第一個屬性表字段:[:RELATION]關係的屬性。

問題:如何擴展第二個腳本,以便從Edge表中將第二個屬性和第三個屬性字段加載到第二個屬性:以及包含NULL值的[:RELATION]關係的第三個屬性:?

Can't MERGE with null values; 'Cannot merge node using null property value' in neo4j描述了同樣的問題,但沒有回答我在多個字段/與NULL值的屬性的情況下的問題。

+0

是否有相同的節點之間的多重關係,但與一些屬性的值不同?或者(idfrom,idto)對是否都是唯一的? –

+0

:InfoNodes可以與其他InfoNode有一個或多個關係,但在多重關係的情況下,每個關係都有自己的標籤。因此,InfoNods之間的多個關係在Edge表中具有其自己的唯一IDfrom/idto,並將它們自己的關係屬性作爲字段。 – Luc

回答

2

您需要重新審閱開發人員指南中的MERGE section。具體來說,在介紹中,提到了ON CREATE和ON MATCH。這使您可以在MERGE導致創建的情況下設置屬性,或者MERGE與現有元素匹配時設置屬性。

通常情況下,您只想合併唯一定義事物(如ID)的屬性,並在ON CREATE內設置其餘屬性。

你的這種變化後,查詢可能是這個樣子:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///EdgesETL.csv' AS line 
MATCH (from:InfoNodes{id: toString(line.idfrom)}) 
MATCH (to:InfoNodes{id: toString(line.idto)}) 
MERGE (from)-[r:RELATION {firstproperty: toString(line.firstproperty)}]->(to) 
ON CREATE SET r.secondproperty = toString(line.secondproperty), r.thirdproperty = toString(line.thirdproperty) 
+0

謝謝InverseFalcon。我承認,我是Cypher的新手,這是祕密。我確實嘗試了ON CREATE和ON MERGE子句,但我確實瞭解並取得了成功。通過你的回答,我明白這些條款的運作。 – Luc

相關問題