知识库

为什么我遇到了“内核 API 返回不存在的关系类型:-1”异常?

在极少数情况下,Neo4j Bolt 驱动程序会抛出 IllegalStateException 异常。堆栈顶部的部分显示为

java.lang.IllegalStateException: Kernel API returned non-existent relationship type: -1
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacade.getRelationshipTypeById(GraphDatabaseFacade.java:991)

在幕后,发生的情况如下。getRelationshipTypeById(int type) 方法尝试搜索关系类型为 type = -1 的关系。当关系不存在时,-1 值用作关系 ID 的令牌值。当嵌入式 Java API 未找到具有 ID 的关系时,它会简单地将 -1 传递给此方法,并且抛出异常的调用为 getRelationshipTypeById(-1)

当读取事务与重叠的删除事务冲突时,会出现上述情况。冲突有时会发生,因为 Neo4j 中的事务使用 read-committed 隔离级别。由于隔离级别为 read-committed,因此读取查询不会与写入查询隔离。

如果您的结果集包含关系,并且这些关系在结果通过 bolt 流回之前或期间被删除,您将遇到 内核 API 返回不存在的关系类型:-1 异常。

这是一个描述 Neo4j 中的隔离级别 的链接。

好消息是在 3.5.5 中,引入了一个修复程序来为该问题提供更好的消息传递。以下是 3.5.5 发行说明中的相关文本

修复了在执行删除或移除操作的已提交写入事务在重叠的读取事务中导致冲突时抛出无用异常的若干情况。我们现在从嵌入式 API 抛出 IllegalStateException 异常,并从驱动程序 (Bolt) API 抛出 TransientException 异常(告诉客户端重试其事务)。