创建数据库

Neo4j 支持在同一个 DBMS 中管理多个数据库。这些数据库的元数据(包括关联的安全模型)保存在一个名为 system 的特殊数据库中。所有多数据库管理命令都必须针对 system 数据库运行。当通过 Bolt 连接到 DBMS 时,这些管理命令会自动路由到 system 数据库。

您可以使用 Cypher 命令 CREATE DATABASE 创建数据库。数据库的初始内容取决于服务器的状态以及提供给命令的选项。如果未提供额外选项,CREATE DATABASE 将尝试原地挂载任何预先存在的存储文件(例如,还原备份的结果)。如果没有可用的预先存在的存储文件,它将创建一个空数据库。

数据库名称需遵守 数据库命名 部分中指定的规则。不建议在数据库名称中使用点(.)。这是因为难以确定点是数据库名称的一部分,还是复合数据库中数据库别名的分隔符。

如果未指定 db.format 设置,则 block 是所有新创建数据库的默认格式。
如果您想更改它,可以在 neo4j.conf 文件中为 db.format 配置设置一个新值。
或者,您可以使用 CREATE DATABASE databasename OPTIONS {storeFormat: 'the-new-format'} 命令设置新数据库的存储格式。但是,如果存储是通过 seedURIexistingDataSeedServerexistingDataSeedInstance 进行播种的,或者如果该命令用于挂载磁盘上已经存在的预存存储文件,它们将使用其当前的存储格式,而不会进行任何更改。

有关 Neo4j 中可用数据库存储格式的更多详细信息,请参阅 存储格式

语法

命令 语法

CREATE DATABASE

CREATE DATABASE name [IF NOT EXISTS]
[DEFAULT LANGUAGE CYPHER {5|25}]
[TOPOLOGY n PRIMAR{Y|IES} [m SECONDAR{Y|IES}]]
[OPTIONS "{" option: value[, ...] "}"]
[WAIT [n [SEC[OND[S]]]]|NOWAIT]
CREATE OR REPLACE DATABASE name
[DEFAULT LANGUAGE CYPHER {5|25}]
[TOPOLOGY n PRIMAR{Y|IES} [m SECONDAR{Y|IES}]]
[OPTIONS "{" option: value[, ...] "}"]
[WAIT [n [SEC[OND[S]]]]|NOWAIT]

[DEFAULT LANGUAGE CYPHER {5|25}] 从 Neo4j 2025.06 起在 Cypher 5 中可用。

命令 语法

CREATE DATABASE

CREATE DATABASE name [IF NOT EXISTS]
[[SET] DEFAULT LANGUAGE CYPHER {5|25}]
[[SET] TOPOLOGY n PRIMAR{Y|IES} [m SECONDAR{Y|IES}]]
[OPTIONS "{" option: value[, ...] "}"]
[WAIT [n [SEC[OND[S]]]]|NOWAIT]
CREATE OR REPLACE DATABASE name
[[SET] DEFAULT LANGUAGE CYPHER {5|25}]
[[SET] TOPOLOGY n PRIMAR{Y|IES} [m SECONDAR{Y|IES}]]
[OPTIONS "{" option: value[, ...] "}"]
[WAIT [n [SEC[OND[S]]]]|NOWAIT]

[[SET] DEFAULT LANGUAGE CYPHER {5|25}] 从 Neo4j 2025.06 起可用。
在 Cypher 25 中,[TOPOLOGY n PRIMAR{Y\|IES} [m SECONDAR{Y\|IES}]][[SET] TOPOLOGY n PRIMAR{Y\|IES} [m SECONDAR{Y\|IES}]] 取代。

选项

CREATE DATABASE 命令可以包含一个选项映射,例如 OPTIONS {key: 'value'}

描述

existingData

use

控制系统在创建数据库时如何处理磁盘上的现有数据。目前,这仅支持 existingDataSeedInstanceexistingDataSeedServerseedURI,并且必须设置为 use,这表示应将现有数据文件用于新数据库。

existingDataSeedServer

existingDataSeedInstance 在 5.25 版本中已弃用

集群服务器的 ID

定义使用哪个服务器来播种所创建数据库的数据。服务器 ID 可以在运行 SHOW SERVERS 后在 serverId 列中找到。已被 existingDataSeedServer 取代。

seedURI

指向现有数据库备份或转储的 URI。

定义一个来自外部源的相同种子,该种子将用于播种所有服务器。有关更多信息,请参阅 从 URI 创建数据库

seedConfig

以逗号分隔的配置值列表。

seedCredentials 在 5.26 版本中已弃用

凭据

定义需要传递给某些种子提供程序的凭据。建议使用 CloudSeedProvider 种子提供程序,从云存储播种时不需要此配置。有关更多信息,请参阅 CloudSeedProvider

txLogEnrichment

FULL | DIFF | OFF

定义为了变更数据捕获 (CDC) 目的而应用于事务日志的增强级别。

有关增强模式的详细信息,请参阅 变更数据捕获手册 → 在自管理实例上启用 CDC → 修改数据库的 CDC 模式

storeFormat

aligned | standard | high_limit | block

如果创建的是新数据库,则定义存储格式。high_limitstandard 格式从 5.23 版本起弃用。有关存储格式的更多信息,请参阅 存储格式

如果存储是通过 seedURIexistingDataSeedInstanceexistingDataSeedServer 进行播种的,或者如果该命令用于挂载磁盘上已经存在的预存存储文件,它们将保留其当前的存储格式,而不会进行任何修改。

从 Neo4j 2025.01 开始,您可以将 existingDataseedURIseedConfigseedCredentials 选项与 CREATE OR REPLACE DATABASE 命令一起使用。

existingDataSeedInstanceexistingDataSeedServer 仍不支持与 CREATE OR REPLACE DATABASE 命令一起使用。有关播种选项的更多详细信息,请参阅 播种集群

CREATE DATABASE [OR REPLACE] 命令可以包含一个选项映射,例如 OPTIONS {key: 'value'}

描述

existingDataSeedServer

集群服务器的 ID

定义使用哪个服务器来播种所创建数据库的数据。服务器 ID 可以在运行 SHOW SERVERS 后在 serverId 列中找到。

seedURI

指向备份、包含备份工件的文件夹或现有数据库转储的 URI。

定义来自外部源的种子,它将用于播种所有服务器。

seedConfig

以逗号分隔的配置值列表。

有关更多信息,请参阅 从 URI 创建数据库

txLogEnrichment§

FULL | DIFF | OFF

定义为了变更数据捕获 (CDC) 目的而应用于事务日志的增强级别。

有关增强模式的详细信息,请参阅 变更数据捕获手册 → 在自管理实例上启用 CDC → 切换 CDC 模式

storeFormat

aligned | standard | high_limit | block

如果创建的是新数据库,则定义存储格式。high_limitstandard 格式从 5.23 版本起弃用。有关存储格式的更多信息,请参阅 存储格式

如果存储是通过 seedURIexistingDataSeedServer 进行播种的,或者如果该命令用于挂载磁盘上已经存在的预存存储文件,它们将保留其当前的存储格式,而不会进行任何修改。

seedRestoreUntil

日期时间或事务 ID。例如 datetime("2025-01-01T12:15:00.000+0100")123456

如果您传递的 seedURI 指向备份链(包括差异备份),您可以选择不应用差异备份中的所有事务。要播种到特定日期,请指定一个 datetime。这将使用在提供的日期时间之前提交的事务来播种数据库。要播种到特定事务 ID,请指定一个事务 ID。这将播种数据库到该事务 ID 为止(不包含该事务)。

seedSourceDatabase 引入于 2025.06

源数据库名称

如果 seedURI 指向包含多个数据库备份的文件夹,您可以指定数据库名称来筛选工件。

existingData 在 2025.06 版本中已弃用

use

仅为向后兼容性保留,无效,并将在未来版本中删除。

在 Cypher 25 中,已删除了 seedCredentialsexistingDataSeedInstance 选项,而 existingData 选项现已被弃用且无效。

以下示例展示了如何使用带各种选项的 CREATE DATABASE 命令来创建数据库。

创建数据库

要创建名为 actors 的数据库,请使用 CREATE DATABASE 命令,后跟数据库名称。

CREATE DATABASE actors

创建数据库后,它会显示在 SHOW DATABASES 命令提供的列表中。

SHOW DATABASES YIELD name
结果
+-------------+
| name        |
+-------------+
| "actors"    |
| "movies"    |
| "neo4j"     |
| "system"    |
+-------------+

使用 WAIT 创建数据库

子句 WAIT 允许您指定命令完成并返回的时间限制。

CREATE DATABASE slow WAIT 5 SECONDS
结果
+-------------------------------------------------------+
| address          | state      | message     | success |
+-------------------------------------------------------+
| "localhost:7687" | "CaughtUp" | "caught up" | TRUE    |
+-------------------------------------------------------+

success 列提供了命令是否被视为成功的聚合状态。因此,在成功完成且未超时的情况下,每一行都有相同的值。

结果

子句 WAIT 允许您指定命令完成并返回的时间限制。

CREATE DATABASE slow WAIT 5 SECONDS
info: Server `ServerId{b55c6551}` at address `server1:7687` has caught up.
03N85 (Neo.ClientNotification.Cluster.ServerCaughtUp)

info: Server `ServerId{a9e7e8f1}` at address `server2:7687` has caught up.
03N85 (Neo.ClientNotification.Cluster.ServerCaughtUp)

info: Server `ServerId{0f7cb48e}` at address `server3:7687` has caught up.
03N85 (Neo.ClientNotification.Cluster.ServerCaughtUp)

该命令为集群中的每个服务器返回一个通知,以指示该命令在该服务器上的状态。在此示例中,所有三个集群成员都返回了 03N85 (Neo.ClientNotification.Cluster.ServerCaughtUp),这表明服务器已成功应用了该命令并且是最新的。

使用 IF NOT EXISTSOR REPLACE 创建数据库

CREATE DATABASE 命令是可选幂等的,默认行为是如果数据库已存在则失败并报错。有两种方法可以规避此行为。

首先,在命令后附加 IF NOT EXISTS 可以确保如果给定名称的数据库或数据库别名已经存在,则不会返回错误,且不会发生任何操作。

CREATE DATABASE actors IF NOT EXISTS

其次,在命令中添加 OR REPLACE 会删除任何现有的数据库并创建一个新的数据库。

CREATE OR REPLACE DATABASE actors

这等同于运行 DROP DATABASE actors IF EXISTS,然后运行 CREATE DATABASE actors

请记住,使用 CREATE OR REPLACE DATABASE 也会删除索引和约束。要保留它们,请在 CREATE OR REPLACE DATABASE 之前运行以下 Cypher 命令并保存其输出。

SHOW CONSTRAINTS YIELD createStatement AS statement
SHOW INDEXES YIELD createStatement, owningConstraint
WHERE owningConstraint IS NULL
RETURN createStatement AS statement

IF NOT EXISTSOR REPLACE 的行为适用于标准数据库和复合数据库(例如,复合数据库可以替换标准数据库或另一个复合数据库)。IF NOT EXISTS 还会捕获是否存在给定名称的任何数据库别名,并执行无操作,而不是在现有别名共享该名称时抛出错误。

这些命令中的 IF NOT EXISTSOR REPLACE 部分不能同时使用。

为标准数据库设置默认 Cypher 版本

您可以在创建数据库时为其设置默认 Cypher 版本。如果未指定,该数据库的版本将设置为 DBMS 的默认 Cypher 版本。例如

CREATE DATABASE actors DEFAULT LANGUAGE CYPHER 25

此命令创建一个名为 actors 的数据库,并将默认 Cypher 版本设置为 25。

要查看 DBMS 中每个数据库的默认 Cypher 版本,请使用 YIELD 子句运行 SHOW DATABASES 命令,并指定 defaultLanguage 列。例如

查询
SHOW DATABASES YIELD name, defaultLanguage
表 1. 结果
名称 (name) defaultLanguage

"actors"

"CYPHER 25"

"movies"

"CYPHER 5"

"neo4j"

"CYPHER 25"

"system"

"CYPHER 25"

行:4

有关配置 Cypher 版本的其他选项的更多信息,请参阅 配置 Cypher 默认版本

将默认语言设置为 CYPHER 25 可确保在该数据库上运行的所有查询都将使用该数据库当前运行的 Cypher 25 版本(除非您在查询前加上 CYPHER 5,这将覆盖此默认值)。例如,具有默认语言 Cypher 25 的 Neo4j 2025.08 数据库将使用 Neo4j 2025.08 中存在的 Cypher 25,包括在 Neo4j 2025.06、2025.07 和 2025.08 中引入的所有更改。