为什么我收到“Kernel 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
(已提交读)隔离级别。由于隔离级别是已提交读,所以读取查询与写入查询不是相互隔离的。
如果您的结果集包含关系,并且这些关系在结果通过 Bolt 流回之前或流回过程中被删除,您将遇到 Kernel API returned non-existent relationship type: -1
异常。
以下是描述 Neo4j 中的隔离级别 的链接。
好消息是,在 3.5.5 版本中引入了一个修复程序,为该问题提供更好的消息提示。以下是 3.5.5 版本发布说明中的相关文本
修复了在执行删除或移除操作的已提交写入事务导致重叠读取事务中冲突时抛出无用异常的多种情况。现在,我们从嵌入式 API 抛出 IllegalStateException,并从驱动程序 (Bolt) API 抛出 TransientException(它会告诉客户端重试其事务)。
此页面有帮助吗?