2016-08-16 39 views
0

Michael Hunger在2013年初回答了一個類似的問題,但我無法將其答覆轉換爲Neo4j/Cypher 3.x.在單個查詢中更新多個節點,每個節點具有不同的屬性/值對

https://groups.google.com/forum/#!msg/neo4j/qZWhbMtMCTE/r3W7OZfCgAgJ

每個節點具有在與UUID值的屬性。 在某些情況下,「second」屬性是布爾值,在其他情況下是字符串。

我想更新其中一些節點,更改或添加屬性到每個節點。

(n1 {uuid:"foo1", enabled: true}) 
(n2 {uuid:"foo2", example: "foo"}) 
(n3 {uuid:"foo3"}) 

我當然可以爲每個單獨的MERGE和SET語句,但我一直希望有一個更優雅的解決方案:

MATCH (S {uuid:"foo0"}) 
MERGE (n2 {uuid:"foo2"})-[:BELONGS_TO]->(S) 
    SET n2.example="bar" 
MERGE (n3 {uuid:"foo3"})-[:BELONGS_TO]->(S) 
    SET n3.enabled=true 
+0

什麼是BELONGS_TO關係? – cybersam

+0

特定關係名稱「BELONGS_TO」是任意的。這種關係的目的是爲了確保這種類型的所有節點,即可能由MERGE創建的節點都連接到「S」節點。 – DRB

回答

3

下面的簡單的Cypher查詢可用於添加/更新任意數量的uuids的任意一組屬性。如果不存在,它也會爲uuid創建節點。

UNWIND {data} AS d 
MERGE (x {uuid: d.uuid}) 
SET x += d.props; 

,預計{data}parameter成爲對象的數組。以下數組包含相同的採樣數據作爲你的問題:

[ 
    {uuid: 'foo1', props:{enabled: true}}, 
    {uuid: 'foo2', props:{example: 'foo'}}, 
    {uuid: 'foo3', props:{}} 
] 

在每個數據數組元素中,props對象可以包含任何數量的屬性,和它們將被添加/在節點相應地更新與給定的uuid

+0

這正是我所需要的 - 謝謝! 我使用PHP缺乏對象文字,所以我需要調整參數語法如下: '''''' true]]' ..實質上創建一個數組並將其類型轉換爲對象。 – DRB

+0

如果您使用ID(x)匹配,您會如何做到這一點? – v4gil

+0

用MERGE(x)WHERE ID(x)= d.id'替換MERGE(x {uuid:d.uuid})'。 – cybersam

相關問題