Neo4j IllegalStateException:关系X已被删除(链表查询)

时间:2014-04-02 23:11:39

标签: neo4j cypher

给出一个像这样的链表模式:

(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。它说,对于每个输入节点:

  1. 删除传入(即前面的)next关系。
  2. 然后寻找外向(即跟随)next关系。
  3. 如果有,请“重新连接”它以将(before)节点连接到(after)节点。

    (因为关系连接在Neo4j中是不可变的,所以最后一步是通过创建一个与旧关系相同的道具的新关系,然后删除旧关系来实现。)

  4. (而且这个查询是以这种方式编写的,因为列表中的最后一个节点不会有传出的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。像12这样的单个节点可以正常工作。 (感谢@cybersam的最初提示!)

1 个答案:

答案 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