首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Neo4j Cypher - FOREACH在没有操作的“案例诡计”上悄然失败

Neo4j Cypher - FOREACH在没有操作的“案例诡计”上悄然失败
EN

Stack Overflow用户
提问于 2016-04-04 07:54:52
回答 1查看 746关注 0票数 1

在密码中,没有“正式”条件更新。这是使用“CASE技巧”IF来模拟的,这是FOREACH内部的一个例子,如演示的这里这里

下面是我正在处理的查询:

代码语言:javascript
运行
AI代码解释
复制
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是多么的错误和低效

编辑:如果你想自己测试这个查询的话,我忘了讨论数据的暂存。

这会让你体验到我的问题:

代码语言:javascript
运行
AI代码解释
复制
CREATE (r:REAPER)
CREATE (r)-[:TO_REAP]->(n)-[:doesntmatter]->(m)
CREATE (r)-[:TO_REAP]->(p)

当您运行delete查询时,您会注意到对于'n‘节点,它将返回一个1。但是对于其他两个节点,m和p(它们是叶节点),它们将被删除,但不会返回任何内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-04 10:23:25

这些信息可能会有帮助。

Cypher以不同的方式处理以下2个人为的代码段。让我们假设没有Foo节点。

代码片段1。( WHERE子句中止查询,它不返回任何内容):

代码语言:javascript
运行
AI代码解释
复制
OPTIONAL MATCH (n:Foo)
WITH n
WHERE NULL = 123
RETURN 1;

代码片段2。(查询完成并返回1):

代码语言:javascript
运行
AI代码解释
复制
OPTIONAL MATCH (n:Foo)
WHERE NULL = 123
RETURN 1;

这种行为上的差异可能是导致您的问题的原因。

但是,Cypher要求使用WITHDELETE从后续的MATCHWHERE子句中分离出来。

解决这一问题的一种方法可能是将最后一个WITH子句向上移动2行(就在其对应的OPTIONAL MATCH之后),这样它就不会中止查询:

代码语言:javascript
运行
AI代码解释
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36407381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档