在 3.5 上重新创建索引和约束
本文档描述了在 3.5.x 版本上删除并重新创建所有索引和约束的过程。升级自 3.5 之前的版本后,建议执行此步骤,以便使用最新的索引提供程序重新构建所有索引和约束,并利用本机索引的优势。
有关索引提供程序的更多细节,请参阅文档: /docs/operations-manual/current/performance/index-configuration/schema-indexes/#index-configuration-index-providers
从 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。
步骤 7 - 确认所有索引和约束已完成填充、处于 ONLINE 状态且使用了正确的索引提供程序
在 Neo4j Browser 或 cypher-shell 中运行
call db.indexes();
验证所有索引/约束的状态均为 ONLINE,且提供程序为
{
"version": "1.0",
"key": "native-btree"
}
此页面有帮助吗?