知识库

为什么会出现 “Kernel API returned non-existent relationship type: -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 的值被用作关系不存在时的 token 值。当嵌入式 Java API 未找到具有该 id 的关系时,它会将 -1 传递给此方法,导致抛出异常的调用是 getRelationshipTypeById(-1)

上述场景发生在读取事务与重叠的删除事务冲突时。冲突有时会出现,因为 Neo4j 中的事务使用 read-committed 隔离级别。由于隔离级别为 read-committed,读取查询并未对写入查询进行隔离。

如果你的结果集合中包含关系,而这些关系在结果通过 bolt 流回之前或期间被删除,你就会遇到 Kernel API returned non-existent relationship type: -1 异常。

以下链接描述了 Neo4j 中的隔离级别

好消息是,在 3.5.5 版本中,引入了修复,以提供更好的错误信息。以下是 3.5.5 发布说明中的相关文字

修复了多种情况下抛出不明确异常的问题,当已提交的写入事务执行删除或移除操作并导致与重叠的读取事务冲突时。我们现在在嵌入式 API 中抛出 IllegalStateException,在驱动(Bolt)API 中抛出 TransientException(通知客户端重试事务)。

© . This site is unofficial and not affiliated with Neo4j, Inc.