2016-03-18 9 views
0

ユーザーが私のデータベースのノードを参照するUUIDの配列を渡しています。私は彼女のUSERノードをこれらの他のノードのそれぞれに関連づけたいと思います。課題は、UUIDが私に与えられた順序を知りたいということです。Neo4jサイファークエリの値をインクリメントする

のUUIDがあるのであれば:[AAA、CCC、BBB]、私のような何かを実行したい:

もちろん
(user)-[:REL {order: 1}]->(:THING {name:"AAA"}) 
(user)-[:REL {order: 2}]->(:THING {name:"CCC"}) 
(user)-[:REL {order: 3}]->(:THING {name:"BBB"}) 

を、私は複数のステートメントでそれを行うにはしたくありません。私はそのリストをパラメータとして渡したいと思います。

MATCH(u:USER {id:{id}}) 
MATCH(t:THING) where t.name in {that_list} 
CREATE (u)-[:REL {order: ???}]->(t) 

???に注意してください。それが重要です。

これはどのように達成できますか?私はループを使ってテストをパスしていますが、これを行うことができるはずです。

+0

あなたのユースケースはわかりませんが、 'THING'ノードを順番に連鎖することを考えていますので、' order'プロパティを持つ必要はありません。このように: '(user) - [:REL] - >(:THING {名前:" AAA "}) (:THING {名前: "CCC"}) '? – cybersam

+0

@cybersamそれはとても賢いです。私は私のケースでそれを行うことができるかどうかはわかりませんが、それは非常にグラフィカルです。私はそれが好きです。 –

答えて

1

これはあなたのために働くかもしれない:

MATCH(u:USER {id:{id}}) 
UNWIND {that_list} AS name 
MATCH(t:THING) WHERE t.name = name 
WITH u, COLLECT(t) AS things 
FOREACH(i IN RANGE(0, SIZE(things)-1) | 
    FOREACH(x IN [things[i]] | CREATE (u)-[:REL {order: i}]->(x))); 

UNWINDは同じ順序で、別々のデータ行であなたのリストの各項目が利用できるようになります。

内部FOREACHは単一のノードでちょうど "反復"します。 CREATEパターンでノードの式を使用できないため、このトリックが使用されます。したがって、この論理的に同等の節は法的ではありませんでした:FOREACH(i IN RANGE(0, SIZE(things)-1) | CREATE (u)-[:REL {order: i}]->(things[i]))

+0

UNWINDは何をしていますか?その行を削除せず、代わりに次のWHERE節を 't.name IN {that_list}'に変更できますか? –

+0

入れ子にされたFOREACHがn^2関係を作成しているように見えます。 –

+0

1. neo4jは同じ順序で行を作成するので、 'UNWIND'はあなたのリストに順序を強制します。 'IN'構文は順序を保証するものではありません。 2.内側の 'FOREACH'は単一ノード上でちょうど"反復 "しているので、クエリは' O(N^2) 'ではありません。このトリックは、 'CREATE'パターンが式によって生成されたノードをサポートしないために使用されます。 – cybersam

関連する問題