2016-03-05 81 views
0

如何設置屬性名稱和它的值加載高瘦的CSV文件? csv文件將只包含3列,節點名稱(id),屬性名稱(p)和屬性值(v)。具有屬性的節點因此將對應於2行。如何在csv加載時設置屬性名稱和值?

LOAD CSV... row 
MERGE (n) WHERE n.Name = row.id 
SET n.{row.p} = row.v 

此語法不退出它只是爲了解釋我想要做什麼。有沒有辦法在cypher中做這樣的事情?這是非常有用的,而不是必須先轉換數據。

一個文件包含定義爲個人節點:

Name,Age 
A,25 
B,34 

第二個文件包含特定節點的屬性,每行一個屬性

Name,property_name,property_value 
A,weight,64 
A,height,180 
B,hair color,blond 

我想更新節點A和B根據第二個文件設置其他屬性。

正如下面提到的,一種可能性是創建(:數據),包含每一個屬性節點,並將其鏈接的個人節點

CREATE (p) -[:hasProperty]-> (:Data {Name: row.property_name, Value: row.property_value}) 

然而,這可能不是非常有效和提取個人節點和屬性得到更復雜。

MATCH (p:Person) --> (d:Data) 
RETURN {name: p.name, age: p.age, property_names: collect(d.Name), property_values: collect(d.Value)} 

Graal可以是在加載時動態設置屬性名稱,也可以是在節點上返回數據屬性的透視函數。

回答

0

您無法從參數動態分配屬性鍵,但由於該行是地圖,你可以設置所有的行爲節點 上的屬性,如果它是確定你:

LOAD CSV ... AS row 
MERGE (n:Label {Name: row.id}) 
SET n += row 

編輯

根據您的編輯,你的第二個文件,如果沒有像體重,身高等太多不同的值..你可以創建一個條件集,例如:

LOAD CSV WITH ... AS row 
WITH row, CASE row.property_name WHEN weight THEN [1] ELSE [] END as loopW 
UNWIND loopW as w 
MATCH (p:Person {name: row.Name}) 
SET p.weight = row.property_value 
WITH row, CASE row.property_name WHEN height THEN [1] ELSE [] END as loopH 
UNWIND loopH as h 
MATCH (p:Person {name: row.Name}) 
SET p.height = row.property_value 
... 
+0

我目前無法嘗試。看起來很有趣。那麼你將如何訪問節點中的屬性?當我嘗試n = row時,我最終以n.property_name和n.proverty_value作爲節點屬性,分別包含實際的屬性名稱和值。用n + =行我會得到一個兩個數組的property_name和_value? – Pierre

+0

那麼,如果你的列標題是名稱,那麼你將有一個屬性n.Name,同樣適用於所有的柱子。 + =基本上更新了屬性映射,其中as =將刪除不在行中的其他節點屬性 –

+0

高級瘦子csv有3列,id,p和v。P可以是與名稱id節點相關的年齡,大小和高度。我的猜測是,n + =行將重寫p和v。我的工作是創建屬性節點並將它們鏈接到節點,但因此問題在查詢級別相同(請參閱我的其他帖子),如果您想要報告一個節點及其屬性節點中保存的屬性。我實際上缺少了透視函數。 – Pierre

相關問題