Database neo4j删除链表中的节点
我有一个属于某个用户的帖子列表。文章的结构是属于给定用户的链表 我必须删除给定节点的数据,同时保留数据结构 这是结构的图示。 在我的列表尝试中,我编写了下面的查询,但是它不起作用,因为匹配不会在子查询中返回任何内容 我考虑在子查询中使用可选匹配,但是这会导致异常Database neo4j删除链表中的节点,database,neo4j,cypher,graph-databases,cypher-3.1,Database,Neo4j,Cypher,Graph Databases,Cypher 3.1,我有一个属于某个用户的帖子列表。文章的结构是属于给定用户的链表 我必须删除给定节点的数据,同时保留数据结构 这是结构的图示。 在我的列表尝试中,我编写了下面的查询,但是它不起作用,因为匹配不会在子查询中返回任何内容 我考虑在子查询中使用可选匹配,但是这会导致异常 MATCH(node:Post) WHERE ID(node) = 2749 WITH node MATCH(user:User)-[:OWNS]->(node)-[:PREV]->(nextNode:Post) CREA
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
您可以结合使用
可选匹配
、FOREACH
和案例
:
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
。我使用以下查询重新创建了您的数据集:
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)
正如您所提到的,使用可选匹配
可能会导致异常,
大致如下:
期望在prevNode上找到一个节点,但在某些节点上未找到任何内容(无\u值)
但是,您可以解决这个问题,首先执行DELETE
,然后使用WITH
子句传递值,如果可选匹配子句引入的变量不为NULL,则只运行CREATE
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)
实现<代码>如果模式匹配,那么创建EdgEng/Eng>非常简单,您只需使用如下的代码:<代码>匹配创建(N1)-[(EdgEyType)->(N2)< /C> >,其中<代码> Nav>代码>和<代码> N2<代码>是模式中的节点。如果您试图删除列表中间的节点,例如,在第3个数字?哇,很好地被发现。我错过了下一个节点。我再次测试了它,现在它看起来很好。这不能删除列表中间和结尾的节点。原因是第一个匹配语句将始终失败,因为它假定要删除的节点始终是第一个节点。请注意,它始终与用户节点有一条边。末端或中间的节点不能具有和具有:OWNS标签的边。竖起大拇指进行尝试。这无法删除最后一个节点。我已经调整了它,现在它的工作。谢谢。我在问题的末尾添加了经过调整的答案。如果您想修改您的答案以检查第二个foreach中是否存在nextNode
,那么我将接受您的答案。再次非常感谢,我刚刚了解了neo4j中的管道:-)是的,你说得对,我添加了一个补丁和一个小插件。