2016-08-16 14 views
0

同様の質問がMichael Hungerによって2013年初旬に回答されましたが、Neo4j/Cypher 3.xへの回答を翻訳できません。複数のノードを1つのクエリで更新し、それぞれが異なるプロパティ/値のペアを持つ

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

次のような単純なサイファークエリは/更新を追加するために使用することができます任意の数のuuidsのプロパティの任意のセット。また、uuidが存在しない場合は、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を使用していますので、次のようにパラメータの構文を微調整する必要がありました。 '(オブジェクト)['uuid' => 'foo'、 'props' =>(オブジェクト)['enabled' => true]] ' 。本質的に配列を作成し、それをオブジェクトに型キャストします。 – DRB

+0

ID(x)でマッチングした場合、どうすればよいですか? – v4gil

+0

'MERGE(x {uuid:d.uuid})'を 'MERGE(x)WHERE ID(x)= d.id'に置き換えます。 – cybersam

関連する問題