Neo4j非法状态异常:关系X已被删除(链表查询)

Neo4j非法状态异常:关系X已被删除(链表查询),neo4j,cypher,Neo4j,Cypher,给定这样的链表模式: (list) -[:next]-> (a) -[:next]-> (b) -[next...]-> (z) i、 e.列表中的每个元素都保证具有传入(前)next关系,但列表中的最后一个元素将没有传出(后)关系 我对从此类列表中自动删除一个或多个节点进行了查询: START nodeToRemove = node({ids}) MATCH nodeBefore -[relBefore:next]-> nodeToRemove DELETE relB

给定这样的链表模式:

(list) -[:next]-> (a) -[:next]-> (b) -[next...]-> (z)
i、 e.列表中的每个元素都保证具有传入(前)
next
关系,但列表中的最后一个元素将没有传出(后)关系

我对从此类列表中自动删除一个或多个节点进行了查询:

START nodeToRemove = node({ids})
MATCH nodeBefore -[relBefore:next]-> nodeToRemove
DELETE relBefore

WITH nodeToRemove, nodeBefore
MATCH nodeToRemove -[relAfter:next]-> nodeAfter
CREATE nodeBefore -[relNew:next]-> nodeAfter
SET relNew = relAfter

WITH relAfter
DELETE relAfter
这是一个2.0之前的样式查询,但语法也适用于Neo4j 2.0。它表示,对于每个输入节点:

  • 删除传入(即前一个)
    next
    关系

  • 然后查找传出(即以下)
    next
    关系

  • 如果有一个,请“重新布线”,将
    (前)
    节点连接到
    (后)
    节点

    (由于关系连接在Neo4j中是不可变的,所以最后一步是使用与旧关系相同的道具创建新关系,然后删除旧关系。)

  • (此查询是以这种方式编写的,因为列表中的最后一个节点没有传出的
    next
    关系,但始终具有传入的关系。)

    这在Neo4j 1.8中可以正常工作,但如果我传入相邻节点,它在Neo4j 1.9中就会失败。错误是:

    Error: java.lang.IllegalStateException: Relationship <id> has been deleted
    
    错误:java.lang.IllegalStateException:关系已被删除
    
    这意味着在删除关系之前,整个查询没有被“处理”。不过,我发誓,这在Neo4j 1.8中曾经奏效

    我怎样才能解决这个问题?这里有一个现场控制台供您自己使用:


    粘贴到上面的查询中,只需将
    {ids}
    替换为
    1,2
    。像
    1
    2
    这样的单独节点工作。(感谢@cybersam提供的初始提示!)

    从1.9开始,设置操作似乎是在“删除relAfter”操作之后执行的

    把事情再拆分一下怎么样:

    START nodeToRemove = node({id})
    MATCH nodeBefore -[relBefore:next]-> nodeToRemove
    DELETE relBefore
    
    WITH nodeToRemove, nodeBefore
    MATCH nodeToRemove -[relAfter:next]-> nodeAfter
    CREATE nodeBefore -[relNew:next]-> nodeAfter
    SET relNew = relAfter
    
    WITH relAfter
    DELETE relAfter
    

    谢谢Sam,但我确实需要
    集合
    来复制所有关系道具。有没有其他方法可以实现这一点?更新:用
    with
    SET
    DELETE
    分开就行了!谢谢你,山姆!如果你更新你的答案,我很乐意把它标记为正确。你的提示是
    SET
    DELETE
    之后执行,这让我想到用
    试试
    )实际上,这仍然不能用于多个ID,这是我最初调试的…=/如果我不把这个标记为答案并编辑这个问题,会不会有点不礼貌?你能提供一个例子来说明什么时候失败了吗?