2016-05-19 6 views
0

サイファーの全体的な目標は、アイテムにステータスを割り当て、以前のステータスをアーカイブとして保持することです。存在しない場合、サイファー関係を作成する

neo4j 3.0のノードとして項目がある場合、リストがあります。各アイテムは、Live、Dead、Missing、または私が定義した他のステータスのいずれかのステータスを持つことができます。

まず、ステータスがliveのノードを作成します。

Merge (n:Item {itemID: '123'} 
    ON CREATE set n.itemID = '123, ... 
    ON MATCH set n.DTS = ... 
WITH n 
MATCH (st:Status {name:'Live'}) 
MERGE (n)-[CURRENT_STATUS {DTS: ...}]->(st) 

これは問題なく動作します。

ステータスを変更する場合は、CURRENT_STATUSのコピーを作成して削除し、新しいステータスの新しいステータスを作成します。新しいステータスが現在のステータスと異なる場合にのみ、これを行う必要があります。ここで私が試したものを(「行方不明」の下の項目に割り当てる必要があります新しい状態である)されています

Merge (n:Item {itemID: '123'} 
    ON CREATE set n.itemID = '123, ... 
    ON MATCH set n.modifiedDTS = ... 
WITH n 
MATCH (n)-[cs:CURRENT_STATUS]-(st:Status) 
WITH n, st, CASE st.name WHEN 'Missing' THEN [] ELSE [n] END as array, cs 
FOREACH (x in array | 
    CREATE (x)-[prevStatus:PREVIOUS_STATUS {DTS: cs.DTS}]->(st) 
    DELETE cs 
    CREATE (x)-[newStatus:CURRENT_STATUS {DTS: 123}]->(st2:Status {name:'Missing'}) 
) 
return *; 

残念ながら、これは動作しません。ループは既存のステータスを削除していますが、PREVIOUS_STATUSまたはCURRENT_STATUSの関係は決して作成しません。エラーはありません。

私はここで何が不足していると思いますか?

答えて

0

私は問題を把握しました。問題は、nの代わりにループの内側でxを使用していることです。私はまだサイファーの初心者であるので、他の誰かがより良い提案をしている場合には、これを開いたままにしておきます。

0

脇に:あなたの元のアプローチがうまくいったはずです。おそらくあなたはneo4jの古いバージョンを使用していますか?

あなたのオリジナルのサイファーは複数で:PREVIOUS_STATUS関係を終了するnを引き起こす可能性がある、とあなたは、最新のものを見つけるためにDTSによってそれらを注文する必要があるだろう。あなたの回答から「nの代わりにn」を使用するだけでなく、時系列の逆順にチェインを組み合わせて(順序を取得するために計算が不要になるように)、Cypherを少し修正しました。

MERGE (n:Item {itemID: '123'} 
    ON CREATE SET ... 
    ON MATCH SET n.modifiedDTS = ... 
WITH n 
MATCH (n)-[cs:CURRENT_STATUS]-(st:Status) 
WITH n, st, cs, CASE st.name WHEN 'Missing' THEN [] ELSE [1] END as array 
FOREACH (x in array | 
    CREATE (n)-[newStatus:CURRENT_STATUS {DTS: 123}]->(st2:Status {name:'Missing'}) 
    CREATE (st2)-[prevStatus:PREVIOUS_STATUS {DTS: cs.DTS}]->(st) 
    DELETE cs 
) 
return *; 

同じ項目と数回繰り返した後、このクエリは次のようにチェーンを作成します。ところで

(:Item)-[:CURRENT_STATUS]->(:Status)-[:PREVIOUS_STATUS]->(:Status)-[:PREVIOUS_STATUS]->(:Status)-> ... 

ON CREATE句で、SET n.itemID = '123'する必要がMERGEいるので、ありませんでしたすでにあなたのためにそのプロパティを設定していたでしょう。

関連する問題