服务器错误

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

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

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

本页介绍 GQL 状态和 Neo4j 状态错误对象框架、它们的结构、为错误提供的对象以及如何解释它们。它还解释了错误内部机制以及 GQLSTATUS 和错误的服务器-驱动程序兼容性。

GQL 状态错误对象

在 GQL 状态对象框架中,当用户向服务器执行查询时,它总是产生一个结果,称为执行结果。如果在执行过程中发生错误,结果将记录为异常条件,表示失败结果且无输出。错误的执行结果表示为具有失败结果的 GQL 状态对象列表,这些对象根据以下优先级规则组织:

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

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

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

每个 GQL 状态对象包含以下字段:

表 1. GQLSTATUS 错误对象

GQLSTATUS 代码

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

StatusDescription

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

DiagnosticRecord

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

字段

描述

OPERATION

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

OPERATION_CODE

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

CURRENT_SCHEMA

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

_classification

Neo4j 错误分类,可以是 CLIENT_ERRORTRANSIENT_ERRORDATABASE_ERROR

_position

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

GQL 状态错误对象还可以包含一个可选的 GQL 状态对象,该对象表示错误的起因,并用于提供额外、更具体的诊断信息。

GQLSTATUS 错误代码的类别

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

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

表 2. GQLSTATUS 代码类别

类别

条件

08

连接异常

22

数据异常

25

无效事务状态

40

事务回滚

42

语法错误或访问规则违规

50

一般处理异常

51

系统配置或操作异常

52

过程异常

Neo4j 状态错误对象

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

错误对象包含以下字段:

表 3. Neo4j 错误对象

Neo4j 代码

格式为 Neo.[Type].[SubType].[Name] 的 Neo4j 代码。

描述

特定错误的描述。

消息

错误消息。

严重级别

错误

类别

错误的类别。可用类别包括 CLIENT_ERRORTRANSIENT_ERRORDATABASE_ERROR

位置

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

欲了解更多信息,请参阅 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 对象,该对象作为故障 Bolt 消息的一部分发送给驱动程序。具体表现形式取决于驱动程序和服务器版本的组合。欲了解更多信息,请参阅 服务器-驱动程序版本兼容性

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

查询日志记录

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

在 Neo4j 5.25 中,查询日志的默认 JSON 模板已更新,以包含 errorInfo 条目。此条目包含 GQLSTATUSstatusDescriptionclassificationposition(如适用)和 cause(如适用),且条目相同。

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

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

包含额外 GQL 状态错误对象的新错误框架在 Neo4j 服务器 5.25 及更高版本的 JSON 格式查询日志中可用。它自 Bolt 5.7 起通过 Bolt 协议支持,对应于服务器和驱动程序端的 5.26 或更高版本。

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

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

表 5. 错误兼容性矩阵

驱动程序 5.25 或更早版本

驱动程序 5.26 或更新版本

服务器 5.24 或更早版本

Bolt:现有错误信息

查询日志:现有错误信息

Bolt:带有默认值的额外 GQL 状态对象

查询日志:现有错误信息

服务器 5.25

Bolt:现有错误信息

查询日志:额外 errorInfo 条目

Bolt:带有默认值的额外 GQL 状态对象

查询日志:额外 errorInfo 条目

服务器 5.26 或更新版本

Bolt:现有错误信息

查询日志:额外 errorInfo 条目

Bolt:额外 GQL 状态对象

查询日志:额外 errorInfo 条目

© . All rights reserved.