我有一个neo4j数据库,其中包含一组带标签的节点:EXAMPLE。
有两个操作。首先,我删除一个节点,然后寻找另一个节点。它们是使用neo4j API单独完成的。
MATCH (n:EXAMPLE {Name: { name1 }}) DELETE n;
和
MATCH (n:EXAMPLE {Name: { name2 }}) RETURN n;
有时,当我执行第二个查询时,会抛出错误" ID为123" 的节点。 ID为123的节点与第一个查询中删除的节点相同。
当有很多请求同时进入数据库时会发生这种情况。
我想如果节点被删除会发生,但是示例标签索引还没有更新。有两个事实可以证明这种理论。
1)错误不稳定。
2)如果我像这样更改第二个查询(删除标签),我就不会收到错误:
MATCH (n {Name: { name2 }}) RETURN n;
Neo4j版本是2.1.5,Java - OpenJDK运行时环境(IcedTea 2.5.3)(7u71-2.5.3-2~deb7u1)和操作系统是Debian。除标签外,数据库中没有其他索引。
问题是如何解决这个问题,但仍然使用标签?
答案 0 :(得分:2)
最终发生的事情是(简化)操作将按此顺序排序:
Q1: MATCH (n)
Q2: DELETE (n), COMMIT
Q1: RETURN n # Error, n no longer exists
出于实现原因,如果cypher通过索引进行,则更有可能发生这种情况。数据库最终将为您处理此问题,但是现在,您需要将该读取查询包装在重试块中 - 如果它因此类错误而失败,您只需再次运行它。
在这方面,还有其他错误可以通过重试轻松恢复,例如死锁错误,因此将语句和/或事务包装在重试块中通常是有用的。
答案 1 :(得分:0)
这是一种可行的解决方法:
将节点标记为已删除而非删除。忽略标记为已删除的节点。使用垃圾收集器一次删除所有此类节点。