知识库

在 3.5 版本上重新创建索引和约束

本文档介绍了在 3.5.x 版本上删除并重新创建所有索引和约束的过程。建议在从 3.5 之前的版本升级后执行此步骤,以便所有索引和约束都可以在最新的索引提供程序下重建,并利用原生索引。

从 3.5.8 之前的 3.5 版本升级的客户也可能希望执行此过程,如本支持通知所述:https://support.neo4j.com/hc/en-us/articles/360027344873-Neo4j-3-5-x-Index-Inconsistency-Vulnerability-Fixed-in-Release-3-5-8

步骤 1 - 生成用于重新创建约束的 Cypher 脚本

执行以下 Cypher 语句以生成将用于删除和创建约束的 Cypher 脚本输出

CALL db.constraints() YIELD description
RETURN 'DROP ' + description + '; CREATE ' + description + ';'

这可以在 Neo4j 浏览器或 cypher-shell 中完成。根据您的版本,您可能需要从导出中剥离双引号。

保存此文件,例如:recreate-constraints.cypher

步骤 2 - 生成用于重新创建索引的 Cypher 脚本

执行以下 Cypher 语句以生成将用于删除和创建约束的 Cypher 脚本输出

CALL db.indexes() YIELD description,type
WHERE type='node_label_property'
RETURN 'DROP ' + description + '; CREATE ' + description + ';'

与重新创建约束脚本类似,剥离所有双引号并保存文件:recreate-indexes.cypher

步骤 3 (可选) - 确认属性键大小

如果您从 3.3 或更早版本更新,则索引创建可能会在字符串属性上失败,如果任何属性的大小超过 4036 字节。如果您想在删除和重新创建之前检查这一点,可以使用以下 Cypher 来查看是否存在会导致失败的任何值

match (n:<LABEL>)
with n, size(n.<property>) as prop_length
where prop_length >= 4036
return n.<property>, prop_length, id(n)
order by n.id desc

这需要针对步骤 1 和 2 中提到的每个标签/属性组合完成。如果任何查询返回任何行,您将需要清理/删除节点,或者从为该索引/约束生成的 Cypher 文件中删除删除/创建。

步骤 4 - 确认索引提供程序

检查您的配置 (neo4j.conf) 并确认 dbms.index.default_schema_provider 处于注释状态,或设置为 native-btree-1.0

步骤 5 - 运行脚本以重新创建索引

在 Neo4j 浏览器或通过 cypher-shell 中,粘贴 recreate-indexes.cypher 脚本并执行。监控是否有任何错误。

步骤 6 - 运行脚本以重新创建约束

在 Neo4j 浏览器或通过 cypher-shell 中,粘贴 recreate-constraints.cypher 脚本并执行。监控是否有任何错误。

步骤 7 - 确认所有索引和约束已填充,处于联机状态,并且是正确的索引提供程序

在 Neo4j 浏览器或通过 cypher-shell 中,运行

call db.indexes();

验证所有索引/约束的状态是否为联机,以及提供程序是否为

{
  "version": "1.0",
  "key": "native-btree"
}