2017-04-07 9 views
0

whatsこのクエリを書くのに最も効率的な方法です。問題。私はバスケットボールをする男の子と女の子の3500の名前のセットを持っています。私は、彼らの年齢層に基づいて幼児、青少年、十代の若者に属しているということについて、彼らとの関係を抱きたい。Foreachのneo4j case文

foreach内でcase文を実行できません。

Match(b:BoysandGirls) 
UNWIND (b.name) as namelist 
FOREACH (fullname in namelist | 
    MERGE(b1:BoysandGirls {name:fullname}) 
    CASE WHEN b1.age < 6 THEN 
     MERGE(t1:KidsType {group:"Toddler"}) // this groups already exist 
     MERGE(b1)-[BELONGS_TO]->(t1) 
    END 
) 

//私はエラー無効な入力を取得若者やティーンエイジャーのような複数のグループを持っている...しかし、わからない
... CASE文で... 1/Lを期待。 何が間違っていますか?

答えて

1

FOREACHは突然変異操作のみを許可しますが、CASEは突然変異操作ではありません(CASEも一致/突然変異操作を含むことはできません)。これらの問題以外にも、UNWINDが何をしているのか混乱していると思います。おそらくCOLLECTを意味していました。しかし、私はCOLLECTFOREACHを使う必要はないと思う(基本的にお互いをキャンセルするので)。

このはるかに単純なクエリでは、あなたが必要とするすべてであるかもしれない:

MATCH (bg:BoysandGirls) 
WHERE bg.age < 6 
MATCH (t:KidsType {group:"Toddler"}) 
MERGE (bg)-[BELONGS_TO]->(t); 

それは「幼児」KidsTypeへ(BELONS_TO関係タイプを経由して)すべてのBoysandGirlsが6歳未満とそれらが関連していることを保証し検索します。

+1

@ClickAway他の点として、ノードを分類するのが唯一の目的です(KidsTypeノードに他のプロパティがない場合、他の理由でこれらのノードを使用する予定がない場合)あなたのノードにラベルを追加してください(:Toddler、:Youth、:Teenager)。 Neo4jでは複数のラベルが付いたノードを使用できます。これらのラベルを使用して、年齢層のクイッククエリに一致させることができます。 – InverseFalcon