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,这是我最初调试的…=/如果我不把这个标记为答案并编辑这个问题,会不会有点不礼貌?你能提供一个例子来说明什么时候失败了吗?