我有一个属于用户的帖子列表。帖子被构造为属于给定用户的链表。
我在保留数据结构的同时删除了给定节点。
这是结构的说明。
在我的列表尝试中,我已经编写了下面的查询,但它不起作用,因为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--
的答案是最接近正确的解决方案,但它无法删除列表末尾的节点并抛出异常,因为它不检查第二个FOREACH语句中是否存在nextNode。
它需要调整才能工作:
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
你可以使用OPTIONAL MATCH
,FOREACH
和CASE
的组合:
MATCH(node:Post) WHERE ID(node) = 2749
OPTIONAL MATCH (user:User)-[:OWNS]->(node)
OPTIONAL MATCH (node)-[:PREV]->(nextNode:Post)
OPTIONAL MATCH (prevNode:Post)-[:PREV]->(node)
FOREACH (ith in CASE WHEN
NOT user IS NULL AND
NOT nextNode IS NULL
THEN [1] ELSE [] END |
CREATE (user)-[:OWNS]->(nextNode)
)
FOREACH (ith in CASE WHEN
NOT prevNode IS NULL AND
NOT nextNode IS NULL
THEN [1] ELSE [] END |
CREATE (prevNode)-[:PREV]->(nextNode)
)
DETACH DELETE node
更新:您也可以使用apoc.do.when
中的apoc.library
程序作为conditional query execution。
我使用以下查询重新创建了您的数据集:
CREATE
(u:User {name: 'Alice'})-[:OWNS]->
(p1:Post {number: 1})-[:PREV]->
(p2:Post {number: 2})-[:PREV]->
(p3:Post {number: 3})-[:PREV]->
(p4:Post {number: 4})-[:PREV]->
(p5:Post)
正如您所提到的,使用OPTIONAL MATCH
会导致异常,类似于:
预计在prevNode上找到一个节点但什么都没找到(NO_VALUE)
但是,你可以解决这个问题,首先做DELETE
,然后使用WITH
子句传递值,如果CREATE
子句OPTIONAL MATCH
引入的变量只运行IS NOT NULL
。
MATCH (user:User)-[:OWNS]->(node)-[:PREV]->(nextNode:Post)
WHERE node.number = 1
CREATE (user)-[:OWNS]->(nextNode)
WITH node, nextNode
OPTIONAL MATCH (prevNode:Post)-[:PREV]->(node)
DETACH DELETE node
WITH prevNode, nextNode
WHERE prevNode IS NOT NULL
CREATE (prevNode)-[:PREV]->(nextNode)