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 MATCH, WITH를 사용할 수 있으며, CASE 문 가능한 시나리오를 평가할 수 있습니다. 당신이

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

당신이 때'DELETE'를 선택적으로'SET'을 수행 할하고 좀 더 작업을해야합니다 가질 수 대신

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

의 예를 들어

... 문자 또는 위치 등이 일치하지 않습니다. –