存储格式

Neo4j 的存储引擎支持多种存储格式,这些格式描述了数据如何写入磁盘。从 5.23 开始,block 格式是企业版推荐的格式,因为它具有卓越的性能和可扩展性。block 格式使用高级数据结构和内联技术来增强数据局部性,从而导致更好的资源利用率。

aligned 是社区版推荐的格式。

从 Neo4j 5.23 开始,standardhigh_limit 格式已弃用。不建议将这些格式用于新数据库。有关这些格式的弃用和最终删除时间表的信息,请参阅 格式弃用

可用存储格式

以下是可用格式及其功能的概述

企业版 Neo4j 5.16 中的 GA

  • 从 Neo4j 5.22 开始,对于新数据库,默认格式为 (除非指定 db.format)。

  • 性能:快速查询;使用高级数据结构和内联技术以获得更好的数据局部性。

  • 内存效率:数据优化共置,允许通过更少的读取操作获取更多相关数据;提高资源利用率。块格式意味着需要加载几个页面来服务查询,即更少的页面错误和更少的 IO。

  • 属性访问:属性与其节点和关系一起存储在块中,从而大大减少了访问属性所需的指针追逐量。

  • 实体限制:能够在大型规模上运行图。在撰写本文时,支持最高限制。有关详细信息,请参阅 块格式实体限制
    在 5.25 中引入 支持任何长度的令牌名称(包括标签、属性键和关系类型名称),最高可达 GQL 标识符最大长度 16,383 个字符。

  • 未来证明: 设计为可扩展和改进,无需商店迁移。 新特性(如数据类型)或性能增强无需重写商店即可使用。

对齐
  • 社区版中的默认格式,以及 Neo4j 5.22 之前企业版中的所有新数据库。

  • 性能: 性能优于 standard,但需要稍微更多的磁盘空间。

  • 内存效率: 基于 standard,但内存效率更高。

  • 属性访问: 在磁盘上将图数据存储在类似链表的结构中。

  • 实体限制: 支持在某些限制内的图。 有关详细信息,请参阅 对齐格式实体限制

标准

在 5.23 中已弃用

  • 性能: 基本的基础格式。

  • 属性访问: 在磁盘上将图数据存储在类似链表的结构中。

  • 实体限制: 支持在某些限制内的图。 有关详细信息,请参阅 标准格式实体限制

  • 有关弃用和最终删除的信息,请参阅 格式弃用

High_limit

企业版 在 5.23 中已弃用

  • 性能: 性能略逊于 standard,需要更多磁盘空间,但允许更多节点和关系。

  • 内存效率: 基于 standard,但内存效率更高。

  • 属性访问: 在磁盘上将图数据存储在类似链表的结构中。

  • 实体限制: 从记录格式来看,在编写时支持最高的限制。 有关详细信息,请参阅 High_limit 格式实体限制

  • 有关弃用和最终删除的信息,请参阅 格式弃用

格式弃用

从 Neo4j 5.23 开始,standardhigh_limit 格式已弃用。

block 格式比已弃用的格式提供更好的性能和可扩展性。 它们将在整个 v5 和 vNext 服务器生命周期内一直是产品的一部分。 包括这些格式的最后一个 Neo4j 版本将是计划于 2026 年 11 月发布的 vNext.LTS。 Neo4j 的 LTS 版本在发布后的 3 年内得到支持。 这意味着对 standardhigh_limit 格式的支持计划于 2029 年 11 月结束。

建议企业版用户尽快将所有数据库迁移到 block 格式,以确保最佳性能。 有关详细信息,请参阅 更改现有数据库的存储格式

常见问题解答
  1. 如何查找数据库的格式?
    您可以使用 SHOW DATABASES YIELD name, store Cypher 命令获取有关数据库存储格式的信息。 有关详细示例,请参阅 显示特定数据库的详细信息

  2. standardhigh_limit 格式的支持何时结束?
    包括这些格式的最后一个 Neo4j 版本将是计划于 2026 年 11 月发布的 LTS 版本,该版本将支持三年,直至 2029 年 11 月。

  3. 如何更改数据库的存储格式?
    有关更改现有数据库存储格式的信息,请参阅 更改现有数据库的存储格式

如何设置数据库存储格式

您可以在创建新数据库时设置存储格式,也可以更改现有数据库的存储格式。

创建新数据库

在 Neo4j 5.22 之前的版本中,所有新数据库的默认存储格式为 aligned。 从 Neo4j 5.22 开始,block 是所有新创建数据库的默认格式,只要它们没有指定 db.format 设置。
如果要更改它,可以在 neo4j.conf 文件中为 db.format 配置设置新值。
您还可以通过将新格式作为参数传递给创建数据库的命令,例如 neo4j-admin database import fullneo4j-admin database copy 命令,或者通过使用 storeFormat: 选项在 Cypher 命令 CREATE DATABASE 中使用特定存储格式创建新数据库。

以下示例显示了如何在 block 存储格式上创建新数据库。 但是,相同的方法也适用于其他格式。

使用 neo4j-admin database import full 命令导入数据库时指定存储格式
bin/neo4j-admin database import full ... --format=block blockdb
使用 neo4j-admin database copy 命令复制数据库时指定存储格式
bin/neo4j-admin database copy --to-format="block" mydb blockdb
使用 CREATE DATABASE Cypher 语句创建新数据库时指定存储格式
CREATE DATABASE blockdb OPTIONS {storeFormat: 'block'}

更改现有数据库的存储格式

从 5.23 开始,block 格式是企业版的首选格式,因为它具有卓越的性能和可扩展性。 因此,建议将所有数据库迁移到 block 格式,以确保最佳性能。

请注意,更改存储格式会更改分配给节点和关系的内部 ID。 这是因为 ID 代表元素在存储文件中的物理位置。

更改存储格式是一个 I/O 密集型离线操作,它会以新格式重新写入所有数据。 因此,它需要

  • 有足够的磁盘空间来容纳数据库的旧版本和新版本。 在迁移到 block 格式期间,数据库会自动进行压缩。 因此,迁移所需的磁盘空间约等于数据库的大小。 您可以使用 数据库存储大小指标 来确定您的可用磁盘空间和潜在的可重用空间。

  • 该图适合新的 格式的实体限制

对于大型数据库,更改存储格式可能是一个耗时的操作,并且还需要重新填充任何索引。 所需时间取决于数据库的大小、索引数量、存储设备的速度以及可用内存量。 例如,一个 100GB 的数据库在最佳条件下可能需要 10 分钟,在最坏情况下可能需要一个多小时。 因此,建议对备份进行干运行,以估计迁移所需的时间。

在独立服务器中

在独立服务器中更改现有数据库的存储格式需要将数据库脱机。 以下步骤假设您要将名为 mydb 的数据库迁移到 block 格式,但相同步骤也适用于其他格式。

  1. 使用 Cypher 命令 STOP DATABASE mydb 停止数据库。

  2. 使用以下选项中的一个更改已停止数据库的存储格式

    • 使用 neo4j-admin database migrate 命令迁移现有数据库。

      在运行 neo4j-admin database migrate 之前,您无需运行 neo4j-admin database copy 以及 --compact-node-store 选项。 在迁移过程中,数据库会自动进行压缩。

      例如

      bin/neo4j-admin database migrate --to-format="block" mydb
    • 使用 neo4j-admin database copy 命令创建现有数据库的副本时,将新存储格式作为参数传递。 您还可以设置 --copy-schema 选项以自动复制模式定义。 例如

      bin/neo4j-admin database copy --to-format="block" mydb blockdb --copy-schema
  3. 成功完成后,使用 Cypher 命令 START DATABASE mydb 启动数据库。 索引在数据库首次启动时进行填充,如果存在属性唯一性约束,这可能需要一些时间。

在集群中

在集群中更改现有数据库的存储格式需要您将要迁移的数据库的备份恢复到其中一台服务器上,然后,使用该服务器作为 指定的播种器,让其他集群成员从该服务器复制数据库。

以下步骤假设您要将名为 mydb 的数据库迁移到 block 格式,但相同步骤也适用于其他格式。 该数据库在三台服务器上以主模式托管。

在一台服务器上,server01

  1. 在 Cypher Shell 中,使用 Cypher 命令 ALTER DATABASE databasename​ SET ACCESS READ ONLY 将要迁移的数据库置于只读模式。 例如

    @system> ALTER DATABASE mydb SET ACCESS READ ONLY;
  2. 在您的命令行工具中,使用 neo4j-admin database backup 命令备份该数据库。 例如

    bin/neo4j-admin database backup mydb --to-path=/path/to/your-backup-folder --include-metadata=all
  3. 回到 Cypher Shell 中,删除数据库以删除它以及与它相关联的所有用户和角色

    @system> DROP DATABASE mydb;
  4. 在命令行工具中,使用 neo4j-admin database restore 命令恢复您创建的备份

    bin/neo4j-admin database restore --from-path=/path/to/your-backup-folder/mydb-2024-03-05T11-26-38.backup mydb
  5. 将恢复的数据库迁移到 block 格式

    在运行 neo4j-admin database migrate 之前,您无需运行 neo4j-admin database copy 以及 --compact-node-store 选项。 在迁移过程中,数据库会自动进行压缩。

    bin/neo4j-admin database migrate --to-format="block" mydb
  6. 在 Cypher Shell 中,运行 SHOW SERVERS 以查找 server01 的服务器 ID。 将地址交叉引用以找到服务器 ID。 使用任何数据库进行连接。

    SHOW SERVERS YIELD serverId, name, address, state, health, hosting

在一台服务器上

  1. 使用 system 数据库并使用 server01 的服务器 ID 创建迁移后的数据库 mydbmydb 的拓扑结构存储在 system 数据库中,当您创建它时,它会根据默认拓扑结构(可以使用 CALL dbms.showTopologyGraphConfig 显示)进行分配。 有关详细信息,请参阅 指定的播种器

    CREATE DATABASE mydb OPTIONS {existingData: 'use', existingDataSeedInstance: '<server01 id>'}
  2. 使用 Cypher 命令 SHOW DATABASE mydb 验证数据库是否已创建并可用。

  3. 成功完成后,恢复角色和权限。 有关详细信息,请参阅 恢复用户和角色元数据

验证存储格式

您可以使用以下 Cypher 验证数据库的存储格式

SHOW DATABASES YIELD name, store
结果
+----------------------------------+
| name      | store                |
+----------------------------------+
| "blockdb" | "block-block-1.1"    |
| "neo4j"   | "record-aligned-1.1" |
| "system"  | "record-aligned-1.1" |
+----------------------------------+

此外,您可以使用 neo4j-admin database info 命令获取有关数据库存储格式的详细信息。 有关详细信息,请参阅 显示存储信息

存储格式和实体限制

以下表格显示了格式和 Neo4j 版本兼容性以及不同存储格式的限制

块格式

表 1. 块格式和 Neo4j 版本兼容性
名称 存储格式版本 引入于 GA 自 默认在

BLOCK_V1

block-block-1.1

5.14.0

5.16.0

5.22.0

表 2. 块格式实体限制
名称 限制

节点

2^48 (281 474 976 710 656)

关系

(无定义上限)

属性

(无定义上限)

标签

2^31 (2 147 483 648)

关系类型

2^30 (1 073 741 824)

属性键

2^31 (2 147 483 648)

对齐格式

表 3. 对齐格式和 Neo4j 版本兼容性
名称 存储格式版本 引入于 默认在 从以下版本开始不支持

ALIGNED_V5_0

record-aligned-1.1

5.0.0

CE、EE < Neo4j 5.22

ALIGNED_V4_3

AF4.3.0

4.3.0

5.0.0

ALIGNED_V4_1

AF4.1.a

4.1.0

5.0.0

表 4. 对齐格式实体限制
名称 限制

属性键

2^24 (16 777 216)

节点

2^35 (34 359 738 368)

关系

2^35 (34 359 738 368)

属性

2^36 (68 719 476 736)

标签

2^31 (2 147 483 648)

关系类型

2^16 (65 536)

关系组

2^35 (34 359 738 368)

标准格式

有关弃用和最终删除的信息,请参阅 格式弃用

表 5. 标准格式和 Neo4j 版本兼容性
名称 存储格式版本 引入于 从以下版本开始不支持

STANDARD_V5_0

record-standard-1.1

5.0.0

STANDARD_V4_3

SF4.3.0

4.3.0

5.0.0

STANDARD_V4_0

SF4.0.0

4.0.0

5.0.0

STANDARD_V3_4

v0.A.9

3.4.0

5.0.0

表 6. 标准格式实体限制
名称 限制

属性键

2^24 (16 777 216)

节点

2^35 (34 359 738 368)

关系

2^35 (34 359 738 368)

属性

2^36 (68 719 476 736)

标签

2^31 (2 147 483 648)

关系类型

2^16 (65 536)

关系组

2^35 (34 359 738 368)

高限制格式

有关弃用和最终删除的信息,请参阅 格式弃用

表 7. 高限制格式和 Neo4j 版本兼容性
名称 存储格式版本 引入于 从以下版本开始不支持

HIGH_LIMIT_V5_0

record-high_limit-1.1

5.0.0

HIGH_LIMIT_V4_3_0

HL4.3.0

4.3.0

5.0.0

HIGH_LIMIT_V4_0_0

HL4.0.0

4.0.0

5.0.0

HIGH_LIMIT_V3_4_0

vE.H.4

3.4.0

5.0.0

HIGH_LIMIT_V3_2_0

vE.H.3

3.2.0

5.0.0

HIGH_LIMIT_V3_1_0

vE.H.2

3.1.0

5.0.0

HIGH_LIMIT_V3_0_6

vE.H.0b

3.0.6

5.0.0

HIGH_LIMIT_V3_0_0

vE.H.0

3.0.0

5.0.0

表 8. 高限制格式实体限制
名称 限制

属性键

2^24 (16 777 216)

节点

2^50 (1 万亿)

关系

2^50 (1 万亿)

属性

2^50 (1 万亿)

标签

2^31 (2 147 483 648)

关系类型

2^24 (16 777 216)

关系组

2^50 (1 万亿)