给出一个像这样的链表模式:
(list) -[:next]-> (a) -[:next]-> (b) -[next...]-> (z)
即。保证列表中的每个元素都有一个传入(先前)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
关系。如果有,请“重新连接”它以将(before)
节点连接到(after)
节点。
(因为关系连接在Neo4j中是不可变的,所以最后一步是通过创建一个与旧关系相同的道具的新关系,然后删除旧关系来实现。)
(而且这个查询是以这种方式编写的,因为列表中的最后一个节点不会有传出的next
关系,但总是有一个传入的关系。)
这对于Neo4j 1.8来说效果很好,但是如果我传入相邻的节点,它现在在Neo4j 1.9中失败了。错误是这样的:
Error: java.lang.IllegalStateException: Relationship <id> has been deleted
这意味着在删除关系之前不会“处理”整个查询。这曾经在Neo4j 1.8中工作,但我发誓。 =)
我该如何解决这个问题?这是一个可以自己玩的实时控制台:
http://console.neo4j.org/r/jhk8cc
粘贴上面的查询,然后将{ids}
替换为1, 2
。像1
和2
这样的单个节点可以正常工作。 (感谢@cybersam的最初提示!)
答案 0 :(得分:3)
从1.9开始,似乎在'DELETE relAfter'操作之后正在执行SET操作。
如何将事情分得更多:
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