あなたが直面する唯一の問題は、ステップのコレクションを反復するときに、コレクション内の要素を表すノードを認識できなくなることです。
ので、ハッキングのビット、あなたが識別子として機能するクエリの先頭にタイムスタンプを使用することができます。
WITH {steps: [ {name: 'step 1'}, {name: 'step2'}, {name: 'step3'}] } AS object
WITH object.steps AS steps, timestamp() AS identifier
UNWIND range(1, size(steps)-1) AS i
MERGE (s:Step {id: identifier + "_" + (i-1)}) SET s.name = (steps[i-1]).name
MERGE (s2:Step {id: identifier + "_" + (i)}) SET s2.name = (steps[i]).name
MERGE (s)-[:NEXT]->(s2)
説明:
私はUNWIND
とステップのコレクションを反復処理し、ためには、既に反復されたステップを表す各ノードを認識するために、トランザクションのタイムスタンプであるダミー識別子+「_」+シーケンスカーソルを使用します。
大規模では、独自の識別子(クライアントサイドで生成されたuuidなど)を使用し、その上にインデックス/ユニーク制約がある方がよいでしょう。
より高度:
あなたはユーザーノードを持っており、それにステップを添付する(文脈:ユーザーは、前にそれに接続されている任意の段階だったしませんでした)
を作成します。ダミーユーザー:
CREATE (u:User {login:"me"})
手順のリストを作成し、ユーザーに添付
WITH {steps: [ {name: 'step 1'}, {name: 'step2'}, {name: 'step3'}] } AS object
WITH object.steps AS steps, timestamp() AS identifier
UNWIND range(1, size(steps)-1) AS i
MERGE (s:Step {id: identifier + "_" + (i-1)}) SET s.name = (steps[i-1]).name
MERGE (s2:Step {id: identifier + "_" + (i)}) SET s2.name = (steps[i]).name
MERGE (s)-[:NEXT]->(s2)
WITH identifier + "_" + (size(steps)-1) AS lastStepId, identifier + "_0" AS firstStepId
MATCH (user:User {login:"me"})
OPTIONAL MATCH (user)-[r:LAST_STEP]->(oldStep)
DELETE r
WITH firstStepId, lastStepId, oldStep, user
MATCH (s:Step {id: firstStepId})
MATCH (s2:Step {id: lastStepId})
MERGE (user)-[:LAST_STEP]->(s)
WITH s2, collect(oldStep) AS old
FOREACH (x IN old | MERGE (s2)-[:NEXT]->(x))
コンテキスト、(同じクエリを実行しますが、視覚的に差分を参照する手順については、異なる名前を持つ):ユーザーが彼に添付すでにステップがあります。
WITH {steps: [ {name: 'second 1'}, {name: 'second 2'}, {name: 'second 3'}] } AS object
WITH object.steps AS steps, timestamp() AS identifier
UNWIND range(1, size(steps)-1) AS i
MERGE (s:Step {id: identifier + "_" + (i-1)}) SET s.name = (steps[i-1]).name
MERGE (s2:Step {id: identifier + "_" + (i)}) SET s2.name = (steps[i]).name
MERGE (s)-[:NEXT]->(s2)
WITH identifier + "_" + (size(steps)-1) AS lastStepId, identifier + "_0" AS firstStepId
MATCH (user:User {login:"me"})
OPTIONAL MATCH (user)-[r:LAST_STEP]->(oldStep)
DELETE r
WITH firstStepId, lastStepId, oldStep, user
MATCH (s:Step {id: firstStepId})
MATCH (s2:Step {id: lastStepId})
MERGE (user)-[:LAST_STEP]->(s)
WITH s2, collect(oldStep) AS old
FOREACH (x IN old | MERGE (s2)-[:NEXT]->(x))
もしあなたがapocを持っていれば、 'apoc.nodes.link(nodes、" NEXT ")' –
を使うことができます。私は人々がAPOCの前にCypherを学ぶことを好むですが、そうです!APOC FTW! –
@ChristopheWillemsenありがとう、私はuuidを持っていますが、ただ例を挙げていました。これは完璧に機能し、APOCが必要な時にはAPOCを調べます。ありがとう! –