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
を持っている可能性が代わりに
の例えば
...あなたは時に応じて 'SET'と' DELETE'を実行するために行うにはもう少し作業を持っています文字や場所などが一致しません。 –