如何向用户表明出现了什么问题

时间:2017-11-01 11:52:31

标签: neo4j cypher

所以我有一个很棒的问题:

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

使用向上转弯将角色从一个位置移动到另一个位置。它是独立的和原子的。问题是以下任何一种情况都可能发生:

  • $ char 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

1 个答案:

答案 0 :(得分:3)

在这种情况下,您可以在最后使用OPTIONAL MATCHWITHCASE语句来评估可能的情况。

例如......而不是

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