Neo4j:"鬼"标签索引中的节点抛出错误

时间:2014-12-11 15:36:06

标签: indexing neo4j label

我有一个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。除标签外,数据库中没有其他索引。

问题是如何解决这个问题,但仍然使用标签?

2 个答案:

答案 0 :(得分:2)

最终发生的事情是(简化)操作将按此顺序排序:

Q1: MATCH (n)
Q2: DELETE (n), COMMIT
Q1: RETURN n # Error, n no longer exists

出于实现原因,如果cypher通过索引进行,则更有可能发生这种情况。数据库最终将为您处理此问题,但是现在,您需要将该读取查询包装在重试块中 - 如果它因此类错误而失败,您只需再次运行它。

在这方面,还有其他错误可以通过重试轻松恢复,例如死锁错误,因此将语句和/或事务包装在重试块中通常是有用的。

答案 1 :(得分:0)

这是一种可行的解决方法:

将节点标记为已删除而非删除。忽略标记为已删除的节点。使用垃圾收集器一次删除所有此类节点。