存储格式

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

aligned 是社区版推荐的格式。

standardhigh_limit 格式在 Neo4j 5.23 中已弃用。不建议将这些格式用于新数据库。有关这些格式弃用和最终移除时间线的更多信息,请参阅格式弃用

有关 Neo4j 4.4 中存储格式的信息,请参阅Neo4j Admin 和 Neo4j CLI → Neo4j Admin → 显示存储信息

可用存储格式

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

Block

企业版+

  • 除非指定了db.format,否则为默认格式。

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

  • 内存效率:优化数据并置,允许通过更少的读操作获取更多相关数据;提高资源利用率。块格式意味着只需加载少量页面即可满足查询需求,即更少的页面错误和更少的 IO。

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

  • 实体限制:能够运行大规模图。支持截至本文撰写时的最高限制。详情请参阅Block 格式实体限制
    支持任意长度的令牌名称(包括标签、属性键和关系类型名称),最长可达 GQL 标识符的最大长度 16,383 个字符。

  • 面向未来:设计为可扩展和改进,无需存储迁移。无需重写存储即可获得新功能(如数据类型)或性能增强。

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

  • 性能:性能优于 standard,但需要稍多一些磁盘空间。

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

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

  • 实体限制:支持在某些限制范围内的图。详情请参阅Aligned 格式实体限制

Standard

在 5.23 中弃用

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

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

  • 实体限制:支持在某些限制范围内的图。详情请参阅Standard 格式实体限制

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

High_limit

企业版 在 5.23 中弃用

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

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

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

  • 实体限制:在记录格式中,支持截至本文撰写时的最高限制。更多信息请参阅High_limit 格式实体限制

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

格式弃用

standardhigh_limit 格式从 Neo4j 5.23 开始弃用。

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

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

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

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

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

如何设置数据库存储格式

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

创建新数据库

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

以下示例展示了如何创建 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'}

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

block 格式是企业版的默认格式,因为它具有卓越的性能和可扩展性。因此,建议将所有数据库迁移到 block 格式,以确保最佳性能。
block 格式支持任意长度的令牌名称(包括节点标签、属性键和关系类型名称),最长可达 GQL 标识符的最大长度 16,383 个字符。因此,从 aligned 迁移到 block 格式时,令牌名称必须遵守此长度限制。

standardhigh_limit 格式在 5.23 中已弃用,并将在未来版本中移除。更多信息请参阅格式弃用

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

更改存储格式是一项 IO 密集型离线操作,它会以新格式重写所有数据。因此,它要求:

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

  • 图符合新格式的实体限制

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

在独立服务器中

更改独立服务器中现有数据库的存储格式需要数据库处于离线状态。以下步骤假设您想将名为 mydb 的数据库迁移到 block 格式,但这些步骤也适用于其他格式。

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

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

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

      在运行 neo4j-admin database migrate 之前,无需使用 --compact-node-store 选项运行 neo4j-admin database copy。在迁移过程中,数据库会进行固有的压缩。

      例如

      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 之前,无需使用 --compact-node-store 选项运行 neo4j-admin database copy。在迁移过程中,数据库会进行固有的压缩。

    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 版本兼容性以及限制

Block 格式

表 1. Block 格式与 Neo4j 版本兼容性
名称 存储格式版本 引入于 GA 版本始于 默认于

BLOCK_V1

block-block-1.1

5.14.0

5.16.0

5.22.0

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

节点

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)

Aligned 格式

表 3. Aligned 格式与 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. Aligned 格式实体限制
名称 限制

属性键

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)

Standard 格式

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

表 5. Standard 格式与 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. Standard 格式实体限制
名称 限制

属性键

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)

High_limit 格式

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

表 7. High_limit 格式与 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. High_limit 格式实体限制
名称 限制

属性键

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 千万亿)

© . All rights reserved.