知识库

在 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 Browser 或 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 文件中删除该索引/约束的 drop/create 语句。

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

检查你的配置文件(neo4j.conf),确认 dbms.index.default_schema_provider 要么被注释掉,要么设置为 native-btree-1.0

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

在 Neo4j Browser 或通过 cypher-shell,粘贴并执行 recreate-indexes.cypher 脚本。监控是否有错误产生。

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

在 Neo4j Browser 或通过 cypher-shell,粘贴并执行 recreate-constraints.cypher 脚本。监控是否有错误产生。

步骤 7 - 确认所有索引和约束已完成填充、处于 ONLINE 状态且使用了正确的索引提供程序

在 Neo4j Browser 或 cypher-shell 中运行

call db.indexes();

验证所有索引/约束的状态均为 ONLINE,且提供程序为

{
  "version": "1.0",
  "key": "native-btree"
}
© . This site is unofficial and not affiliated with Neo4j, Inc.