Create databases

Neo4j supports the management of multiple databases within the same DBMS. The metadata for these databases, including the associated security model, is maintained in a special database called the system database. All multi-database administrative commands must be run against the system database. These administrative commands are automatically routed to the system database when connected to the DBMS over Bolt.

You can create a database using the Cypher command CREATE DATABASE. The initial contents of the database depend on the state of the server and the options provided to the command. When no additional options are provided, CREATE DATABASE will attempt to mount any pre-existing store files in place (e.g., as the result of restoring a backup). If no pre-existing store files are available, it will create an empty database.

Database names are subject to the rules specified in Database names section. Having dots (.) in the database names is not recommended. This is due to the difficulty of determining if a dot is part of the database name or a delimiter for a database alias in a composite database.

block is the default format for all newly created databases as long as they do not have the db.format setting specified.
If you want to change it, you can set a new value for the db.format configuration in the neo4j.conf file.
Alternatively, you can set the store format of new databases using the CREATE DATABASE databasename OPTIONS {storeFormat: 'the-new-format'} command. However, if the store is seeded with seedURI, existingDataSeedServer or existingDataSeedInstance, or if the command is being used to mount pre-existing store files already present on the disk, they will use their current store format without any alterations.

See Store formats, for more details about available database store formats in Neo4j.

Syntax

Command Syntax

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}] is available in Cypher 5 starting from Neo4j 2025.06 onwards.

Command Syntax

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}] is available from Neo4j 2025.06 onwards.
[TOPOLOGY n PRIMAR{Y\|IES} [m SECONDAR{Y\|IES}]] is replaced by [[SET] TOPOLOGY n PRIMAR{Y\|IES} [m SECONDAR{Y\|IES}]] in Cypher 25.

Options

The CREATE DATABASE command can have a map of options, e.g. OPTIONS {key: 'value'}.

Key Value Description

existingData

use

Controls how the system handles existing data on disk when creating the database. Currently, this is only supported with existingDataSeedInstance, existingDataSeedServer and seedURI, and must be set to use, which indicates the existing data files should be used for the new database.

existingDataSeedServer

existingDataSeedInstance deprecated in 5.25

ID of the cluster server

Defines which server is used for seeding the data of the created database. The server ID can be found in the serverId column after running SHOW SERVERS. Replaced by existingDataSeedServer.

seedURI

URI to a backup or a dump from an existing database.

Defines an identical seed from an external source which will be used to seed all servers. For more information, see Seed from a URI.

seedConfig

Comma-separated list of configuration values.

seedCredentials Deprecated in 5.26

credentials

Defines credentials that need to be passed into certain seed providers. It is recommended to use the CloudSeedProvider seed provider, which does not require this configuration when seeding from cloud storage. For more information see CloudSeedProvider.

txLogEnrichment

FULL | DIFF | OFF

Defines the level of enrichment applied to transaction logs for Change Data Capture (CDC) purposes.

For details about enrichment mode, see Change Data Capture Manual → Enable CDC on self-managed instances → Modify a database’s CDC mode.

storeFormat

aligned | standard | high_limit | block

Defines the store format if the database created is new. high_limit and standard formats are deprecated from 5.23. For more information on store formats, see Store formats.

If the store is seeded with seedURI, existingDataSeedInstance or existingDataSeedServer, or if the command is used to mount pre-existing store files already present on the disk, they will retain their current store format without any modifications.

Starting from Neo4j 2025.01, you can use existingData, seedURI, seedConfig, and seedCredentials options together with the CREATE OR REPLACE DATABASE command.

The existingDataSeedInstance and existingDataSeedServer are still not supported with the CREATE OR REPLACE DATABASE command. More details about seeding options can be found in Seed a cluster.

The CREATE DATABASE [OR REPLACE] command can have a map of options, e.g., OPTIONS {key: 'value'}.

Key Value Description

existingDataSeedServer

ID of the cluster server

Defines which server is used for seeding the data of the created database. The server ID can be found in the serverId column after running SHOW SERVERS.

seedURI

URI to a backup, a folder that contains backup artifacts or a dump from an existing database.

Defines a seed from an external source, which will be used to seed all servers.

seedConfig

Comma-separated list of configuration values.

For more information see Seed from URI.

txLogEnrichment

FULL | DIFF | OFF

Defines the level of enrichment applied to transaction logs for Change Data Capture (CDC) purposes.

For details about enrichment mode, see Change Data Capture Manual → Enable CDC on self-managed instances → Set the enrichment mode.

storeFormat

aligned | standard | high_limit | block

Defines the store format if the database created is new. high_limit and standard formats are deprecated from 5.23. For more information on store formats, see Store formats.

If the store is seeded with seedURI or existingDataSeedServer, or if the command is used to mount pre-existing store files already present on the disk, they will retain their current store format without any modifications.

seedRestoreUntil

Datetime or transaction id. E.g. datetime("2025-01-01T12:15:00.000+0100") or 123456

If you are passing a seedURI that leads to a backup chain, including differential backups, you can choose to not apply all the transactions in the differential backups. To seed up to a specific date, specify a datetime. This will seed the database with transactions committed before the provided timestamp. To seed up to a specific transaction ID, specify a transaction ID. This will seed the database with transactions up to, but not including the specified transaction.

seedSourceDatabase Introduced in 2025.06

A source database name

If the seedURI points to a folder containing backups for multiple databases, you can specify the database name to filter the artifacts.

existingData Deprecated in 2025.06

use

Included for backward compatibility only, has no effect and will be removed in a future version.

In Cypher 25, the options seedCredentials and existingDataSeedInstance have been removed, while the existingData option is now deprecated and has no effect.

The following examples show how to create a database using the CREATE DATABASE command with various options.

Create a database

To create a database named actors, use the command CREATE DATABASE followed by the name of this database.

CREATE DATABASE actors

When you create a database, it shows up in the listing provided by the command SHOW DATABASES:

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

Create a database with WAIT

Sub-clause WAIT allows you to specify a time limit for the command to complete and return.

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

The success column provides an aggregate status of whether or not the command is considered successful. Thus, every row has the same value, determined on a successful completion without a timeout.

Sub-clause WAIT allows you to specify a time limit for the command to complete and return.

CREATE DATABASE slow WAIT 5 SECONDS
Result
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)

The command returns a notification for each server in the cluster to indicate the status of that command on that server. In this example, all three cluster members have returned 03N85 (Neo.ClientNotification.Cluster.ServerCaughtUp), which indicates that the server has applied the command successfully and is up to date.

Create a database with IF NOT EXISTS or OR REPLACE

The CREATE DATABASE command is optionally idempotent, with the default behavior to fail with an error if the database already exists. There are two ways to circumvent this behavior.

First, appending IF NOT EXISTS to the command ensures that no error is returned and that nothing happens if the database already exists.

CREATE DATABASE actors IF NOT EXISTS

Second, adding OR REPLACE to the command deletes any existing database and creates a new one.

CREATE OR REPLACE DATABASE actors

This is equivalent to running DROP DATABASE actors IF EXISTS followed by CREATE DATABASE actors.

Keep in mind that using CREATE OR REPLACE DATABASE also removes indexes and constraints. To preserve them, run the following Cypher commands before the CREATE OR REPLACE DATABASE and save their outputs:

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

The behavior of IF NOT EXISTS and OR REPLACE apply to both standard and composite databases (e.g. a composite database may replace a standard database or another composite database).

The IF NOT EXISTS and OR REPLACE parts of these commands cannot be used together.

Set a default Cypher version for a standard database

You can set the default Cypher version for a database when creating it. If not specified, the version for that database will be set to the default Cypher version of the DBMS. For example:

CREATE DATABASE actors DEFAULT LANGUAGE CYPHER 25

This command creates a database named actors with the default Cypher version set to 25.

To view the default Cypher version of each database in the DBMS, run the command SHOW DATABASES with the YIELD clause and specify the defaultLanguage column. For example:

Query
SHOW DATABASES YIELD name, defaultLanguage
Table 1. Result
name defaultLanguage

"actors"

"CYPHER 25"

"movies"

"CYPHER 5"

"neo4j"

"CYPHER 25"

"system"

"CYPHER 25"

Rows: 4

For more information about other options for configuring the Cypher version, see Configure the Cypher default version.

Setting the default language to CYPHER 25 ensures that all queries run on that database will use the version of Cypher 25 that the database is currently running (unless you prepend your queries with CYPHER 5, which overrides this default). For example, a Neo4j 2025.08 database with default language Cypher 25 will use Cypher 25 as it exists in Neo4j 2025.08, including any changes introduced in Neo4j 2025.06, 2025.07, and 2025.08.