在密码中,没有“正式”条件更新。这是使用“CASE技巧”IF来模拟的,这是FOREACH内部的一个例子,如演示的这里和这里。
下面是我正在处理的查询:
MATCH (reaper:REAPER)-[:TO_REAP]->(doomed)
WHERE reaper <> doomed
WITH reaper, doomed
LIMIT 1
OPTIONAL MATCH (doomed)-[x]-(doomed)
DELETE x
WITH reaper, doomed
OPTIONAL MATCH (doomed)-[r]-(related)
DELETE r, doomed
WITH related, reaper
WHERE related <> reaper
FOREACH(ignore_me IN CASE WHEN
related IS NOT NULL
THEN [1] ELSE [] END | MERGE (reaper)-[:TO_REAP]->(related))
RETURN 1
此收割机的目的是删除节点(子图)。为此,我们删除直接连接到它的节点(“注定的”节点),然后使用合并将“注定的”节点的所有子节点直接连接到收割器(相关的)。当然,如果没有子级,我们就没有任何连接,这就是FOREACH和CASE出现的地方。如果没有子级(相关的),那么人们会期望FOREACH到no,然后继续返回。
问题是,当related为null时,查询将退出,并且不会返回任何内容,但也不会失败。这是一个问题,因为我们无法确定什么时候可以删除VS。由于此问题,删除了“叶子”(没有子节点的单个节点)节点。
在试图诊断问题时,我删除了'if‘语句(FOREACH和CASE),当related为null时,它会抛出一个错误’其他节点为空‘。
我怀疑FOREACH循环在某种程度上正在吞噬这个错误,尽管在这种情况下不应该执行合并。
我建议有一个可能的新4j/密码错误,所以我希望有人进来告诉我,我的查询XD是多么的错误和低效
编辑:如果你想自己测试这个查询的话,我忘了讨论数据的暂存。
这会让你体验到我的问题:
CREATE (r:REAPER)
CREATE (r)-[:TO_REAP]->(n)-[:doesntmatter]->(m)
CREATE (r)-[:TO_REAP]->(p)
当您运行delete查询时,您会注意到对于'n‘节点,它将返回一个1。但是对于其他两个节点,m和p(它们是叶节点),它们将被删除,但不会返回任何内容。
发布于 2016-04-04 10:23:25
这些信息可能会有帮助。
Cypher以不同的方式处理以下2个人为的代码段。让我们假设没有Foo
节点。
代码片段1。( WHERE
子句中止查询,它不返回任何内容):
OPTIONAL MATCH (n:Foo)
WITH n
WHERE NULL = 123
RETURN 1;
代码片段2。(查询完成并返回1):
OPTIONAL MATCH (n:Foo)
WHERE NULL = 123
RETURN 1;
这种行为上的差异可能是导致您的问题的原因。
但是,Cypher要求使用WITH
将DELETE
从后续的MATCH
或WHERE
子句中分离出来。
解决这一问题的一种方法可能是将最后一个WITH
子句向上移动2行(就在其对应的OPTIONAL MATCH
之后),这样它就不会中止查询:
MATCH (reaper:REAPER)-[:TO_REAP]->(doomed)
WHERE reaper <> doomed
WITH reaper, doomed
LIMIT 1
OPTIONAL MATCH (doomed)-[x]-(doomed)
DELETE x
WITH reaper, doomed
OPTIONAL MATCH (doomed)-[r]-(related)
WHERE related <> reaper
DELETE r, doomed
WITH related, reaper
FOREACH(ignore_me IN CASE WHEN
related IS NOT NULL
THEN [1] ELSE [] END | MERGE (reaper)-[:TO_REAP]->(related))
RETURN 1
https://stackoverflow.com/questions/36407381
复制相似问题