我有一个属于用户的帖子列表。这些帖子被构造为属于给定用户的链表。
我在保留数据结构的同时删除了给定的节点。
这是结构的示意图。
在我的列表尝试中,我编写了下面的查询,但是它不起作用,因为 MATCH 没有在子查询中返回任何内容。
我曾考虑在子查询中使用 OPTIONAL MATCH,但这会导致异常。
MATCH(node:Post)
WHERE ID(node) = 2749
WITH node
MATCH(user:User)-[:OWNS]->(node)-[:PREV]->(nextNode:Post)
CREATE(user)-[:OWNS]->(nextNode)
WITH node
MATCH(prevNode:Post)-[:PREV]->(node)-[:PREV]->(nextNode:Post)
CREATE(prevNode)-[:PREV]->(nextNode)
WITH node
DETACH DELETE node
我假设如果子查询中的模式失败,则将跳过其余的子查询,并且下一个子查询仍将执行。但似乎整个事情并没有得到执行。
我们如何在不停止执行的情况下在子查询中执行以下操作。
IF pattern matches
THEN
CREATE EDGE
IF pattern matches
THEN
Do something else
解决方案
stdob--
的答案最接近正确的解决方案,但是它无法删除列表末尾的节点并引发异常,因为它不检查 nextNode 是否存在于第二个 FOREACH 语句中。
它需要调整才能工作:
MATCH(node:Post) WHERE ID(node) = 2813
OPTIONAL MATCH (user:User)-[:OWNS]->(node)
OPTIONAL MATCH (node)-[:PREV]->(nextNode:Post)
OPTIONAL MATCH (prevNode:Post)-[:PREV]->(node)
FOREACH (ith in CASE
WHEN user IS NOT NULL AND nextNode IS NOT NULL
THEN [1]
ELSE []
END | CREATE (user)-[:OWNS]->(nextNode)
)
FOREACH (ith in CASE WHEN
prevNode IS NOT NULL AND nextNode IS NOT NULL
THEN [1] ELSE []
END | CREATE (prevNode)-[:PREV]->(nextNode)
)
DETACH DELETE node