所以我有一个很棒的问题:
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
使用向上转弯将角色从一个位置移动到另一个位置。它是独立的和原子的。问题是以下任何一种情况都可能发生:
如果其中任何一个发生,我只是没有得到任何结果 - 这使得无法告知用户出了什么问题。
我有点像新手一样。是否有一种方法可以使用多个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
答案 0 :(得分:3)
在这种情况下,您可以在最后使用OPTIONAL MATCH
,WITH
和CASE
语句来评估可能的情况。
例如......而不是
MATCH (c:Character)-[r1:IS_LOCATED_IN]->(l1:Location) where c.name=$char
你可以有一个
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