通知代码列表

以下页面提供了 Neo4j 中所有通知的概述,包括 GQLSTATUS 代码和 Neo4j 代码,以及一些场景及其可能的解决方案。

请注意,尽管 GQLSTATUS 代码保持稳定(对其进行的任何更改都将是破坏性的),但与这些代码相关的状态描述的更改不是破坏性的,并且可能随时发生。因此,不建议解析状态描述或将其集成到脚本中。

PERFORMANCE 通知

当查询使用成本较高的操作,并且可以通过更改查询或添加索引来提高性能时,会返回性能通知。

笛卡尔积

当执行计划中存在笛卡尔积时,会返回此通知。

表 1. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.CartesianProduct

标题

此查询在断开连接的模式之间构建笛卡尔积。

描述

如果查询的一部分包含多个断开连接的模式,这将在所有这些部分之间构建笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然有时是故意的,但通常可以通过重写查询来避免使用这种交叉乘积,例如通过在不同部分之间添加关系或使用 OPTIONAL MATCH (%s)。

类别

PERFORMANCE

GQLSTATUS 代码

03N90

状态描述

信息:笛卡尔积。断开连接的模式 { $pat } 构建了笛卡尔积。笛卡尔积可能产生大量数据并减慢查询处理速度。

分类

PERFORMANCE

严重程度级别

INFORMATION

示例 1. 包含许多断开连接模式的查询
查询
MATCH (c:Child), (p:Parent) RETURN c, p
返回的 GQLSTATUS 代码

03N90

返回的状态描述

信息:笛卡尔积。断开连接的模式 (c:Child), (p:Parent) 构建了笛卡尔积。笛卡尔积可能产生大量数据并减慢查询处理速度。

改进建议

如果需要笛卡尔积,则无法改进此查询。但在许多情况下,您可能不需要所有子节点和父节点的组合,此时就可以改进此查询。例如,如果您需要子节点及其父节点,则可以通过重写查询来改进它,如下所示:

MATCH (c:Child)-[:ChildOf]->(p:Parent) RETURN c, p
查询
MATCH (c:Child), (p:Parent) RETURN c, p
返回代码的描述

如果查询的一部分包含多个断开连接的模式,这将在所有这些部分之间构建笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然有时是故意的,但通常可以通过重写查询来避免使用这种交叉乘积,例如通过在不同部分之间添加关系或使用 OPTIONAL MATCH(标识符为:(p))。

改进建议

如果需要笛卡尔积,则无法改进此查询。但在许多情况下,您可能不需要所有子节点和父节点的组合,此时就可以改进此查询。例如,如果您需要子节点及其父节点,则可以通过重写查询来改进它,如下所示:

MATCH (c:Child)-[:ChildOf]->(p:Parent) RETURN c, p

无边界变长模式

当变长关系未指定上限时,会返回此通知。

表 2. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.UnboundedVariableLengthPattern

标题

提供的模式是无边界的,请考虑为节点跳数添加上限。

描述

将最短路径与无边界模式一起使用可能会导致执行时间过长。建议为模式中的节点跳数使用上限。

类别

PERFORMANCE

GQLSTATUS 代码

03N91

状态描述

信息:无边界变长模式。提供的模式 { $pat } 是无边界的。将最短路径与无边界模式一起使用可能会导致执行时间过长。请为模式中的节点跳数使用上限(例如 [*..5])。

分类

PERFORMANCE

严重程度级别

INFORMATION

示例 2. 使用无边界模式的最短路径
查询
MATCH p=shortestPath((n)-[*]->(m))
WHERE n <> m
RETURN p
返回的 GQLSTATUS 代码

03N91

返回的状态描述

信息:无边界变长模式。提供的模式 (n)-[*]→(m) 是无边界的。将最短路径与无边界模式一起使用可能会导致执行时间过长。请为模式中的节点跳数使用上限(例如 [*..5])。

改进建议

如果您的图很大,此查询可能会非常慢。请考虑添加上限。

MATCH p=shortestPath((n)-[*..8]->(m))
WHERE n <> m
RETURN p
查询
MATCH p=shortestPath((n)-[*]->(m)) RETURN p
返回代码的描述

将最短路径与无边界模式一起使用可能会导致执行时间过长。建议为模式中的节点跳数使用上限。

改进建议

如果您的图很大,此查询可能会非常慢。请考虑添加上限。

MATCH p=shortestPath((n)-[*..8]->(m)) RETURN p

穷举最短路径

当最短路径上的谓词需要检查整个路径才能决定是否有效时,最短路径可能会回退到穷举搜索算法。更多信息,请参阅 Cypher 手册 → 最短路径 - 对路径的额外谓词检查

表 3. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.ExhaustiveShortestPath

标题

已为您的查询计划了穷举最短路径,这意味着最短路径图算法可能不会用于查找最短路径。因此,为了查找请求的最短路径,可能会使用对所有路径的穷举枚举。

描述

使用带有穷举搜索回退的最短路径可能会导致查询变慢,因为最短路径图算法可能不适用于此用例。建议引入 WITH 以将包含最短路径的 MATCH 与该路径上的存在谓词分开。

类别

PERFORMANCE

GQLSTATUS 代码

03N92

状态描述

信息:穷举最短路径。由于存在谓词 { $pred_list },查询使用穷举最短路径运行。可以使用 WITHMATCH 与存在谓词分开。

分类

PERFORMANCE

严重程度级别

INFORMATION

示例 3. 使用穷举最短路径运行的查询
查询
MATCH p = shortestPath(()-[*..42]-())
WHERE ANY(n in nodes(p) WHERE n:Label)
RETURN p
返回的 GQLSTATUS 代码

03N92

返回的状态描述

信息:穷举最短路径。由于存在谓词 ANY(n in nodes(p) WHERE n:Label),查询使用穷举最短路径运行。可以使用 WITHMATCH 与存在谓词分开。

改进建议

MATCH 子句后引入 WITH 将谓词分开。

MATCH p = shortestPath(()-[*..42]-())
WITH p
WHERE ANY(n in nodes(p) WHERE n:Label)
RETURN p
查询
MATCH p = shortestPath(()-[*..42]-())
WHERE ANY(n in nodes(p) WHERE n:Label)
RETURN p
返回代码的描述

使用带有穷举搜索回退的最短路径可能会导致查询变慢,因为最短路径图算法可能不适用于此用例。建议引入 WITH 以将包含最短路径的 MATCH 与该路径上的存在谓词分开。

改进建议

MATCH 子句后引入 WITH 将谓词分开。

MATCH p = shortestPath(()-[*..42]-())
WITH p
WHERE ANY(n in nodes(p) WHERE n:Label)
RETURN p

无适用的索引

当使用 LOAD CSV 和匹配未索引标签的 MATCHMERGE 子句时,会返回此通知。这在大型数据集上性能可能不佳。添加索引可以提高查询速度。

表 4. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.NoApplicableIndex

标题

添加模式索引可以加速此查询。

描述

使用 LOAD CSV 后跟匹配未索引标签的 MATCHMERGE,在大型数据集上很可能性能不佳。请考虑使用模式索引。

类别

PERFORMANCE

GQLSTATUS 代码

03N93

状态描述

信息:无适用的索引。LOAD CSV 与未索引标签上的 MATCHMERGE 组合使用可能会导致执行时间过长。请考虑为标签 { $label } 添加索引。

分类

PERFORMANCE

严重程度级别

INFORMATION

示例 4. LOAD CSVMATCHMERGE
查询
LOAD CSV FROM 'file:///ignore/ignore.csv' AS line WITH * MATCH (n:Person{name:line[0]}) RETURN line, n
返回的 GQLSTATUS 代码

03N93

返回的状态描述

信息:无适用的索引。LOAD CSV 与未索引标签上的 MATCHMERGE 组合使用可能会导致执行时间过长。请考虑为标签 Person 添加索引。

改进建议

在您匹配的标签和属性上创建索引。

CREATE INDEX FOR (n:Person) ON (n.name)
查询
LOAD CSV FROM 'file:///ignore/ignore.csv' AS line WITH * MATCH (n:Person{name:line[0]}) RETURN line, n
返回代码的描述

使用 LOAD CSV 后跟匹配未索引标签的 MATCHMERGE,在大型数据集上很可能性能不佳。请考虑使用模式索引。

改进建议

在您匹配的标签和属性上创建索引。

CREATE INDEX FOR (n:Person) ON (n.name)

Eager 算子

当查询的执行计划包含 Eager 算子时,会返回此通知。

表 5. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.EagerOperator

标题

此查询的执行计划包含 Eager 算子,该算子强制将所有依赖数据物化到主内存中然后继续

描述

在执行计划包含 Eager 算子的查询中,使用大型数据集的 LOAD CSV 可能会消耗大量内存,并且性能可能不佳。有关更多信息以及如何避免问题的提示,请参阅 Neo4j 手册中关于 Eager 算子的条目。

类别

PERFORMANCE

GQLSTATUS 代码

03N94

状态描述

信息:Eager 算子。查询执行计划包含 Eager 算子。LOAD CSVEager 结合使用可能消耗大量内存。

分类

PERFORMANCE

严重程度级别

INFORMATION

示例 5. LOAD CSV 与 Eager 算子
查询
LOAD CSV FROM 'file:///ignore/ignore.csv' AS line MATCH (n:Person{name:line[0]}) DELETE n RETURN line
返回的 GQLSTATUS 代码

03N94

返回的状态描述

信息:Eager 算子。查询执行计划包含 Eager 算子。LOAD CSVEager 结合使用可能消耗大量内存。

改进建议

有关更多信息以及如何避免问题的提示,请参阅 Cypher 手册 → Eager 算子。在此特定情况下,查询可以重写为以下形式:

LOAD CSV FROM 'file:///ignore/ignore.csv' AS line
CALL {
    WITH line
    MATCH (n:Person{name:line[0]}) DELETE n
}
RETURN line

LOAD CSV 与 Eager 算子结合使用可能占用大量内存。

查询
LOAD CSV FROM 'file:///ignore/ignore.csv' AS line MATCH (n:Person{name:line[0]}) DELETE n RETURN line
返回代码的描述

在执行计划包含 Eager 算子的查询中,使用大型数据集的 LOAD CSV 可能会消耗大量内存,并且性能可能不佳。有关更多信息以及如何避免问题的提示,请参阅 Neo4j 手册中关于 Eager 算子的条目。

改进建议

有关更多信息以及如何避免问题的提示,请参阅 Cypher 手册 → Eager 算子。在此特定情况下,查询可以重写为以下形式:

LOAD CSV FROM 'file:///ignore/ignore.csv' AS line
CALL {
    WITH line
    MATCH (n:Person{name:line[0]}) DELETE n
}
RETURN line

动态属性

表 6. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.DynamicProperty

标题

使用动态属性的查询不会对这些属性使用索引查找或索引扫描

描述

使用动态属性使得此查询无法使用索引查找 (%s)。

类别

PERFORMANCE

GQLSTATUS 代码

03N95

状态描述

信息:动态属性。标签/类型 { $label_list } 上存在索引。无法对动态属性使用索引。请考虑使用静态属性。

分类

PERFORMANCE

严重程度级别

INFORMATION

示例 6. 动态节点属性键导致无法使用索引
查询
MATCH (n:Person) WHERE n[$prop] IS NOT NULL RETURN n;
返回的 GQLSTATUS 代码

03N95

返回的状态描述

信息:动态属性。标签/类型 Person 上存在索引。无法对动态属性使用索引。请考虑使用静态属性。

改进建议

如果存在 (n:Person) ON (n.name) 的索引,则不会用于上述查询,因为查询使用了动态属性。因此,如果存在索引,最好使用常量值。例如,如果 prop 等于 name,则以下查询将能够使用索引:

MATCH (n:Person) WHERE n.name IS NOT NULL RETURN n;
查询
MATCH (n:Person) WHERE n[$prop] IS NOT NULL RETURN n;
返回代码的描述

使用动态属性使得此查询无法使用索引查找(索引标签为:Person)。

改进建议

如果存在 (n:Person) ON (n.name) 的索引,则不会用于上述查询,因为查询使用了动态属性。因此,如果存在索引,最好使用常量值。例如,如果 prop 等于 name,则以下查询将能够使用索引:

MATCH (n:Person) WHERE n.name IS NOT NULL RETURN n;
示例 7. 动态关系属性键导致无法使用索引
查询
MATCH ()-[r: KNOWS]->() WHERE r[$prop] IS NOT NULL RETURN r
返回的 GQLSTATUS 代码

03N95

返回的状态描述

信息:动态属性。标签/类型 KNOWS 上存在索引。无法对动态属性使用索引。请考虑使用静态属性。

改进建议

与动态节点属性类似,如果可能,请使用常量值,尤其是在关系属性上存在索引时。例如,如果 { $prop } 等于 since,可以将查询重写为:

MATCH ()-[r: KNOWS]->() WHERE r.since IS NOT NULL RETURN r
查询
MATCH ()-[r: KNOWS]->() WHERE r[$prop] IS NOT NULL RETURN r
返回代码的描述

使用动态属性使得此查询无法使用索引查找(索引类型为:KNOWS)。

改进建议

与动态节点属性类似,如果可能,请使用常量值,尤其是在关系属性上存在索引时。例如,如果 $prop 等于 since,可以将查询重写为:

MATCH ()-[r: KNOWS]->() WHERE r.since IS NOT NULL RETURN r

代码生成失败

当无法为查询生成代码(例如,查询太大)时,会创建 CodeGenerationFailed 通知。有关特定查询的更多信息,请参阅 debug.log 文件中的堆栈跟踪。

表 7. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.CodeGenerationFailed

标题

数据库无法为查询生成代码。可以在 debug.log 中找到堆栈跟踪。

描述

数据库无法为查询生成代码。可以在 debug.log 中找到堆栈跟踪。(方法太大)

类别

PERFORMANCE

GQLSTATUS 代码

03N96

状态描述

信息:代码生成失败。生成代码失败,回退到解释型 $enginetype 引擎。可以在 debug.log 中找到堆栈跟踪。原因:$msg。

分类

PERFORMANCE

严重程度级别

INFORMATION

HINT 通知

默认情况下,当 Cypher 规划器或运行时无法创建满足指定提示(例如 JOININDEX)的查询计划时,会返回 HINT 通知。可以通过将配置 dbms.cypher.hints_error 设置为 true 来更改 Cypher 规划器或运行时的此行为。在这种情况下,查询将返回错误。

Join 提示无法满足

表 8. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.JoinHintUnfulfillableWarning

标题

数据库无法规划带提示的 join。

描述

未规划带提示的 join。这可能是因为没有生成的计划包含 join 键,请尝试使用不同的 join 键或重组您的查询。(%s)

类别

HINT

GQLSTATUS 代码

01N30

状态描述

警告:join 提示无法满足。无法使用 JOIN ON $var_list 创建计划。请尝试更改 join 键或重组您的查询。

分类

HINT

严重程度级别

WARNING

示例 8. 尽管给定了 JOIN 提示,但仍无法满足该提示
查询
MATCH (a:A)
WITH a, 1 AS horizon
OPTIONAL MATCH (a)-[r]->(b:B)
USING JOIN ON a
OPTIONAL MATCH (a)--(c)
RETURN *
返回的 GQLSTATUS 代码

01N30

返回的状态描述

警告:joint 提示无法满足。无法使用 JOIN ON a 创建计划。请尝试更改 join 键或重组您的查询。

改进建议

无法应用 JOIN 提示,因为其指定的变量在 OPTIONAL MATCH 之前,因此已经绑定。对于此查询,唯一的选择是删除该提示或修改查询以允许使用该提示。

查询
MATCH (a:A)
WITH a, 1 AS horizon
OPTIONAL MATCH (a)-[r]->(b:B)
USING JOIN ON a
OPTIONAL MATCH (a)--(c)
RETURN *
返回代码的描述

未规划带提示的 join。这可能是因为没有生成的计划包含 join 键,请尝试使用不同的 join 键或重组您的查询。(带提示的 join 键标识符为:a

改进建议

无法应用 JOIN 提示,因为其指定的变量在 OPTIONAL MATCH 之前,因此已经绑定。对于此查询,唯一的选择是删除该提示或修改查询以允许使用该提示。

未找到提示的索引

表 9. 通知详情

Neo4j 代码

Neo.ClientNotification.Schema.HintedIndexNotFound

标题

请求(直接或间接)引用了不存在的索引。

描述

提示的索引不存在,请检查模式。(%s)

类别

HINT

GQLSTATUS 代码

01N31

状态描述

警告:未找到提示的索引。无法使用 { $index_descr } 创建计划,因为索引不存在。

分类

HINT

严重程度级别

WARNING

示例 9. 尽管给定了索引提示,但仍无法使用标签索引
查询
MATCH (a: Label)
USING INDEX a:Label(id)
WHERE a.id = 1
RETURN a
返回的 GQLSTATUS 代码

01N31

返回的状态描述

警告:未找到提示的索引。无法使用 INDEX :Label(id) 创建计划,因为索引不存在。

改进建议

提示的索引不存在,请确保标签和属性拼写正确。如果拼写正确,请创建该索引或从查询中删除该提示。

查询
MATCH (a: Label)
USING INDEX a:Label(id)
WHERE a.id = 1
RETURN a
返回代码的描述

提示的索引不存在,请检查模式(索引为:INDEX FOR (a:`Label`) ON (a.id))。

改进建议

提示的索引不存在,请确保标签和属性拼写正确。如果拼写正确,请创建该索引或从查询中删除该提示。

示例 10. 尽管给定了索引提示,但仍无法使用关系索引
查询
MATCH ()-[r:Rel]-()
USING INDEX r:Rel(id)
WHERE r.id = 1
RETURN r
返回的 GQLSTATUS 代码

01N31

返回的状态描述

警告:未找到提示的索引。无法使用 INDEX :Rel(id) 创建计划,因为索引不存在。

改进建议

提示的索引不存在,请确保关系类型和属性拼写正确。如果拼写正确,请创建该索引或从查询中删除该提示。

查询
MATCH ()-[r:Rel]-()
USING INDEX r:Rel(id)
WHERE r.id = 1
RETURN r
返回代码的描述

提示的索引不存在,请检查模式(索引为:INDEX FOR ()-[r:`Rel`]-() ON (r.id))。

改进建议

提示的索引不存在,请确保关系类型和属性拼写正确。如果拼写正确,请创建该索引或从查询中删除该提示。

UNRECOGNIZED 通知

当查询或命令提及系统未知实体时,会返回 Unrecognized 通知。

未找到 Home 数据库

表 10. 通知详情

Neo4j 代码

Neo.ClientNotification.Database.HomeDatabaseNotFound

标题

请求引用了不存在的 home 数据库。

描述

提供的 home 数据库在 DBMS 中当前不存在。此命令直到创建该数据库后才会生效。(%s)

类别

UNRECOGNIZED

GQLSTATUS 代码

00N50

状态描述

注意:成功完成 - 未找到 home 数据库。数据库 { $db } 不存在。请验证拼写是否正确或创建该数据库以使命令生效。

分类

UNRECOGNIZED

严重程度级别

INFORMATION

示例 11. 将 home 数据库设置为不存在的数据库
查询
CREATE USER john SET PASSWORD "secret" SET HOME DATABASE nej4
返回的 GQLSTATUS 代码

00N50

返回的状态描述

注意:成功完成 - 未找到 home 数据库。数据库 ne4j 不存在。请验证拼写是否正确或创建该数据库以使命令生效。

改进建议

验证 home 数据库名称是否拼写错误。

查询
CREATE USER john SET PASSWORD "secret" SET HOME DATABASE nej4
返回代码的描述

提供的 home 数据库在 DBMS 中当前不存在。此命令直到创建该数据库后才会生效。(HOME DATABASE: nej4)

改进建议

验证 home 数据库名称是否拼写错误。

未知标签

表 11. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.UnknownLabelWarning

标题

提供的标签不在数据库中。

描述

您查询中的某个标签在数据库中不可用,请确保您没有拼写错误或在应用程序中运行此语句时该标签可用。(%s)

类别

UNRECOGNIZED

GQLSTATUS 代码

01N50

状态描述

警告:未知标签。标签 { $label } 不存在。请验证拼写是否正确。

分类

UNRECOGNIZED

严重程度级别

WARNING

示例 12. 匹配数据库中不存在标签的节点
查询
MATCH (n:Perso) RETURN n
返回的 GQLSTATUS 代码

01N50

返回的状态描述

警告:未知标签。标签 Perso 不存在。请验证拼写是否正确。

改进建议

验证标签是否拼写错误。如果您打算将来使用该标签创建节点,则无需更改。

查询
MATCH (n:Perso) RETURN n
返回代码的描述

您查询中的某个标签在数据库中不可用,请确保您没有拼写错误或在应用程序中运行此语句时该标签可用(缺失的标签名称为:Perso)。

改进建议

验证标签是否拼写错误。如果您计划将来使用该标签创建节点,则无需更改。

未知关系类型

表 12. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.UnknownRelationshipTypeWarning

标题

提供的关系类型不在数据库中。

描述

您查询中的某个关系类型在数据库中不可用,请确保您没有拼写错误或在应用程序中运行此语句时该标签可用。(%s)

类别

UNRECOGNIZED

GQLSTATUS 代码

01N51

状态描述

警告:未知关系类型。关系类型 { $reltype } 不存在。请验证拼写是否正确。

分类

UNRECOGNIZED

严重程度级别

WARNING

示例 13. 匹配不存在类型的关系
查询
MATCH (n)-[:NonExistingType]->() RETURN n
返回的 GQLSTATUS 代码

01N51

返回的状态描述

警告:未知关系类型。关系类型 NonExistingType 不存在。请验证拼写是否正确。

改进建议

验证关系类型是否拼写错误。如果您计划将来创建此类型的关系,则无需更改。

查询
MATCH (n)-[:NonExistingType]->() RETURN n
返回代码的描述

您查询中的某个关系类型在数据库中不可用,请确保您没有拼写错误或在应用程序中运行此语句时该标签可用(缺失的关系类型为:NonExistingType)。

改进建议

验证关系类型是否拼写错误。如果您计划将来创建此类型的关系,则无需更改。

未知属性键

表 13. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.UnknownPropertyKeyWarning

标题

提供的属性键不在数据库中

描述

您查询中的某个属性名称在数据库中不可用,请确保您没有拼写错误或在应用程序中运行此语句时该标签可用。(%s)

类别

UNRECOGNIZED

GQLSTATUS 代码

01N52

状态描述

警告:未知属性键。属性 { $propkey } 不存在。请验证拼写是否正确。

分类

UNRECOGNIZED

严重程度级别

WARNING

示例 14. 匹配不存在的属性键
查询
MATCH (n:Person {nme:”Tom”})
RETURN n
返回的 GQLSTATUS 代码

01N52

返回的状态描述

警告:未知属性键。属性 nme 不存在。请验证拼写是否正确。

改进建议

验证属性键是否拼写错误。如果您计划将来创建该属性键,则无需更改。

查询
MATCH (n:Person {nme:”Tom”})
RETURN n
返回代码的描述

您查询中的某个属性名称在数据库中不可用,请确保您没有拼写错误或在应用程序中运行此语句时该标签可用(缺失的属性名称为:nme)。

改进建议

验证属性键是否拼写错误。如果您计划将来创建该属性键,则无需更改。

聚合跳过空值

表 14. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.AggregationSkippedNull

标题

查询包含跳过空值的聚合函数。

描述

查询包含跳过空值的聚合函数。

类别

UNRECOGNIZED

GQLSTATUS 代码

01G11

状态描述

警告:集合函数中排除了空值。

分类

UNRECOGNIZED

严重程度级别

WARNING

示例 15. 聚合跳过 NULL 值
查询
UNWIND [1, NULL, 2] AS i RETURN count(i) AS sum
返回的 GQLSTATUS 代码

01G11

返回的状态描述

警告:集合函数中排除了空值。

查询
UNWIND [1, NULL, 2] AS i RETURN count(i) AS sum
返回代码的描述

查询包含跳过空值的聚合函数。

UNSUPPORTED 通知

当查询或命令尝试使用当前系统不支持的功能或不应在生产环境中使用实验性功能时,会返回 Unsupported 通知。

不支持的运行时

表 15. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.RuntimeUnsupportedWarning

标题

所选的运行时不支持此查询。

描述

所选的运行时不支持此查询,请使用其他运行时或回退到默认值。(%s)

类别

UNSUPPORTED

GQLSTATUS 代码

01N40

状态描述

警告:不支持的运行时。无法使用 { $preparser_input1 } 执行查询,使用的是 { $preparser_input2 }。原因:{ $msg }

分类

UNSUPPORTED

严重程度级别

WARNING

示例 16. Cypher 命令不支持的运行时
查询
EXPLAIN CYPHER runtime=pipelined SHOW INDEXES YIELD *
返回的 GQLSTATUS 代码

01N40

返回的状态描述

警告:不支持的运行时。无法使用 runtime=pipelined 执行查询,使用的是 runtime=slotted。原因:Pipelined 尚不支持包含 ShowIndexes 的计划,请使用其他运行时。

改进建议

使用不同的运行时或删除运行时选项以使用默认运行时运行查询

SHOW INDEXES YIELD *
查询
CYPHER runtime=pipelined SHOW INDEXES YIELD *
返回代码的描述

所选的运行时不支持此查询,请使用其他运行时或回退到默认值。(Pipelined 尚不支持包含 ShowIndexes 的计划,请使用其他运行时。)

改进建议

使用不同的运行时或删除运行时选项以使用默认运行时运行查询

SHOW INDEXES YIELD *

实验性运行时

自 Neo4j 5.14 起,已移除此通知的使用。

表 16. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.RuntimeExperimental

标题

此功能是实验性的,不应在生产系统中使用。

描述

您正在使用实验性功能。(%s)

类别

UNSUPPORTED

严重程度级别

WARNING

示例 17. 使用并行运行时
查询
CYPHER runtime=parallel MATCH (n) RETURN (n)
返回代码的描述

您正在使用实验性功能(并行运行时是实验性的,可能存在不稳定和潜在的正确性问题)。

改进建议

并行运行时不应在生产环境中使用。请选择其他运行时或删除选项以使用默认运行时

MATCH (n) RETURN (n)

DEPRECATION 通知

弃用通知包含有关已弃用的功能或特性信息。请务必改为使用新功能,否则将来版本中查询可能会中断。

功能已弃用

表 17. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.FeatureDeprecationWarning

标题

此功能已弃用,将在未来版本中移除。

描述

  • 该过程有一个已弃用的字段。(%s)

  • 该函数有一个已弃用的字段。(%s)

  • 在同一个 CREATE 中创建实体 (%s) 并引用该实体进行属性定义已弃用。

  • 在同一个 MERGE 中合并实体 (%s) 并引用该实体进行属性定义已弃用。

  • Unicode 字符 %s 已弃用于未转义的标识符,将来将被视为空白字符。要继续使用它,请通过在标识符 %s 周围添加反引号来转义标识符。

  • Unicode 表示为 %s 的字符已弃用于未转义的标识符,将来将不受支持。要继续使用它,请通过在标识符 %s 周围添加反引号来转义标识符。

  • 适用于 Neo4j 5.5-5.25 UNION [ALL] 中的所有子查询应具有相同的返回列顺序。在 UNION [ALL] 子句中使用不同顺序的返回项已弃用,并将在未来版本中移除。

  • 带有未转义 . 的数据库和别名已弃用,除非用于指示它们属于复合数据库。包含 . 的名称应进行转义。(%s)

类别

DEPRECATION

GQLSTATUS 代码

01N00

状态描述

警告:功能已弃用。$msg

分类

DEPRECATION

严重程度级别

WARNING

示例 18. 创建包含点号且未转义名称的数据库
查询
CREATE DATABASE foo.bar
返回的 GQLSTATUS 代码

01N00

返回的状态描述

警告:功能已弃用。带有未转义 . 的数据库和别名已弃用,除非用于指示它们属于复合数据库。包含 . 的名称应进行转义。(名称:foo.bar)

改进建议

如果不是用于复合数据库,请使用字符 ` 转义名称。

CREATE DATABASE `foo.bar`
查询
CREATE DATABASE foo.bar
返回代码的描述

带有未转义 . 的数据库和别名已弃用,除非用于指示它们属于复合数据库。包含 . 的名称应进行转义。(名称:foo.bar

示例 19. 在 UNION 子句中使用不同顺序的返回项
查询
RETURN 'val' as one, 'val' as two
UNION
RETURN 'val' as two, 'val' as one
返回的 GQLSTATUS 代码

01N00

返回的状态描述

警告:功能已弃用。UNION [ALL] 中的所有子查询应具有相同的返回列顺序。在 UNION [ALL] 子句中使用不同顺序的返回项已弃用,并将在未来版本中移除。

在版本 5.5 到 5.25 中,在 UNION [ALL] 子句中使用不同顺序的返回项已弃用。然而,自版本 5.26 起,经过成本效益分析和有价值的用户反馈,该弃用已撤回。

示例 20. 在未转义标识符中使用 Unicode \u0085
查询
RETURN 'val' as one, 'val' as two
UNION
RETURN 'val' as two, 'val' as one
返回代码的描述

UNION [ALL] 中的所有子查询应具有相同的返回列顺序。在 UNION [ALL] 子句中使用不同顺序的返回项已弃用,并将在未来版本中移除。

改进建议

在所有通过 UNION 子句组合的子查询中使用相同的返回列顺序。

RETURN 'val' as one, 'val' as two
UNION
RETURN 'val' as one, 'val' as two
示例 21. 在未转义标识符中使用 Unicode \u0085
查询
RETURN 1 as my\u0085identifier
返回的 GQLSTATUS 代码

01N00

返回的状态描述

警告:功能已弃用。Unicode 字符 \u0085 已弃用于未转义的标识符,将来将被视为空白字符。要继续使用它,请通过在标识符 my\u0085identifier 周围添加反引号来转义标识符。

查询
RETURN 1 as my\u0085identifier
返回代码的描述

Unicode 字符 \u0085 已弃用于未转义的标识符,将来将被视为空白字符。要继续使用它,请通过在标识符 my\u0085identifier 周围添加反引号来转义标识符。

功能已弃用,有替代方案

表 18. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.FeatureDeprecationWarning

标题

此功能已弃用,将在未来版本中移除。

描述

  • 在未来版本中,在分隔备用关系类型时使用冒号的语义将发生变化。(%s)

  • 使用节点或关系来设置属性已弃用,并将在未来版本中移除。请改为使用 properties()。

  • 使用 shortestPath 和 allShortestPaths 处理固定长度关系已弃用,并将在未来版本中移除。请改为使用长度为 1 的路径 [r*1..1] 或带有 limit 的 Match。

  • 查询使用了已弃用的函数。(%s)

  • 查询使用了已弃用的过程。(%s)

  • 查询使用了已弃用的运行时选项。(%s)

  • 文本索引提供者 TextIndexProvider.DESCRIPTOR.name() 已弃用,并将在未来版本中移除。请改为使用 TrigramIndexProvider.DESCRIPTOR.name()

类别

DEPRECATION

GQLSTATUS 代码

01N01

状态描述

警告:功能已弃用,有替代方案。{ $thing1 } 已弃用。它被 { $thing2 } 替代。

分类

DEPRECATION

严重程度级别

WARNING

示例 22. 关系模式中竖线 |: 后的冒号
查询
MATCH (a)-[:A|:B|:C]-() RETURN *
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。:A|:B|:C 已弃用。它被 :A|B|C 替代。

改进建议

移除关系类型表达式中的冒号。

MATCH (a)-[:A|B|C]-() RETURN *
查询
MATCH (a)-[:A|:B|:C]-() RETURN *
返回代码的描述

在未来版本中,在分隔备用关系类型时使用冒号的语义将发生变化。(请改为使用 ':A|B|C')

改进建议

移除关系类型表达式中的冒号。

MATCH (a)-[:A|B|C]-() RETURN *
示例 23. 使用节点设置属性
查询
MATCH (a)-[]-(b)
SET a = b
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。SET a = b 已弃用。它被 SET a = properties(b) 替代。

改进建议

使用 properties() 函数获取 b 的所有属性。

MATCH (a)-[]-(b)
SET a = properties(b)
查询
MATCH (a)-[]-(b)
SET a = b
返回代码的描述

使用节点或关系来设置属性已弃用,并将在未来版本中移除。请改为使用 properties()

改进建议

使用 properties() 函数获取 b 的所有属性。

MATCH (a)-[]-(b)
SET a = properties(b)
示例 24. 使用关系设置属性
查询
MATCH (a)-[r]-(b)
SET a += r
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。SET a += r 已弃用。它被 SET a += properties(r) 替代。

改进建议

使用 properties() 函数获取 r 的所有属性。

MATCH (a)-[r]-(b)
SET a += properties(r)
查询
MATCH (a)-[r]-(b)
SET a += r
返回代码的描述

使用节点或关系来设置属性已弃用,并将在未来版本中移除。请改为使用 properties()

改进建议

使用 properties() 函数获取 r 的所有属性。

MATCH (a)-[r]-(b)
SET a += properties(r)
示例 25. 固定关系长度的最短路径
查询
MATCH (a:Start), shortestPath((a)-[r]->()) RETURN a
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。shortestPath((a)-[r]→()) 已弃用。它被 shortestPath((n)-[r*1..1]→(m)) 替代。

改进建议

如果关系长度固定,则无需搜索最短路径。相反,您可以将其重写为:

MATCH (a: Start)-[r]->(b: End) RETURN b LIMIT 1
查询
MATCH (a:Start), shortestPath((a)-[r]->()) RETURN a
返回代码的描述

使用 shortestPathallShortestPaths 处理固定长度关系已弃用,并将在未来版本中移除。请改为使用长度为 1 [r*1..1] 的路径或带有 limitMatch

改进建议

如果关系长度固定,则无需搜索最短路径。相反,您可以将其重写为:

MATCH (a: Start)-[r]->(b: End) RETURN b LIMIT 1
示例 26. 使用已弃用的运行时选项
查询
CYPHER runtime = interpreted MATCH (n) RETURN n
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。runtime=interpreted 已弃用。它被 runtime=slotted 替代。

改进建议

运行时 interpreted 已弃用,并改用其他运行时。或者,您可以删除运行时选项以使用默认运行时。

MATCH (n) RETURN n
查询
CYPHER runtime = interpreted MATCH (n) RETURN n
返回代码的描述

查询使用了已弃用的运行时选项。('runtime=interpreted' 已弃用,请改为使用 'runtime=slotted'

改进建议

运行时 interpreted 已弃用,并改用其他运行时。或者,您可以删除运行时选项以使用默认运行时。

MATCH (n) RETURN n
示例 27. 创建文本索引时使用 text-1.0 索引提供者
查询
CREATE TEXT INDEX FOR (n:Label) ON (n.prop) OPTIONS {indexProvider : 'text-1.0'}
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。text-1.0 已弃用。它被 text-2.0 替代。

改进建议

将选项 indexProvider 的值更新为 text-2.0

CREATE TEXT INDEX FOR (n:Label) ON (n.prop) OPTIONS {indexProvider : 'text-2.0'}
查询
CREATE TEXT INDEX FOR (n:Label) ON (n.prop) OPTIONS {indexProvider : 'text-1.0'}
返回代码的描述

文本索引的提供者 text-1.0 已弃用,并将在未来版本中移除。请改为使用 text-2.0

改进建议

将选项 indexProvider 的值更新为 text-2.0

CREATE TEXT INDEX FOR (n:Label) ON (n.prop) OPTIONS {indexProvider : 'text-2.0'}
示例 28. 使用已重命名或已弃用的过程
CALL cdc.query
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。cdc.query 已弃用。它被 db.cdc.query 替代。

CALL unsupported.dbms.shutdown
返回的 GQLSTATUS 代码

01N02

返回的状态描述

警告:功能已弃用,无替代方案。unsupported.dbms.shutdown 已弃用,将在无替代方案的情况下移除。

CALL unsupported.dbms.shutdown
返回代码的描述

查询使用了已弃用的过程:'unsupported.dbms.shutdown'

改进建议

移除对已弃用过程的使用。如果存在建议的替代方案,请更新为使用替代方案。

示例 29. 使用 id() 函数
查询
MATCH (a)
RETURN id(a)
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。id 已弃用。它被 elementId() 替代。

改进建议

请改为使用函数 elementId()

MATCH (a)
RETURN elementId(a)
查询
MATCH (a)
RETURN id(a)
返回的 GQLSTATUS 代码

01N02

返回的状态描述

警告:功能已弃用,无替代方案。id 已弃用,将在无替代方案的情况下移除。

查询
MATCH (a)
RETURN id(a)
返回代码的描述

查询使用了已弃用的函数:id

改进建议

请改为使用函数 elementId()

MATCH (a)
RETURN elementId(a)
示例 30. 在节点模式中使用名为 'where' 且未转义的变量
查询
MATCH (where {p: 5})
RETURN where
返回代码的描述

'(where {p: 5})' 已弃用。它被 '(`where` {p: 5})' 替代。

改进建议

要继续使用此名称的变量,请使用反引号转义变量名称

MATCH (`where` {p: 5})
RETURN `where`.p
查询
MATCH (where {p: 5})
RETURN where
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。(where {p: 5}) 已弃用。它被 (`where` {p: 5}) 替代。

改进建议

要继续使用此名称的变量,请使用反引号转义变量名称

MATCH (`where` {p: 5})
RETURN `where`.p
示例 31. 在关系模式中使用名为 'where' 且未转义的变量
查询
MATCH ()-[where {p: 5}]->()
RETURN where
返回代码的描述

'-[where {p: 5}]-' 已弃用。它被 '-[`where` {p: 5}]-' 替代。

改进建议

要继续使用此名称的变量,请使用反引号转义变量名称

MATCH ()-[`where` {p: 5}]->()
RETURN `where`.p
查询
MATCH ()-[where {p: 5}]->()
RETURN where
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。-[where {p: 5}]- 已弃用。它被 -[`where` {p: 5}]- 替代。

改进建议

要继续使用此名称的变量,请使用反引号转义变量名称

MATCH ()-[`where` {p: 5}]->()
RETURN `where`.p
示例 32. 在简单 CASE 表达式中将未加括号的标签表达式谓词用作 + 的右侧操作数
查询
MATCH (n)-[r]->(m)
WITH m, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + m:A
返回代码的描述

'… + m:A' 已弃用。它被 '… + (m:A)' 替代。

改进建议

+ 右侧的标签表达式谓词加上括号

MATCH (n)-[r]->(m)
WITH m, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + (m:A)
查询
MATCH (n)-[r]->(m)
WITH m, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + m:A
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。…​ + m:A 已弃用。它被 …​ + (m:A) 替代。

改进建议

+ 右侧的标签表达式谓词加上括号

MATCH (n)-[r]->(m)
WITH m, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + (m:A)
示例 33. 在简单 CASE 表达式中将未加括号的标签表达式谓词用作 + 的右侧操作数
查询
MATCH (n)-[r]->(m)
WITH r, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + r:C|D
返回代码的描述

'… + r:C|D' 已弃用。它被 '… + (r:C|D)' 替代。

改进建议

+ 右侧的标签表达式谓词加上括号

MATCH (n)-[r]->(m)
WITH r, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + (r:C|D)
查询
MATCH (n)-[r]->(m)
WITH r, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + r:C|D
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。…​ + r:C|D 已弃用。它被 …​ + (r:C|D) 替代。

改进建议

+ 右侧的标签表达式谓词加上括号

MATCH (n)-[r]->(m)
WITH r, n.truthCodes AS listOfBooleans
RETURN listOfBooleans + (r:C|D)
示例 34. 在简单 CASE 表达式中将名为 is 且未转义的变量用作 WHEN 操作数
查询
MATCH (n)
WITH n, n.internationalStandard AS is
RETURN CASE n
  WHEN is :: INTEGER THEN "ISO/IEC" + is
  ELSE is
END AS standardsName
返回代码的描述
'WHEN is

INTEGER' 已弃用。它被 'WHEN `is` :: INTEGER' 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH (n)
WITH n, n.internationalStandard AS `is`
RETURN CASE n
  WHEN `is` :: INTEGER THEN "ISO/IEC" + `is`
  ELSE `is`
END AS standardsName
查询
MATCH (n)
WITH n, n.internationalStandard AS is
RETURN CASE n
  WHEN is :: INTEGER THEN "ISO/IEC" + is
  ELSE is
END AS standardsName
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。WHEN is :: INTEGER 已弃用。它被 WHEN `is` :: INTEGER 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH (n)
WITH n, n.internationalStandard AS `is`
RETURN CASE n
  WHEN `is` :: INTEGER THEN "ISO/IEC" + `is`
  ELSE `is`
END AS standardsName
示例 35. 在简单 CASE 表达式中将名为 contains 且未转义的变量用于 WHEN 操作数内的加法运算
查询
MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(relationships(p)) AS contains
RETURN CASE size(nodes(p))
  WHEN contains + 1 THEN "okay"
  ELSE "not okay"
END AS check
返回代码的描述

'WHEN contains + 1 INTEGER' 已弃用。它被 'WHEN `contains` + 1 INTEGER' 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(relationships(p)) AS `contains`
RETURN CASE size(nodes(p))
  WHEN `contains` + 1 THEN "okay"
  ELSE "not okay"
END AS check
查询
MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(relationships(p)) AS contains
RETURN CASE size(nodes(p))
  WHEN contains + 1 THEN "okay"
  ELSE "not okay"
END AS check
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。WHEN contains + 1 INTEGER 已弃用。它被 WHEN `contains` + 1 INTEGER 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(relationships(p)) AS `contains`
RETURN CASE size(nodes(p))
  WHEN `contains` + 1 THEN "okay"
  ELSE "not okay"
END AS check
示例 36. 在简单 CASE 表达式中将名为 contains 且未转义的变量用于 WHEN 操作数内的减法运算
查询
MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(nodes(p)) AS contains
RETURN CASE size(relationships(p))
  WHEN contains - 1 THEN "okay"
  ELSE "not okay"
END AS check
返回代码的描述

'WHEN contains - 1 INTEGER' 已弃用。它被 'WHEN `contains` - 1 INTEGER' 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(nodes(p)) AS `contains`
RETURN CASE size(relationships(p))
  WHEN `contains` - 1 THEN "okay"
  ELSE "not okay"
END AS check
查询
MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(nodes(p)) AS contains
RETURN CASE size(relationships(p))
  WHEN contains - 1 THEN "okay"
  ELSE "not okay"
END AS check
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。WHEN contains - 1 INTEGER 已弃用。它被 WHEN `contains` - 1 INTEGER 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH p = (:A)-[:HAS]->(:B)
WITH p, size(nodes(p)) AS `contains`
RETURN CASE size(relationships(p))
  WHEN `contains` - 1 THEN "okay"
  ELSE "not okay"
END AS check
示例 37. 在简单 CASE 表达式中对名为 in 且未转义的变量使用 [] 算子,位于 WHEN 操作数内
查询
MATCH (c:Client)-[:MAKES]->(t:Transaction)
WITH t, c.ibanNumbers AS in
RETURN CASE t.ibanNumber
  WHEN in[0] THEN "used main account"
  ELSE "used different account"
END AS check
返回代码的描述

'WHEN in[0] INTEGER' 已弃用。它被 'WHEN `in`[0] INTEGER' 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH (c:Client)-[:MAKES]->(t:Transaction)
WITH t, c.ibanNumbers AS `in`
RETURN CASE t.ibanNumber
  WHEN `in`[0] THEN "used main account"
  ELSE "used different account"
END AS check
查询
MATCH (c:Client)-[:MAKES]->(t:Transaction)
WITH t, c.ibanNumbers AS in
RETURN CASE t.ibanNumber
  WHEN in[0] THEN "used main account"
  ELSE "used different account"
END AS check
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。WHEN in[0] INTEGER 已弃用。它被 WHEN `in`[0] INTEGER 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH (c:Client)-[:MAKES]->(t:Transaction)
WITH t, c.ibanNumbers AS `in`
RETURN CASE t.ibanNumber
  WHEN `in`[0] THEN "used main account"
  ELSE "used different account"
END AS check
示例 38. 在简单 CASE 表达式中对名为 in 且未转义的变量使用 [] 算子,位于 WHEN 操作数内
查询
MATCH (in:Client)-[:MAKES]->(t:Transaction)
RETURN CASE t.ibanNumber
  WHEN in["mainAccount"] THEN "used main account"
  ELSE "used different account"
END AS check
返回代码的描述

'WHEN in["mainAccount"] INTEGER' 已弃用。它被 'WHEN `in`["mainAccount"] INTEGER' 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH (in:Client)-[:MAKES]->(t:Transaction)
RETURN CASE t.ibanNumber
  WHEN `in`["mainAccount"] THEN "used main account"
  ELSE "used different account"
END AS check
查询
MATCH (in:Client)-[:MAKES]->(t:Transaction)
RETURN CASE t.ibanNumber
  WHEN in["mainAccount"] THEN "used main account"
  ELSE "used different account"
END AS check
返回的 GQLSTATUS 代码

01N01

返回的状态描述

警告:功能已弃用,有替代方案。WHEN in["mainAccount"] INTEGER 已弃用。它被 WHEN `in`["mainAccount"] INTEGER 替代。

改进建议

要继续在简单 CASE 表达式中使用此名称的变量,请使用反引号转义变量名称

MATCH (in:Client)-[:MAKES]->(t:Transaction)
RETURN CASE t.ibanNumber
  WHEN `in`["mainAccount"] THEN "used main account"
  ELSE "used different account"
END AS check

已弃用且将来无替代方案的功能

表 19. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.FeatureDeprecationWarning

标题

此功能已弃用,将在未来版本中移除。

描述

  • Cypher 查询选项 connectComponentsPlanner 已弃用,将在无替代方案的情况下移除。产品在组合子计划时使用基于成本的 IDP 搜索算法的默认行为将被保留。更多信息,请参阅 Cypher 手册 → Cypher 规划器。

  • 查询使用了已弃用的函数%s

  • 查询使用了已弃用的过程%s

类别

DEPRECATION

GQLSTATUS 代码

01N02

状态描述

警告:功能已弃用,无替代方案。{ $thing } 已弃用,将在无替代方案的情况下移除。

分类

DEPRECATION

严重程度级别

WARNING

示例 39. 使用 Cypher 查询选项 connectComponentsPlanner
查询
CYPHER connectComponentsPlanner=greedy MATCH (a), (b) RETURN *
返回的 GQLSTATUS 代码

01N02

返回的状态描述

警告:功能已弃用,无替代方案。connectComponentsPlanner 已弃用,将在无替代方案的情况下移除。

查询
CYPHER connectComponentsPlanner=greedy MATCH (a), (b) RETURN *
返回代码的描述

Cypher 查询选项 connectComponentsPlanner 已弃用,将在无替代方案的情况下移除。产品在组合子计划时使用基于成本的 IDP 搜索算法的默认行为将被保留。更多信息,请参阅 Cypher 手册 → Cypher 规划器

过程字段已弃用

表 20. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.FeatureDeprecationWarning

标题

此功能已弃用,将在未来版本中移除。

描述

查询使用了过程中的已弃用字段。(%s)

类别

DEPRECATION

GQLSTATUS 代码

01N03

状态描述

警告:过程字段已弃用。过程 { $proc } 的字段 { $field } 已弃用。

分类

DEPRECATION

严重程度级别

WARNING

功能已弃用,有替代方案 - DeprecatedFormat

表 21. 通知详情

Neo4j 代码

Neo.ClientNotification.Request.DeprecatedFormat

标题

客户端请求了一个已弃用的格式。

描述

请求的格式已弃用。(%s)

类别

DEPRECATION

GQLSTATUS 代码

01N01

状态描述

警告:功能已弃用,有替代方案。{ $thing1 } 已弃用。它被 { $thing2 } 替代。

分类

DEPRECATION

严重程度级别

WARNING

SECURITY 通知

安全通知指示查询或命令的结果可能存在潜在的安全问题。请验证这是否是您的查询或命令的预期行为。

角色或权限未分配

表 22. 通知详情

Neo4j 代码

Neo.ClientNotification.Security.CommandHasNoEffect

标题

<command> 无效。*

描述

  • 用户没有该角色。更多信息请参阅状态码文档。

  • 该角色没有该权限。更多信息请参阅状态码文档。

类别

SECURITY

GQLSTATUS 代码

00N71

状态描述

注意:成功完成 - 角色或权限未分配。{ $cmd } 无效。该角色或权限未分配。

分类

SECURITY

严重程度级别

INFORMATION

*<command>cmd 可以是用户给出的完整命令,也可以是给定命令的子集。

示例 40. 从没有该角色的用户撤销角色
命令
REVOKE ROLE admin, reader FROM jane
返回的 GQLSTATUS 代码

00N71

返回的状态描述

注意:成功完成 - 角色或权限未分配。REVOKE ROLE reader FROM jane 无效。该角色或权限未分配。

改进建议

验证这是预期的角色和用户。

命令
REVOKE ROLE admin, reader FROM jane
返回代码的标题

REVOKE ROLE reader FROM jane 无效。

返回代码的描述

用户没有该角色。更多信息请参阅状态码文档。

改进建议

验证这是预期的角色和用户。

示例 41. 从没有该权限的角色撤销权限
命令
REVOKE WRITE ON GRAPH * FROM reader
返回的 GQLSTATUS 代码

00N71

返回的状态描述

注意:成功完成 - 角色或权限未分配。REVOKE DENY WRITE ON GRAPH * FROM reader 无效。该角色或权限未分配。

改进建议

验证这是预期的权限和角色。

命令
REVOKE WRITE ON GRAPH * FROM reader
返回代码的标题

REVOKE DENY WRITE ON GRAPH * FROM reader 无效。

返回代码的描述

该角色没有该权限。更多信息请参阅状态码文档。

改进建议

验证这是预期的权限和角色。

角色或权限已分配

表 23. 通知详情

Neo4j 代码

Neo.ClientNotification.Security.CommandHasNoEffect

标题

<command> 无效。*

描述

  • 用户已拥有该角色。更多信息请参阅状态码文档。

  • 该角色已拥有该权限。更多信息请参阅状态码文档。

类别

SECURITY

GQLSTATUS 代码

00N70

状态描述

注意:成功完成 - 角色或权限已分配。{ $cmd } 无效。该角色或权限已分配。

分类

SECURITY

严重程度级别

INFORMATION

*<command>cmd 可以是用户给出的完整命令,也可以是给定命令的子集。

示例 42. 授予角色给已拥有该角色的用户
命令
GRANT ROLE admin TO john
返回的 GQLSTATUS 代码

00N70

返回的状态描述

注意:成功完成 - 角色或权限已分配。GRANT ROLE admin TO john 无效。该角色或权限已分配。

改进建议

验证这是预期的角色和用户。

命令
GRANT ROLE admin TO john
返回代码的标题

GRANT ROLE admin TO john 无效。

返回代码的描述

用户已拥有该角色。更多信息请参阅状态码文档。

改进建议

验证这是预期的角色和用户。

示例 43. 授予或拒绝权限给已拥有该权限的角色
命令
GRANT TRAVERSE ON GRAPH * TO reader
返回的 GQLSTATUS 代码

00N70

返回的状态描述

注意:成功完成 - 角色或权限已分配。GRANT TRAVERSE ON GRAPH * TO reader 无效。该角色或权限已分配。

改进建议

验证这是预期的权限和角色。

命令
GRANT TRAVERSE ON GRAPH * TO reader
返回代码的标题

GRANT TRAVERSE ON GRAPH * NODE * TO reader 无效。

返回代码的描述

该角色已拥有该权限。更多信息请参阅状态码文档。

改进建议

验证这是预期的权限和角色。

不可能的撤销命令

表 24. 通知详情

Neo4j 代码

Neo.ClientNotification.Security.ImpossibleRevokeCommand

标题

<command> 无效。*

描述

角色不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。

类别

SECURITY

GQLSTATUS 代码

01N70

状态描述

警告:不可能的撤销命令。cmd 无效。$msg 请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

分类

SECURITY

严重程度级别

WARNING

*<command>cmd 可以是用户给出的完整命令,也可以是给定命令的子集。

示例 44. 从用户撤销不存在的角色
命令
REVOKE ROLE manager, reader FROM jane
返回的 GQLSTATUS 代码

01N70

返回的状态描述

警告:不可能的撤销命令。REVOKE ROLE manager FROM jane 无效。角色不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

改进建议

验证这是预期的角色,并且拼写正确。

命令
REVOKE ROLE manager, reader FROM jane
返回代码的标题

REVOKE ROLE manager FROM jane 无效。

返回代码的描述

角色不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。

改进建议

验证这是预期的角色,并且拼写正确。

示例 45. 从不存在的用户撤销角色
命令
REVOKE ROLE reader FROM alice
返回的 GQLSTATUS 代码

01N70

返回的状态描述

警告:不可能的撤销命令。REVOKE ROLE reader FROM alice 无效。用户不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。o

改进建议

验证这是预期的用户,并且拼写正确。

命令
REVOKE ROLE reader FROM alice
返回代码的标题

REVOKE ROLE reader FROM alice 无效。

返回代码的描述

用户不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

改进建议

验证这是预期的用户,并且拼写正确。

示例 46. 从不存在的角色撤销权限
命令
REVOKE GRANT WRITE ON GRAPH * FROM manager
返回的 GQLSTATUS 代码

01N70

返回的状态描述

警告:不可能的撤销命令。REVOKE GRANT WRITE ON GRAPH * FROM manager 无效。角色不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

改进建议

验证这是预期的角色,并且拼写正确。

命令
REVOKE GRANT WRITE ON GRAPH * FROM manager
返回代码的标题

REVOKE GRANT WRITE ON GRAPH * FROM manager 无效。

返回代码的描述

角色不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。

改进建议

验证这是预期的角色,并且拼写正确。

示例 47. 从角色撤销对不存在图的权限
命令
REVOKE GRANT WRITE ON GRAPH neo3j FROM editor
返回的 GQLSTATUS 代码

01N70

返回的状态描述

警告:不可能的撤销命令。REVOKE GRANT WRITE ON GRAPH neo3j FROM editor 无效。数据库 neo3j 不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

改进建议

验证这是预期的图,并且拼写正确。

命令
REVOKE GRANT WRITE ON GRAPH neo3j FROM editor
返回代码的标题

REVOKE GRANT WRITE ON GRAPH neo3j FROM editor 无效。

返回代码的描述

数据库 neo3j 不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。

改进建议

验证这是预期的图,并且拼写正确。

示例 48. 从角色撤销对不存在数据库的权限
命令
REVOKE GRANT ACCESS ON DATABASE neo3j FROM editor
返回的 GQLSTATUS 代码

01N70

返回的状态描述

警告:不可能的撤销命令。REVOKE GRANT ACCESS ON DATABASE neo3j FROM editor 无效。数据库 neo3j 不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

改进建议

验证这是预期的数据库,并且拼写正确。

命令
REVOKE GRANT ACCESS ON DATABASE neo3j FROM editor
返回代码的标题

REVOKE GRANT ACCESS ON DATABASE neo3j FROM editor 无效。

返回代码的描述

数据库 neo3j 不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。

改进建议

验证这是预期的数据库,并且拼写正确。

示例 49. 从带通配符图参数的角色撤销权限
参数
{
    "graph": "*"
}
命令
REVOKE GRANT CREATE ON GRAPH $graph FROM PUBLIC
返回的 GQLSTATUS 代码

01N70

返回的状态描述

警告:不可能的撤销命令。REVOKE GRANT CREATE ON GRAPH $graph FROM PUBLIC 无效。数据库 * 不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

改进建议

使用不带参数的 GRAPH * 撤销所有图上的权限。

参数
{
    "graph": "*"
}
命令
REVOKE GRANT CREATE ON GRAPH $graph FROM PUBLIC
返回代码的标题

REVOKE GRANT CREATE ON GRAPH $graph FROM PUBLIC 无效。

返回代码的描述

参数化数据库和图名称不支持通配符。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。

改进建议

使用不带参数的 GRAPH * 撤销所有图上的权限。

示例 50. 从带通配符数据库参数的角色撤销权限
参数
{
    "database": "*"
}
命令
REVOKE GRANT ACCESS ON DATABASE $database FROM PUBLIC
返回的 GQLSTATUS 代码

01N70

返回的状态描述

警告:不可能的撤销命令。REVOKE GRANT ACCESS ON DATABASE $database FROM PUBLIC 无效。数据库 * 不存在。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。

改进建议

使用不带参数的 DATABASE * 撤销所有数据库上的权限。

参数
{
    "database": "*"
}
命令
REVOKE GRANT ACCESS ON DATABASE $database FROM PUBLIC
返回代码的标题

REVOKE GRANT ACCESS ON DATABASE $database FROM PUBLIC 无效。

返回代码的描述

参数化数据库和图名称不支持通配符。请确保没有拼写错误。此通知将在未来的主要版本中变为错误。更多信息请参阅状态码文档。

改进建议

使用不带参数的 DATABASE * 撤销所有数据库上的权限。

未定义身份验证提供者

表 25. 通知详情

Neo4j 代码

Neo.ClientNotification.Security.AuthProviderNotDefined

标题

未定义身份验证提供者。

描述

身份验证提供者 { $provider } 未在配置中定义。请验证拼写是否正确,或在配置中定义 { $provider }

类别

SECURITY

GQLSTATUS 代码

00N72

状态描述

注意:成功完成 - 未定义身份验证提供者。身份验证提供者 { $auth } 未在配置中定义。请验证拼写是否正确,或在配置中定义 { $auth }。

分类

SECURITY

严重程度级别

INFORMATION

示例 51. 创建使用配置中未定义的身份验证提供者的用户
命令
CREATE USER foo SET AUTH 'unknownProvider' { SET ID 'idString' }
返回代码的描述

身份验证提供者 unknownProvider 未在配置中定义。请验证拼写是否正确,或在配置中定义 unknownProvider

改进建议

确保给定的提供者是正确的,如果不是则替换它。如果正确,请确保将其作为已知身份验证提供者添加到 dbms.security.authentication_providers 和/或 dbms.security.authorization_providers 中。

命令
CREATE USER foo SET AUTH 'unknownProvider' { SET ID 'idString' }
返回的 GQLSTATUS 代码

00N72

返回的状态描述

注意:成功完成 - 未定义身份验证提供者。身份验证提供者 unknownProvider 未在配置中定义。请验证拼写是否正确,或在配置中定义 unknownProvider

改进建议

确保给定的提供者是正确的,如果不是则替换它。如果正确,请确保将其作为已知身份验证提供者添加到 dbms.security.authentication_providers 和/或 dbms.security.authorization_providers 中。

示例 52. 修改用户以添加配置中未定义的外部身份验证提供者
命令
ALTER USER foo SET AUTH 'unknownProvider' { SET ID 'idString' }
返回代码的描述

身份验证提供者 unknownProvider 未在配置中定义。请验证拼写是否正确,或在配置中定义 unknownProvider

改进建议

确保给定的提供者是正确的,如果不是则替换它。如果正确,请确保将其作为已知身份验证提供者添加到 dbms.security.authentication_providers 和/或 dbms.security.authorization_providers 中。

命令
ALTER USER foo SET AUTH 'unknownProvider' { SET ID 'idString' }
返回的 GQLSTATUS 代码

00N72

返回的状态描述

注意:成功完成 - 未定义身份验证提供者。身份验证提供者 unknownProvider 未在配置中定义。请验证拼写是否正确,或在配置中定义 unknownProvider

改进建议

确保给定的提供者是正确的,如果不是则替换它。如果正确,请确保将其作为已知身份验证提供者添加到 dbms.security.authentication_providers 和/或 dbms.security.authorization_providers 中。

未启用用户的外部身份验证

表 26. 通知详情

Neo4j 代码

Neo.ClientNotification.Security.ExternalAuthNotEnabled

标题

未启用用户的外部身份验证。

描述

使用设置 dbms.security.require_local_user 启用外部身份验证。

类别

SECURITY

GQLSTATUS 代码

01N71

状态描述

警告:外部身份验证已禁用。请使用设置 'dbms.security.require_local_user' 启用外部身份验证。

分类

SECURITY

严重程度级别

WARNING

示例 53. 在未启用链接用户时创建使用外部身份验证提供者的用户
命令
CREATE USER foo SET AUTH 'exampleProvider' { SET ID 'idString' }
改进建议

通过设置 dbms.security.require_local_user 启用链接用户。在启用之前,新的外部身份验证将被忽略,并且当前的外部身份验证行为将继续适用。

命令
CREATE USER foo SET AUTH 'exampleProvider' { SET ID 'idString' }
返回的 GQLSTATUS 代码

01N71

返回的状态描述

警告:外部身份验证已禁用。请使用设置 'dbms.security.require_local_user' 启用外部身份验证。

改进建议

通过设置 dbms.security.require_local_user 启用链接用户。在启用之前,新的外部身份验证将被忽略,并且当前的外部身份验证行为将继续适用。

示例 54. 在未启用链接用户时修改用户以添加外部身份验证提供者
命令
ALTER USER foo SET AUTH 'exampleProvider' { SET ID 'idString' }
改进建议

通过设置 dbms.security.require_local_user 启用链接用户。在启用之前,新的外部身份验证将被忽略,并且当前的外部身份验证行为将继续适用。

命令
ALTER USER foo SET AUTH 'exampleProvider' { SET ID 'idString' }
返回的 GQLSTATUS 代码

01N71

返回的状态描述

警告:外部身份验证已禁用。请使用设置 'dbms.security.require_local_user' 启用外部身份验证。

改进建议

通过设置 dbms.security.require_local_user 启用链接用户。在启用之前,新的外部身份验证将被忽略,并且当前的外部身份验证行为将继续适用。

查询使用不安全的协议

表 27. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.InsecureProtocol

标题

查询使用不安全的协议

描述

查询使用不安全的协议。请考虑改用 'https'。

类别

SECURITY

GQLSTATUS 代码

01N72

状态描述

警告:不安全的 URL 协议。查询使用不安全的协议。请考虑改用 'https'。

分类

SECURITY

严重程度级别

WARNING

TOPOLOGY 通知

Topology 通知提供与管理数据库和服务器相关的附加信息。

服务器已启用

表 28. 通知详情

Neo4j 代码

Neo.ClientNotification.Cluster.ServerAlreadyEnabled

标题

<command> 无效。

描述

服务器 %s 已启用。请验证这是预期的服务器。

类别

TOPOLOGY

GQLSTATUS 代码

00N80

状态描述

注意:成功完成 - 服务器已启用。ENABLE SERVER 无效。服务器 { $server } 已启用。请验证这是预期的服务器。

分类

TOPOLOGY

严重程度级别

INFORMATION

示例 55. 启用已启用的服务器
命令
ENABLE SERVER "123e4567-e89b-12d3-a456-426614174000"
返回的 GQLSTATUS 代码

00N80

返回的状态描述

注意:成功完成 - 服务器已启用。ENABLE SERVER 无效。服务器 123e4567-e89b-12d3-a456-426614174000 已启用。请验证这是预期的服务器。

命令
ENABLE SERVER "123e4567-e89b-12d3-a456-426614174000"
返回代码的描述

服务器 123e4567-e89b-12d3-a456-426614174000 已启用。请验证这是预期的服务器。

服务器已隔离

表 29. 通知详情

Neo4j 代码

Neo.ClientNotification.Cluster.ServerAlreadyCordoned

标题

<command> 无效。

描述

服务器 %s 已隔离。请验证这是预期的服务器。

类别

TOPOLOGY

GQLSTATUS 代码

00N81

状态描述

注意:成功完成 - 服务器已隔离。CORDON SERVER 无效。服务器 { $server } 已隔离。请验证这是预期的服务器。

分类

TOPOLOGY

严重程度级别

INFORMATION

示例 56. 隔离已隔离的服务器
命令
CORDON SERVER "123e4567-e89b-12d3-a456-426614174000"
返回的 GQLSTATUS 代码

00N81

返回的状态描述

注意:成功完成 - 服务器已隔离。CORDON SERVER 无效。服务器 123e4567-e89b-12d3-a456-426614174000 已隔离。请验证这是预期的服务器。

命令
CORDON SERVER "123e4567-e89b-12d3-a456-426614174000"
返回代码的描述

服务器 123e4567-e89b-12d3-a456-426614174000 已隔离。请验证这是预期的服务器。

没有数据库重新分配

表 30. 通知详情

Neo4j 代码

Neo.ClientNotification.Cluster.NoDatabasesReallocated

标题

<command> 无效。

描述

没有数据库被重新分配。目前无法实现更好的分配。

类别

TOPOLOGY

GQLSTATUS 代码

00N82

状态描述

注意:成功完成 - 没有数据库重新分配。REALLOCATE DATABASES 无效。没有数据库被重新分配。目前无法实现更好的分配。

分类

TOPOLOGY

严重程度级别

INFORMATION

示例 57. 重新分配数据库未导致任何分配更改
命令
REALLOCATE DATABASES
返回的 GQLSTATUS 代码

00N82

返回的状态描述

注意:成功完成 - 没有数据库重新分配。REALLOCATE DATABASES 无效。没有数据库被重新分配。目前无法实现更好的分配。

示例场景

场景 1:集群已平衡。例如,当有三台服务器,每台都托管数据库 foobar 时,这意味着所有数据库都已分配给所有服务器。

场景 2:集群似乎不平衡,但服务器约束阻止您迁移到更好、更平衡的分配。例如,假设服务器 1 托管数据库 foobar,服务器 2 仅托管 foo,服务器 3 不托管任何数据库。那么更好的分配会将 foo 从服务器 1 迁移到服务器 3,但如果服务器 3 有约束 deniedDatabases:['foo']},那么集群在该约束下已平衡。

命令
REALLOCATE DATABASES
返回代码的描述

没有数据库被重新分配。目前无法实现更好的分配。

示例场景

场景 1:集群已平衡。例如,当有三台服务器,每台都托管数据库 foobar 时,这意味着所有数据库都已分配给所有服务器。

场景 2:集群似乎不平衡,但服务器约束阻止您迁移到更好、更平衡的分配。例如,假设服务器 1 托管数据库 foobar,服务器 2 仅托管 foo,服务器 3 不托管任何数据库。那么更好的分配会将 foo 从服务器 1 迁移到服务器 3,但如果服务器 3 有约束 deniedDatabases:['foo']},那么集群在该约束下已平衡。

分配期间存在已隔离的服务器

当 Cypher 管理命令触发分配决策且某些服务器处于隔离状态时,会返回此通知。例如,CREATE DATABASEALTER DATABASEDEALLOCATE DATABASES FROM SERVER[S]ALTER DATABASE 会返回此通知。但是,REALLOCATE DATABASES 要求没有已隔离的服务器,因此不会返回此通知。

表 31. 通知详情

Neo4j 代码

Neo.ClientNotification.Cluster.CordonedServersExistedDuringAllocation

标题

进行分配决策时存在已隔离的服务器。

描述

服务器 %s 已隔离。这可能会影响分配决策。

类别

TOPOLOGY

GQLSTATUS 代码

00N83

状态描述

注意:成功完成 - 分配期间存在已隔离的服务器。进行分配决策时存在已隔离的服务器。服务器 { $server_list } 已隔离。这可能会影响分配决策。

分类

TOPOLOGY

严重程度级别

INFORMATION

示例 58. 分配决策期间存在已隔离的服务器

示例假设您有一个包含三台服务器的集群,其中服务器 123e4567-e89b-12d3-a456-426614174000 已使用 dbms.cluster.cordonServer 过程隔离。然后,以下命令将返回此通知。

命令
CREATE DATABASE foo TOPOLOGY 2 PRIMARIES
返回的 GQLSTATUS 代码

00N83

返回的状态描述

注意:成功完成 - 分配期间存在已隔离的服务器。进行分配决策时存在已隔离的服务器。服务器 123e4567-e89b-12d3-a456-426614174000 已隔离。这可能会影响分配决策。

示例假设您有一个包含三台服务器的集群,其中服务器 123e4567-e89b-12d3-a456-426614174000 已使用 dbms.cluster.cordonServer 过程隔离。然后,以下命令将返回此通知。

命令
CREATE DATABASE foo TOPOLOGY 2 PRIMARIES
返回代码的描述

服务器 123e4567-e89b-12d3-a456-426614174000 已隔离。这可能会影响分配决策。

请求的拓扑与当前拓扑匹配

表 32. 通知详情

Neo4j 代码

Neo.ClientNotification.Cluster.RequestedTopologyMatchedCurrentTopology

标题

<command> 无效。

描述

请求的拓扑与当前拓扑匹配。没有更改分配。

类别

TOPOLOGY

GQLSTATUS 代码

00N84

状态描述

注意:成功完成 - 请求的拓扑与当前拓扑匹配。ALTER DATABASE 无效。请求的拓扑与当前拓扑匹配。没有更改分配。

分类

TOPOLOGY

严重程度级别

INFORMATION

示例 59. 请求的拓扑与当前拓扑匹配

示例假设您有一个包含三台服务器和数据库 foo 的集群,该数据库的拓扑结构为两个主节点和一个副本。

命令
ALTER DATABASE foo SET TOPOLOGY 2 PRIMARIES 1 SECONDARY
返回的 GQLSTATUS 代码

00N84

返回的状态描述

注意:成功完成 - 请求的拓扑与当前拓扑匹配。ALTER DATABASE 无效。请求的拓扑与当前拓扑匹配。没有更改分配。

示例假设您有一个包含三台服务器和数据库 foo 的集群,该数据库的拓扑结构为两个主节点和一个副本。

命令
ALTER DATABASE foo SET TOPOLOGY 2 PRIMARIES 1 SECONDARY
返回代码的描述

请求的拓扑与当前拓扑匹配。没有更改分配。

SCHEMA 通知

Schema 通知提供与索引和约束相关的附加信息。

索引或约束已存在

表 33. 通知详情

Neo4j 代码

Neo.ClientNotification.Schema.IndexOrConstraintAlreadyExists

标题

<command> 无效。

描述

<conflicting> 已存在。

描述

%s 已存在。

类别

SCHEMA

GQLSTATUS 代码

00NA0

状态描述

注意:成功完成 - 索引或约束已存在。{ $cmd } 无效。{ $index_constr_pat } 已存在。

严重程度级别

INFORMATION

*<command>cmd 可以是用户给出的完整命令,也可以是给定命令的子集。

示例 60. 创建索引时已存在等效索引

给定名为 existingRangeIndex(:Label {property}) 上的范围索引。

命令
CREATE INDEX labelProperyRangeIndex IF NOT EXISTS FOR (n:Label) ON (n.property)
返回的 GQLSTATUS 代码

00NA0

返回的状态描述

注意:成功完成 - 索引或约束已存在。CREATE RANGE INDEX labelProperyRangeIndex IF NOT EXISTS FOR (e:Label) ON (e.property) 无效。RANGE INDEX existingRangeIndex FOR (e:Label) ON (e.property) 已存在。

给定名为 existingRangeIndex(:Label {property}) 上的范围索引。

命令
CREATE INDEX labelProperyRangeIndex IF NOT EXISTS FOR (n:Label) ON (n.property)
返回代码的标题

CREATE RANGE INDEX labelProperyRangeIndex IF NOT EXISTS FOR (e:Label) ON (e.property) 无效。

返回代码的完整描述

RANGE INDEX existingRangeIndex FOR (e:Label) ON (e.property) 已存在。

示例 61. 创建索引时已存在使用该名称的另一个不相关索引

给定名为 myIndex(:Label {property}) 上的范围索引。

命令
CREATE TEXT INDEX myIndex IF NOT EXISTS FOR ()-[r:REL_TYPE]-() ON (r.property)
返回的 GQLSTATUS 代码

00NA0

返回的状态描述

注意:成功完成 - 索引或约束已存在。CREATE TEXT INDEX myIndex IF NOT EXISTS FOR ()-[e:REL_TYPE]-() ON (e.property) 无效。RANGE INDEX myIndex FOR (e:Label) ON (e.property) 已存在。

改进建议

为新索引选择其他名称,然后重试。

CREATE TEXT INDEX myIndex2 IF NOT EXISTS FOR ()-[r:REL_TYPE]-() ON (r.property)

给定名为 myIndex(:Label {property}) 上的范围索引。

命令
CREATE TEXT INDEX myIndex IF NOT EXISTS FOR ()-[r:REL_TYPE]-() ON (r.property)
返回代码的标题

CREATE TEXT INDEX myIndex IF NOT EXISTS FOR ()-[e:REL_TYPE]-() ON (e.property) 无效。

返回代码的完整描述

RANGE INDEX myIndex FOR (e:Label) ON (e.property) 已存在。

改进建议

为新索引选择其他名称,然后重试。

CREATE TEXT INDEX myIndex2 IF NOT EXISTS FOR ()-[r:REL_TYPE]-() ON (r.property)
示例 62. 创建约束时已存在完全相同的约束

给定名为 nodeKeyLabelPropertyConstraint(:Label {property}) 上的节点键约束。

命令
CREATE CONSTRAINT nodeKeyLabelPropertyConstraint IF NOT EXISTS FOR (n:Label) REQUIRE (n.property) IS NODE KEY
返回的 GQLSTATUS 代码

00NA0

返回的状态描述

注意:成功完成 - 索引或约束已存在。CREATE CONSTRAINT nodeKeyLabelPropertyConstraint IF NOT EXISTS FOR (e:Label) REQUIRE (e.property) IS NODE KEY 无效。CONSTRAINT nodeKeyLabelPropertyConstraint FOR (e:Label) REQUIRE (e.property) IS NODE KEY 已存在。

给定名为 nodeKeyLabelPropertyConstraint(:Label {property}) 上的节点键约束。

命令
CREATE CONSTRAINT nodeKeyLabelPropertyConstraint IF NOT EXISTS FOR (n:Label) REQUIRE (n.property) IS NODE KEY
返回代码的标题

CREATE CONSTRAINT nodeKeyLabelPropertyConstraint IF NOT EXISTS FOR (e:Label) REQUIRE (e.property) IS NODE KEY 无效。

返回代码的完整描述

CONSTRAINT nodeKeyLabelPropertyConstraint FOR (e:Label) REQUIRE (e.property) IS NODE KEY 已存在。

示例 63. 创建约束时已存在使用该名称的另一个不相关约束

给定名为 myConstraint(:Label {property}) 上的节点键约束。

命令
CREATE CONSTRAINT myConstraint IF NOT EXISTS FOR (n:Label2) REQUIRE (n.property2) IS NOT NULL
返回的 GQLSTATUS 代码

00NA0

返回的状态描述

注意:成功完成 - 索引或约束已存在。CREATE CONSTRAINT myConstraint IF NOT EXISTS FOR (e:Label2) REQUIRE (e.property2) IS NOT NULL 无效。CONSTRAINT myConstraint FOR (e:Label) REQUIRE (e.property) IS NODE KEY 已存在。

改进建议

为新约束选择其他名称,然后重试。

CREATE CONSTRAINT myConstraint2 IF NOT EXISTS FOR (n:Label2) REQUIRE (n.property2) IS NOT NULL

给定名为 myConstraint(:Label {property}) 上的节点键约束。

命令
CREATE CONSTRAINT myConstraint IF NOT EXISTS FOR (n:Label2) REQUIRE (n.property2) IS NOT NULL
返回代码的标题

CREATE CONSTRAINT myConstraint IF NOT EXISTS FOR (e:Label2) REQUIRE (e.property2) IS NOT NULL 无效。

返回代码的完整描述

CONSTRAINT myConstraint FOR (e:Label) REQUIRE (e.property) IS NODE KEY 已存在。

改进建议

为新约束选择其他名称,然后重试。

CREATE CONSTRAINT myConstraint2 IF NOT EXISTS FOR (n:Label2) REQUIRE (n.property2) IS NOT NULL

索引或约束不存在

表 34. 通知详情

Neo4j 代码

Neo.ClientNotification.Schema.IndexOrConstraintDoesNotExist

标题

<command> 无效。

描述

%s 不存在。

类别

SCHEMA

GQLSTATUS 代码

00NA1

状态描述

注意:成功完成 - 索引或约束不存在。{ $cmd } 无效。{ $index_constr_name } 不存在。

严重程度级别

INFORMATION

示例 64. 尝试删除不存在的索引
命令
DROP INDEX nonExistingIndex IF EXISTS
返回的 GQLSTATUS 代码

00NA1

返回的状态描述

注意:成功完成 - 索引或约束不存在。DROP INDEX nonExistingIndex IF EXISTS 无效。nonExistingIndex 不存在。

改进建议

验证这是预期的索引,并且拼写正确。

命令
DROP INDEX nonExistingIndex IF EXISTS
返回代码的标题

DROP INDEX nonExistingIndex IF EXISTS 无效。

返回代码的完整描述

nonExistingIndex 不存在。

改进建议

验证这是预期的索引,并且拼写正确。

示例 65. 尝试删除不存在的约束
命令
DROP CONSTRAINT nonExistingConstraint IF EXISTS
返回的 GQLSTATUS 代码

00NA1

返回的状态描述

注意:成功完成 - 索引或约束不存在。DROP CONSTRAINT nonExistingConstraint IF EXISTS 无效。nonExistingConstraint 不存在。

改进建议

验证这是预期的约束,并且拼写正确。

命令
DROP CONSTRAINT nonExistingConstraint IF EXISTS
返回代码的标题

DROP CONSTRAINT nonExistingConstraint IF EXISTS 无效。

返回代码的完整描述

nonExistingConstraint 不存在。

改进建议

验证这是预期的约束,并且拼写正确。

GENERIC 通知

GENERIC 通知代码不属于任何更广泛的类别,彼此之间没有联系。

子查询变量隐藏

表 35. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.SubqueryVariableShadowing

标题

子查询中的变量正在隐藏外层范围中同名的变量。

描述

子查询中的变量正在隐藏外层范围中同名的变量。如果您想改用该变量,必须使用导入的 WITH 子句将其导入子查询。(%s)

类别

通用

GQLSTATUS 代码

03N60

状态描述

信息:子查询变量遮蔽。子查询中的变量 { $var } 使用了与外部查询中的变量相同的名称。除非您希望它成为一个新变量,否则请在子查询中使用 WITH $var 导入外部范围的变量。

分类

通用

严重程度级别

INFORMATION

示例 66. 外部范围变量的遮蔽
查询
MATCH (n)
CALL {
  MATCH (n)--(m)
  RETURN m
}
RETURN *
返回的 GQLSTATUS 代码

03N60

返回的状态描述

信息:子查询变量遮蔽。子查询中的变量 n 使用了与外部查询中的变量相同的名称。除非您希望它成为一个新变量,否则请在子查询中使用 WITH n 导入外部范围的变量。

改进建议

如果查询的预期行为是使子查询中的变量成为一个新变量,则无需执行任何操作。如果预期行为是使用外部查询中的变量,则需要使用 WITH 子句将其导入子查询。

MATCH (n)
CALL {
  WITH n
  MATCH (n)--(m)
  RETURN m
}
RETURN *
查询
MATCH (n)
CALL {
  MATCH (n)--(m)
  RETURN m
}
RETURN *
返回代码的描述

子查询中的变量正在遮蔽外部范围中同名的变量。如果您想使用该变量,则必须使用 WITH 子句将其导入子查询。(被遮蔽的变量是:n

改进建议

如果查询的预期行为是使子查询中的变量成为一个新变量,则无需执行任何操作。如果预期行为是使用外部查询中的变量,则需要使用 WITH 子句将其导入子查询。

MATCH (n)
CALL {
  WITH n
  MATCH (n)--(m)
  RETURN m
}
RETURN *

冗余的可选过程

表 36. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.RedundantOptionalProcedure

标题

当过程调用空过程时,使用 OPTIONAL 是冗余的。

描述

由于 CALL %s 是一个空过程,使用 OPTIONAL 是冗余的。

类别

通用

GQLSTATUS 代码

03N61

状态描述

信息:冗余的可选过程。由于 CALL %s 是一个空过程,使用 OPTIONAL 是冗余的。

分类

通用

严重程度级别

INFORMATION

示例 67. 在过程调用中冗余使用 OPTIONAL
查询
OPTIONAL CALL db.createLabel("A")
返回的 GQLSTATUS 代码

03N61

返回的状态描述

信息:冗余的可选过程。由于 CALL db.createLabel 是一个空过程,使用 OPTIONAL 是冗余的。

改进建议

如果查询的预期行为是使用空过程,则可以删除 OPTIONAL 关键字,而不会影响查询。

CALL db.createLabel("A")
查询
OPTIONAL CALL db.createLabel("A")
返回代码的描述

由于 CALL db.createLabel 是一个空过程,使用 OPTIONAL 是冗余的。

改进建议

如果查询的预期行为是使用空过程,则可以删除 OPTIONAL 关键字,而不会影响查询。

CALL db.createLabel("A")

冗余的可选子查询

表 37. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.RedundantOptionalSubquery

标题

CALL 是一个单元子查询时,使用 OPTIONAL 是冗余的。

描述

由于 CALL 是一个单元子查询,使用 OPTIONAL 是冗余的。

类别

通用

GQLSTATUS 代码

03N62

状态描述

信息:冗余的可选子查询。由于 CALL 是一个单元子查询,使用 OPTIONAL 是冗余的。

分类

通用

严重程度级别

INFORMATION

示例 68. 在 CALL 子查询中冗余使用 OPTIONAL
查询
UNWIND [1, 2, 3] AS x
OPTIONAL CALL (x) {
   CREATE({i:x})
}
返回的 GQLSTATUS 代码

03N62

返回代码的描述

信息:冗余的可选子查询。由于 CALL 是一个单元子查询,使用 OPTIONAL 是冗余的。

改进建议

如果查询的预期行为是子查询不返回任何值,则可以删除 OPTIONAL 关键字,而不会影响查询。

UNWIND [1, 2, 3] AS x
CALL (x) {
   CREATE({i:x})
}
查询
UNWIND [1, 2, 3] AS x
OPTIONAL CALL (x) {
   CREATE({i:x})
}
返回代码的描述

对于单元子查询,Optional 是冗余的。在单元子查询上使用 OPTIONAL 没有效果,可以将其删除。

改进建议

如果查询的预期行为是子查询不返回任何值,则可以删除 OPTIONAL 关键字,而不会影响查询。

UNWIND [1, 2, 3] AS x
CALL (x) {
   CREATE({i:x})
}

缺少参数

表 38. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.ParameterNotProvided

标题

语句引用了请求中未提供的参数。

描述

未为查询提供足够的参数。生成的查询计划将不会被缓存,并且没有 EXPLAIN 无法执行。(%s

类别

通用

GQLSTATUS 代码

01N60

状态描述

警告:缺少参数。由于未定义的参数 { $param_list },查询计划无法被缓存,并且没有 EXPLAIN 无法执行。请提供参数。

分类

通用

严重程度级别

WARNING

示例 69. 在未提供参数的情况下使用带参数的 EXPLAIN 查询
查询
EXPLAIN WITH $param as param
RETURN param
返回的 GQLSTATUS 代码

01N60

返回的状态描述

警告:缺少参数。由于未定义的参数 { $param },查询计划无法被缓存,并且没有 EXPLAIN 无法执行。请提供参数。

改进建议

请提供参数以便缓存计划。

查询
EXPLAIN WITH $param as param
RETURN param
返回代码的描述

未为查询提供足够的参数。生成的查询计划将不会被缓存,并且没有 EXPLAIN 无法执行。(缺失参数:param

改进建议

请提供参数以便缓存计划。

过程或函数执行警告

表 39. 通知详情

Neo4j 代码

Neo.ClientNotification.Procedure.ProcedureWarning

标题

查询使用了生成警告的过程。

描述

查询使用了生成警告的过程。(%s

类别

通用

GQLSTATUS 代码

01N62

状态描述

警告:过程执行警告。过程 { $proc } 生成了警告 { $msg }

分类

通用

严重程度级别

WARNING

无法满足的关系类型表达式

当匹配一个永远无法满足的关系类型表达式时,例如要求零个、多个或矛盾的类型。

表 40. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.UnsatisfiableRelationshipTypeExpression

标题

查询包含一个无法满足的关系类型表达式。

描述

关系类型表达式无法满足。(%s

类别

通用

GQLSTATUS 代码

01N61

状态描述

警告:无法满足的关系类型表达式。表达式 { $label_expr } 无法满足,因为关系必须只有一个类型。

分类

通用

严重程度级别

WARNING

示例 70. 匹配一个永远无法满足的关系类型表达式
查询
MATCH ()-[r:R1&R2]->() RETURN r
返回的 GQLSTATUS 代码

01N61

返回的状态描述

警告:无法满足的关系类型表达式。表达式 R1&R2 无法满足,因为关系必须只有一个类型。

查询
MATCH ()-[r:R1&R2]->() RETURN r
返回代码的描述

关系类型表达式无法满足。(R1&R2 无法被任何关系满足。关系必须只有一个类型。)

重复的关系引用

表 41. 通知详情

Neo4j 代码

Neo.ClientNotification.Statement.RepeatedRelationshipReference

标题

查询不返回任何结果,因为一个关系变量被绑定多次。

描述

  • 查询中一个关系被引用多次,这导致没有结果,因为每个结果中关系不能出现多次。(%s

  • 可变长度关系变量被绑定多次,这导致没有结果,因为每个结果中关系不能出现多次。(%s

类别

通用

GQLSTATUS 代码

01N63

状态描述

警告:重复的关系引用。{ $var }{ $pat } 中重复出现,这导致没有结果。

分类

通用

严重程度级别

WARNING

示例 71. 多次绑定一个关系变量
查询
MATCH (:A)-[r]->(), ()-[r]->(:B) RETURN r
返回的 GQLSTATUS 代码

01N63

返回的状态描述

警告:重复的关系引用。r(:A)-[r]→(), ()-[r]→(:B) 中重复出现,这导致没有结果。

改进建议

使用一个模式来匹配所有以标签为 A 的节点开始并以标签为 B 的节点结束的关系。

MATCH (:A)-[r]->(:B) RETURN r
查询
MATCH (:A)-[r]->(), ()-[r]->(:B) RETURN r
返回代码的描述

查询中一个关系被引用多次,这导致没有结果,因为每个结果中关系不能出现多次。(关系 r 被重复引用)

改进建议

使用一个模式来匹配所有以标签为 A 的节点开始并以标签为 B 的节点结束的关系。

MATCH (:A)-[r]->(:B) RETURN r
示例 72. 多次绑定可变长度关系变量(在版本 5.6 或更高版本上运行时)
查询
MATCH ()-[r*]->()<-[r*]-() RETURN count(*) AS count
返回的 GQLSTATUS 代码

01N63

返回的状态描述

警告:重复的关系引用。r()-[r*]→()←[r*]-() 中重复出现,这导致没有结果。

查询
MATCH ()-[r*]->()<-[r*]-() RETURN count(*) AS count
返回代码的描述

可变长度关系变量被绑定多次,这导致没有结果,因为每个结果中关系不能出现多次。(关系 r 被重复引用)

© . All rights reserved.