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中的管道:-)是的,你说得对,我添加了一个补丁和一个小插件。