2017-05-05 5 views
0

コレクションに少なくとも2つの要素がある場合にのみ、クエリを実行する方法はありますか? 私の現在の状況では、ノードのプロパティに基づいてノードを一致させ、コレクションに入れます。その後、コレクションのサイズが2より大きい場合にforeach文を実行します。コレクションのサイズに基づいてforeachを実行する

これは私がコレクションのサイズがこのような何かが動作するはずの二つの要素

WITH COLLECT(items) AS itemsCol 
FOREACH(i in RANGE(0, 1)| 
    FOREACH(newItem in [productsCol[0]] | 
    FOREACH(oldItem in [productsCol[1]] | 
     CREATE UNIQUE (oldItem)-[:SEEN]->(newItem)))) 
+0

次の数週間でAPOCプロシージャの次のリリースを見据えておくと、if/elseのような条件付きでサイファーコードを実行するための新しい手順が必要です。 – InverseFalcon

答えて

1

よりも大きいときに実行したいと思い、私のクエリの断片である:

WITH 
    COLLECT(items) AS itemsCol, 
    (CASE WHEN COUNT(items) >= 2 THEN RANGE(0, 1) ELSE NULL END) AS todo 
FOREACH(i in todo | 
    FOREACH(newItem in [productsCol[0]] | 
    FOREACH(oldItem in [productsCol[1]] | 
     CREATE UNIQUE (oldItem)-[:SEEN]->(newItem)))) 

FOREACHはありません反復されるコレクションがNULLの場合は何も表示されません。

0

APOC Procedures条件付きサイファー実行のサポートが更新されました。バージョン3.1.3.7以上(Neo4j 3.1.xを使用している場合)またはバージョン3.2.0.3以上(Neo4j 3.2.xを使用している場合)が必要です。

apoc.do.when()はdbに書き込むクエリなので、apoc.do.when()を使用できます。以下のような

何か:

... 
WITH COLLECT(items) AS itemsCol 
CALL apoc.do.when(size(itemsCol) >= 2, ' 
FOREACH(i in RANGE(0, 1)| 
    FOREACH(newItem in [productsCol[0]] | 
    FOREACH(oldItem in [productsCol[1]] | 
     CREATE UNIQUE (oldItem)-[:SEEN]->(newItem))))', 
     '', {productsCol:productsCol}) YIELD value 
... 

この場合、あなたは他のCYPHERブロックを必要としないので、あなたがもしクエリ内で使用するためにパラメータを渡す必要がありますけれども、我々は、それを残すことができますブロック。

関連する問題