neo4j Cypher,Reusing information,with EXISTS{} as varname and then use varname,fails

aurhwmvo  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(106)

我的查询应该创建一个连接从A到B,如果这不会导致一个循环。这意味着如果已经存在从B到A的连接,则无法将A连接到B。
我有以下疑问:
1,2 ->我只找到2个节点,并将它们命名为a和B
3 ->我想检查从B到A是否没有连接,并将结果保存到变量A中
4,5->如果A为真,我想创建一个从A到B的连接
6 - 10 ->我通过条件A返回调试字符串
我认为这个语法是正确的,但我得到以下错误:

Neo.ClientError.Statement.SyntaxError: Variable `A` not defined (line 2, column 10 (offset: 18))
"    CASE A"
          ^

我一定是误解了Cypher的作用域。
有人能解释一下我做错了什么吗?
如果没有从B到A的连接,我希望得到结果“成功”,如果有连接,我希望得到结果“错误”。

nqwrtyyt

nqwrtyyt1#

尽管这个查询不是最优的,但错误只是我在第5行中输入的一个参数
删除后,我得到了预期的结果。
我希望这段代码无论如何都能帮助到一些人,对于优化的想法,请回复

ezykj2lf

ezykj2lf2#

即使删除了第5行中的错误分号,查询也不会完全按照您想要的方式工作。这是因为当A为false时,WHERE A子句将立即结束查询(并且它永远不会返回'error')。
此查询将按您的预期运行:

MATCH (a:User), (b:User)
WHERE ID(a) = 0 AND ID(b) = 1
WITH a, b, NOT (b)-[*]->(a) as A
CALL {
  WITH *
  WITH * WHERE A
  MERGE (a)-[:has_connection]->(:Connection)-[:supports]->(b)
}
RETURN CASE A
  WHEN TRUE THEN 'success'
  ELSE 'error' END AS result

此查询使用CALL subquery来避免在A为false时过早结束查询。

相关问题