2017-11-01 5 views
1

だから、何が悪かったのか、ユーザーに指示する方法:それはターンを使い切って、ある場所から別の場所に文字を移動私は素晴らしいクエリ持っ

MATCH (c:Character)-[r1:IS_LOCATED_IN]->(l1:Location) where c.name=$char 
MATCH (l1:Location)-[r2:IS_CONNECTED_TO]->(l2:Location) where 
    l2.name=$newlocation and c.turns >= r2.cost and l1 <> l2 
SET c.turns = c.turns - r2.cost 
DELETE r1 
CREATE (c)-[:IS_LOCATED_IN]->(l2) 
return c,l2 

を。それは自己完結的で原子力です。

  • $チャーvarが
  • $がnewlocationのvarができなかった実際の場所
  • 新しい場所を参照してくださいことができませんでした実際の文字を参照してくださいことができませんでした。問題は、次のいずれかが起こる可能性があることですコストが文字
  • 古いものと新しい場所が同じ場所
可能性がありタンズより大きくなる可能性があり、古い場所
  • に接続します

    これらのいずれかが発生した場合、私は結果を返さない - 何が間違っているのかをユーザに知らせることが不可能になる。

    私はサイファー新生児です。複数のWITH句や何かがクエリの素質を保持し、何が間違っていたかを示す何かを返す方法がありますか?

    更新:私はそれがすべて機能していますが、それは原子になるためには長い道のりです。とにかく、ここで起こって他の処理とロジックがあるかもしれないので、私はおそらく、このようにそれを行うことはありませんが、それは良い学習経験だった:

    OPTIONAL MATCH (c:Character {name: $character})-[r1:IS_LOCATED_IN]->(l1:Location) 
    WITH c,r1,l1 
    OPTIONAL MATCH (nl:Location) where nl.name=$newlocation 
    WITH nl,r1,c,l1 
    OPTIONAL MATCH (ll:Location)-[r2:IS_CONNECTED_TO]->(l2:Location) 
        WHERE ll.name = l1.name and l2.name = $newlocation 
    WITH l2,r2,nl,r1,c 
    OPTIONAL MATCH (c2:Character) 
        WHERE c2.name = $character and c2.turns >= r2.cost 
    WITH c2,l2,r2,nl,r1,c 
    FOREACH (a IN CASE WHEN l2 IS NOT NULL AND c2 IS NOT NULL THEN [c2] ELSE [] end | 
        SET a.turns = a.turns - r2.cost 
        DELETE r1 
        CREATE (a)-[:IS_LOCATED_IN]->(l2) 
    ) 
    RETURN c2,l2,CASE 
        WHEN c is null THEN 'bad character' 
        WHEN nl is null THEN 'bad location' 
        WHEN l2 is null THEN 'not connected' 
        WHEN c2 is null THEN 'too few turns' 
        ELSE 'success' END AS message 
    
  • 答えて

    3

    この場合、あなたはOPTIONAL MATCHWITHCASE文を使用することができます可能なシナリオを評価する。あなたは

    OPTIONAL MATCH (c:Character)-[r1:IS_LOCATED_IN]->(l1:Location) where c.name=$char 
    WITH c 
    ... 
    RETURN CASE 
        WHEN c IS NULL THEN "Character not found" 
        ELSE "something else 
    END AS message 
    
    +0

    を持っている可能性が代わりに

    MATCH (c:Character)-[r1:IS_LOCATED_IN]->(l1:Location) where c.name=$char 

    の例えば

    ...あなたは時に応じて 'SET'と' DELETE'を実行するために行うにはもう少し作業を持っています文字や場所などが一致しません。 –

    関連する問題