服务器错误

Neo4j 返回服务器错误,表示 Cypher 查询或命令执行的结果不成功。驱动程序接收这些错误并将其发送给 Neo4j 工具(例如 Browser、Bloom、Cypher Shell)或用户应用程序,由它们将错误显示给用户。

从版本 5.26 开始,Neo4j 错误码除了 Neo4j 异常外,还包含一个额外的 GQL-status 对象,该对象提供关于 Cypher 查询或命令执行状态的信息,并符合 ISO/IEC 39075:2024(en) - 信息技术 - 数据库语言 - GQL 标准。从 Neo4j 5.25 开始,此附加的 GQL-status 对象也会显示在查询日志中。更多信息请参见 操作手册 → GQL 错误信息

当异常没有 GQL-status 对象时,将返回默认的 GQLSTATUS 码 50N42。从 Neo4j 5.25 开始,我们开始向异常添加 GQL 对象。因此,在此过渡期间,您可能会看到许多 50N42 码。然而,重要的是不要依赖此默认码,因为未来的 Neo4j 版本可能会通过向异常添加适当的 GQL 对象来更改它。此外,外部过程的 GQL 码尚不稳定。

本页面描述了用于错误的 GQL-status 和 Neo4j-status 对象框架,包括它们的结构、提供的错误对象以及如何解释它们。它还解释了错误内部机制以及 GQLSTATUS 和错误的服务器-驱动程序兼容性。

GQL-status 错误对象

在 GQL-status 对象框架中,当用户向服务器执行查询时,总是会产生一个结果,称为执行结果。如果在执行期间发生错误,该结果会记录为异常条件,表示执行失败且没有结果。错误的执行结果表示为一个 GQL-status 对象列表,这些对象具有失败的结果,并按照以下优先级规则组织:

  1. 导致事务回滚的每个异常优先于其他异常。

  2. 每个异常都优先于任何完成条件。有关完成条件,请参阅GQL-status 通知对象

GQL-status 对象还包括 Neo4j 特定的信息,例如严重级别和错误分类。

每个 GQL-status 对象包含以下字段:

表 1. GQLSTATUS 错误对象

GQLSTATUS 码

一个 5 个字符的字符串,由 2 个字符的类码和 3 个字符的子类码连接而成,用于标识错误的条件。

StatusDescription

GQLSTATUS 的人类可读描述,由一个条件、一个子条件以及关于该条件的额外可选文本组成。格式为 error: condition - subcondition. AdditionalInfo。条件和子条件分别是类码和子类码的文本表示。子类码 000 的子条件为空。

DiagnosticRecord

关于状态的额外信息,以键值对的形式给出,包括服务器端和驱动程序端。要检索完整的诊断记录,您可以在服务器端使用 diagnosticRecord() 或在驱动程序端使用相应的方法。对于一些有用的字段,还公开了额外的辅助方法。

字段

描述

OPERATION

错误相关的操作。始终默认为空。

OPERATION_CODE

错误相关的操作码。始终默认为 0

CURRENT_SCHEMA

错误相关的当前模式。始终默认为 /

_classification

Neo4j 错误分类,可以是 CLIENT_ERROR (客户端错误)、TRANSIENT_ERROR (瞬时错误) 或 DATABASE_ERROR (数据库错误)。

_position

(可选) 错误在查询文本中相关的位置,由偏移量、行和列给出。

GQL-status 错误对象还可以包含一个可选的 GQL-status 对象,该对象表示错误的根本原因,用于提供额外的、更具体的诊断信息。

GQLSTATUS 错误码类别

GQLSTATUS 码分为类别和子类别。类码是一个 2 个字符的字符串,表示状态的一般条件,例如连接异常、数据异常等。子类码是一个 3 个字符的字符串,提供有关该条件的更详细信息。

下表列出了 GQLSTATUS 类别及其含义:

表 2. GQLSTATUS 码类别

类别

条件

08

连接异常

22

数据异常

25

无效事务状态

40

事务回滚

42

语法错误或访问规则违规

50

一般处理异常

51

系统配置或操作异常

52

过程异常

Neo4j-status 错误对象

Neo4j-status 错误对象包含诊断信息,表示 Cypher 查询或命令执行的不成功结果,包括严重性、状态码、类别、描述、消息以及错误在查询文本中相关的位置。根据应用程序的不同,错误对象中的某些字段可能不可见。

错误对象包含以下字段:

表 3. Neo4j 错误对象

Neo4j 码

采用 Neo.[Type].[SubType].[Name] 形式的 Neo4j 码。

描述

特定错误的描述。

Message

错误消息。

Severity level

ERROR

Category

错误的类别。可用类别包括 CLIENT_ERROR (客户端错误)、TRANSIENT_ERROR (瞬时错误) 和 DATABASE_ERROR (数据库错误)。

Position

(可选) 错误在查询文本中相关的位置,由偏移量、行和列给出。

更多信息请参见Neo4j 错误码列表

服务器错误类型

服务器返回错误并不总是意味着这是致命错误。状态码也可能指示瞬时问题,这些问题在重试请求后可能会消失。服务器错误组决定了对事务的影响。

表 4. 服务器错误类型
类型 描述 对事务的影响

ClientError

这些错误由客户端(用户输入或用户应用程序)引起,通常与请求本身有关。更改请求可能会成功。Neo4j 码具有前缀 Neo.ClientError,而 GQLSTATUS 码的 ErrorClassification 类型为 CLIENT_ERROR

回滚

TransientError

这些错误由服务器检测到,通常与某种数据库不可用相关,例如达到限制、内存不足、超时等。错误可能是临时的,因此稍后重试可能会成功。Neo4j 码具有前缀 Neo.TransientError,而 GQLSTATUS 码的 ErrorClassification 类型为 TRANSIENT_ERROR

回滚

DatabaseError

这些错误由数据库引起,通常与数据库状态相关,表示数据库未能处理请求。Neo4j 码具有前缀 Neo.DatabaseError,而 GQLSTATUS 码的 ErrorClassification 类型为 DATABASE_ERROR

回滚

错误内部机制

Neo4j 支持以 Java 异常形式表示的服务器错误。大多数异常实现了 HasStatus 接口,这意味着它们除了异常消息外,还有一个状态码。

在服务器端,异常包含普通的 Java 构造函数和方法,如 getMessage()getCause() 等,此外还包含 HasStatus API 中的 status() 方法,该方法返回状态码。

异常还增加了新的强制字段 gqlStatusstatusDescriptiondiagnosticRecord,以及一个可选的 cause 字段。cause 字段本身也有自己的 GQLSTATUS、状态描述、诊断记录和消息。
保留了 getMessage() 方法,因为 Java 异常固有地具有此方法。并添加了一个新的分类字段,以涵盖客户端错误、瞬时错误和数据库错误的划分,这些划分目前是 Neo4j 码的一部分。所有这些字段构建了 GQLSTATUS 对象,该对象作为 Failure Bolt 消息的一部分发送给驱动程序。具体外观取决于驱动程序和服务器版本的组合。更多信息请参见服务器-驱动程序版本兼容性

在驱动程序端,Neo4jException 扩展了与服务器端对应的方法。驱动程序接收 Failure Bolt 消息并提取状态码和错误消息。然后,它构建一个包含状态码、错误消息和其他相关信息的异常,并将其发送给客户端。

查询日志

由于查询日志位于服务器端且作用于整个 DBMS,连接到同一 DBMS 的多个客户端会写入同一个查询日志。由于客户端可能使用不同的驱动程序版本,因此它们可能具有不同的错误框架格式。

在 Neo4j 5.25 中,查询日志的默认 JSON 模板已更新,包含一个 errorInfo 条目。此条目包含 GQLSTATUSstatusDescriptionclassificationposition(如果适用)和 cause(如果适用),其内容与错误对象中的条目相同。

服务器-驱动程序版本兼容性

服务器和驱动程序通过 Bolt 协议相互通信。在握手过程中,它们会协商使用服务器和驱动程序都支持的最新 Bolt 协议版本。有关不同服务器版本支持的 Bolt 版本,请参阅Bolt 协议文档

Neo4j 服务器版本 5.25 及更高版本在 JSON 格式的查询日志中提供了带有附加 GQL-status 错误对象的新错误框架。Bolt 协议自 5.7 版本起支持此功能,该版本对应于服务器端和驱动程序端的 5.26 或更高版本。

要充分利用新错误框架,您的服务器和驱动程序都必须支持它。版本低于 5.26 的驱动程序不会为异常发送任何 GQL-status 对象,即使服务器版本是 5.26 或更高。

如果版本 5.26 或更高版本的驱动程序与版本低于 5.26 的服务器通信,驱动程序需要使用 GQL-status 对象对异常进行填充。在这种情况下,所有异常都将返回默认的 GQLSTATUS 码 50N42。

表 5. 错误兼容性矩阵

驱动程序版本 5.25 或更旧

驱动程序版本 5.26 或更新

服务器版本 5.24 或更旧

Bolt: 现有错误信息

查询日志: 现有错误信息

Bolt: 带有默认值的附加 GQL-status 对象

查询日志: 现有错误信息

服务器版本 5.25

Bolt: 现有错误信息

查询日志: 附加 errorInfo 条目

Bolt: 带有默认值的附加 GQL-status 对象

查询日志: 附加 errorInfo 条目

服务器版本 5.26 或更新

Bolt: 现有错误信息

查询日志: 附加 errorInfo 条目

Bolt: 附加 GQL-status 对象

查询日志: 附加 errorInfo 条目

© . All rights reserved.