管理复合数据库中的数据库别名

本地和远程数据库别名都可以作为复合数据库的一部分进行创建。从 Neo4j 2025.04 开始,数据库别名也可以设置为复合数据库的默认数据库。

从 Neo4j 2025.06 开始,可以为数据库别名或远程别名指定默认 Cypher 版本。但是,本地别名以及复合数据库中的别名不能指定默认 Cypher 版本。本地别名始终沿用其目标数据库的 Cypher 版本,而复合数据库中的别名始终沿用该复合数据库的 Cypher 版本。

列出复合数据库中的数据库别名

可以使用 SHOW ALIASES FOR DATABASE 查看复合数据库中可用的数据库别名。特定数据库别名所属的复合数据库名称显示在返回的 composite 列中。

所需的权限描述见 DBMS ALIAS MANAGEMENT 权限

查询
SHOW ALIASES FOR DATABASE
结果
+--------------------------------------------------------------------------------------------------------------------------------+
| name              | composite | database        | location | url                       | credentials                 | user    |
+--------------------------------------------------------------------------------------------------------------------------------+
| "library.romance" | "library" | "romance-books" | "remote" | "neo4j+s://location:7687" | "STORED NATIVE CREDENTIALS" | "alice" |
| "library.sci-fi"  | "library" | "sci-fi-books"  | "local"  | NULL                      | NULL                        | NULL    |
+--------------------------------------------------------------------------------------------------------------------------------+

有关此命令返回的所有列的描述,以及过滤 SHOW ALIASES FOR DATABASE 命令中别名的方法,请参阅 列出标准数据库的别名

在复合数据库中创建数据库别名

本地和远程数据库别名都可以是 复合数据库 的一部分。

数据库别名由两部分组成,中间用点分隔:命名空间(namespace)和别名名称(alias name)。

命名空间必须是复合数据库的名称。

查询
CREATE ALIAS garden.flowers
FOR DATABASE `perennial-flowers`
查询
CREATE ALIAS garden.trees
FOR DATABASE trees AT 'neo4j+s://location:7687'
USER alice PASSWORD 'password'

当在复合数据库中创建数据库别名后,它将显示在 SHOW DATABASES 命令提供的 constituents 列中,以及 SHOW ALIASES FOR DATABASE 命令中。

查询
SHOW DATABASE garden YIELD name, type, constituents
结果
+-------------------------------------------------------------+
| name     | type        | constituents                       |
+-------------------------------------------------------------+
| "garden" | "composite" | ["garden.flowers", "garden.trees"] |
+-------------------------------------------------------------+
查询
SHOW ALIASES FOR DATABASE
WHERE composite = 'garden'
结果
+-----------------------------------------------------------------------------------------------------------------------------------+
| name             | composite | database            | location | url                       | credentials                 | user    |
+-----------------------------------------------------------------------------------------------------------------------------------+
| "garden.flowers" | "garden"  | "perennial-flowers" | "local"  | NULL                      | NULL                        | NULL    |
| "garden.trees"   | "garden"  | "trees"             | "remote" | "neo4j+s://location:7687" | "STORED NATIVE CREDENTIALS" | "alice" |
+-----------------------------------------------------------------------------------------------------------------------------------+

数据库别名不能指向复合数据库。

查询
CREATE ALIAS yard FOR DATABASE garden
错误消息
Failed to create the specified database alias 'yard': Database 'garden' is composite.

从 5.26 版本开始,错误消息还包含 GQLSTATUS 代码 42NA6 和状态描述 error: syntax error or access rule violation - invalid alias target. Aliases are not allowed to target composite databases.

修改复合数据库中的本地和远程数据库别名

可以使用 ALTER ALIAS 命令修改属于复合数据库的本地和远程数据库别名。这与用于修改非复合数据库别名的命令相同。

查询
ALTER ALIAS garden.flowers SET DATABASE PROPERTIES { perennial: true }
查询
ALTER ALIAS garden.trees SET DATABASE TARGET updatedTrees AT 'neo4j+s://location:7687' PROPERTIES { treeVersion: 2 }

更新后的属性随后可以在查询中使用 graph.propertiesByName() 函数

所有数据库别名的更改都会显示在 SHOW ALIASES FOR DATABASE 命令中。

查询
SHOW ALIASES FOR DATABASE YIELD *
结果
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| name              | composite | database            | location | url                       | credentials                 | user    | driver | defaultLanguage | properties        |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "garden.flowers"  | "garden"  | "perennial-flowers" | "local"  | NULL                      | NULL                        | NULL    | NULL   | NULL            | {perennial: TRUE} |
| "garden.trees"    | "garden"  | "updatedtrees"      | "remote" | "neo4j+s://location:7687" | "STORED NATIVE CREDENTIALS" | "alice" | {}     | NULL            | {treeversion: 2}  |
| "library.romance" | "library" | "romance-books"     | "remote" | "neo4j+s://location:7687" | "STORED NATIVE CREDENTIALS" | "alice" | {}     | NULL            | {}                |
| "library.sci-fi"  | "library" | "sci-fi-books"      | "local"  | NULL                      | NULL                        | NULL    | NULL   | NULL            | {}                |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

删除复合数据库中的数据库别名

要删除复合数据库中的别名,请使用 DROP ALIAS FOR DATABASE 命令。这与用于删除非复合数据库别名的命令相同。

查询
DROP ALIAS garden.flowers FOR DATABASE

当数据库别名被删除后,它将不再显示在 SHOW ALIASES FOR DATABASE 命令中。

查询
SHOW ALIASES FOR DATABASE
结果
+--------------------------------------------------------------------------------------------------------------------------------+
| name              | composite | database        | location | url                       | credentials                 | user    |
+--------------------------------------------------------------------------------------------------------------------------------+
| "garden.trees"    | "garden"  | "updatedtrees"  | "remote" | "neo4j+s://location:7687" | "STORED NATIVE CREDENTIALS" | "alice" |
| "library.romance" | "library" | "romance-books" | "remote" | "neo4j+s://location:7687" | "STORED NATIVE CREDENTIALS" | "alice" |
| "library.sci-fi"  | "library" | "sci-fi-books"  | "local"  | NULL                      | NULL                        | NULL    |
+--------------------------------------------------------------------------------------------------------------------------------+

此外,删除后的别名将不再出现在 SHOW DATABASE 命令的 constituents 列中。

查询
SHOW DATABASE garden YIELD name, type, constituents
结果
+-------------------------------------------+
| name     | type        | constituents     |
+-------------------------------------------+
| "garden" | "composite" | ["garden.trees"] |
+-------------------------------------------+

包含点的数据库别名名称

在复合数据库中命名数据库别名遵循与 命名标准数据库别名 相同的规则。但是,当使用反引号转义名称时,有一些额外的事情需要考虑。

别名名称中的点具有歧义。它们既可以被解释为名称本身的一部分,也可以被解释为分隔复合命名空间和别名名称的点。

名称冲突

在 Neo4j 2025.06 之前的版本中,可能会创建冲突的别名,例如复合数据库 garden 中的组成部分别名 flowers,以及非复合本地别名 garden.flowers。这两者都由相同的名称 garden.flowers 指代。

Neo4j 2025.06 及更高版本确保不存在此类冲突,并在尝试创建与现有别名同名的新别名时抛出异常。

不允许创建与现有复合组成部分同名的常规别名。

查询
CYPHER 5 CREATE COMPOSITE DATABASE `garden`
CYPHER 5 CREATE ALIAS `garden`.`flowers` FOR DATABASE `northwind-graph`
CYPHER 5 CREATE ALIAS `garden.flowers` FOR DATABASE `northwind-graph`
错误消息
Failed to create the specified database alias 'garden.flowers': Database name or alias already exists.

该异常具有 GQLSTATUS 代码 42001 - invalid syntax,原因为 42N11 - graph reference already exists

不允许创建与现有复合组成部分同名的常规别名。在 Cypher 25 中,这两个名称被视为相同,因为它们的部分没有像在 Cypher 5 中那样被分开引用。

查询
CYPHER 25 CREATE COMPOSITE DATABASE `garden`
CYPHER 25 CREATE ALIAS `garden.flowers` FOR DATABASE `northwind-graph`
CYPHER 25 CREATE ALIAS `garden.flowers` FOR DATABASE `northwind-graph`
错误消息
Failed to create the specified database alias 'garden.flowers': Database name or alias already exists.

该异常具有 GQLSTATUS 代码 42001 - invalid syntax,原因为 42N11 - graph reference already exists

不允许创建与现有非复合别名同名的复合组成部分。此示例场景已在第二行被阻止;因此,第三行的组成部分无法创建。

查询
CYPHER 5 CREATE ALIAS `garden.flowers` FOR DATABASE `northwind-graph`
CYPHER 5 CREATE COMPOSITE DATABASE `garden`
CYPHER 5 CREATE ALIAS `garden`.`flowers` FOR DATABASE `northwind-graph`
错误消息
Cannot create database 'garden' because another database 'garden.flowers' exists with an ambiguous name.

该异常具有 GQLSTATUS 代码 42N87 - database or alias with similar name exists

不允许创建与现有非复合别名同名的复合组成部分。此示例场景已在第二行被阻止;因此,第三行的组成部分无法创建。Cypher 25 语法不对名称进行区分,以明确它们被视为等效。

查询
CYPHER 25 CREATE ALIAS `garden.flowers` FOR DATABASE `northwind-graph`
CYPHER 25 CREATE COMPOSITE DATABASE `garden`
CYPHER 25 CREATE ALIAS `garden.flowers` FOR DATABASE `northwind-graph`
错误消息
Cannot create database 'garden' because another database 'garden.flowers' exists with an ambiguous name.

该异常具有 GQLSTATUS 代码 42N87 - database or alias with similar name exists

Cypher 25 特有行为

访问现有的带点别名

Cypher 25 依赖于 Neo4j 2025.06 及更高版本中不允许存在冲突名称的保证。以下查询均作用于同一个别名,无论该别名是否为复合组成部分。Cypher 5 中必要的对名称部分的特殊引用在 Cypher 25 中是不允许的。

参数
{
  "name": "my.garden.beautiful.flowers"
}
查询
CYPHER 25 ALTER ALIAS `my.garden.beautiful.flowers` SET DATABASE PROPERTIES { perennial: true }
CYPHER 25 ALTER ALIAS $name SET DATABASE PROPERTIES { perennial: true }
CYPHER 25 USE `my.garden.beautiful.flowers` RETURN 1

创建新的带点别名

CREATE 期间,Cypher 25 会在每个点处从左到右拆分给定名称,并检查是否存在相应的复合数据库。如果未找到复合数据库,Cypher 25 将回退到创建常规非复合别名。

例如:

查询
CYPHER 25 CREATE COMPOSITE DATABASE `my.garden`
CYPHER 25 CREATE ALIAS `my.garden.beautiful.flowers` FOR DATABASE `northwind-graph`

该查询尝试按给定顺序创建以下别名:

  1. 复合数据库 my 中的组成部分别名 garden.beautiful.flowers

  2. 复合数据库 my.garden 中的组成部分别名 beautiful.flowers

  3. 复合数据库 my.garden.beautiful 中的组成部分别名 flowers

  4. 常规非复合别名 my.garden.beautiful.flowers

当它找到复合数据库 my.garden 时,它会在该复合数据库中创建组成部分别名 beautiful.flowers

Cypher 5 特有行为

引用数据库别名和复合数据库名称

复合数据库名称和数据库别名名称需要单独引用。无论名称是否包含特殊字符,都可以添加反引号,因此最好始终对两个名称都使用反引号,例如 `composite`.`alias`

Cypher 25 不再支持用反引号分隔复合数据库名称和别名名称。详细信息请参阅 Cypher 25 特有行为

以下示例在名为 my-composite-database-with-dashes 的复合数据库中创建了一个名为 my alias with spaces 的数据库别名作为组成部分:

查询
CYPHER 5 CREATE ALIAS `my-composite-database-with-dashes`.`my alias with spaces` FOR DATABASE `northwind-graph`

当未单独引用时,将改为创建一个全名为 my alias with.dots and spaces 的数据库别名。

查询
CYPHER 5 CREATE ALIAS `my alias with.dots and spaces` FOR DATABASE `northwind-graph`

处理多个点

数据库别名名称也可以包含点。尽管这些名称始终需要引用,以避免与复合数据库和数据库别名分割字符产生歧义。

查询
CYPHER 5 CREATE ALIAS `my.alias.with.dots` FOR DATABASE `northwind-graph`
查询
CYPHER 5 CREATE ALIAS `my.composite.database.with.dots`.`my.other.alias.with.dots` FOR DATABASE `northwind-graph`

单点和本地数据库别名

自 Neo4j 2025.06 起,此功能不再被弃用。

对于没有现有复合数据库的带单点本地数据库别名,有一个特殊情况。如果存在名为 some 的复合数据库,则以下查询将在复合数据库 some 中创建一个名为 alias 的数据库别名。但是,如果不存在这样的数据库,相同的查询将改为创建一个名为 some.alias 的数据库别名。

查询
CYPHER 5 CREATE ALIAS some.alias FOR DATABASE `northwind-graph`

处理参数

使用参数时,名称不能加引号。当给定参数包含点时,第一个点将被视为复合数据库的分隔符。

考虑以下带有参数的查询:

参数
{
  "aliasname": "mySimpleCompositeDatabase.myAlias"
}
查询
CYPHER 5 CREATE ALIAS $aliasname FOR DATABASE `northwind-graph`

如果存在复合数据库 mysimplecompositedatabase,则会在该复合数据库中创建数据库别名 myalias。如果不存在这样的复合数据库,则会创建数据库别名 mysimplecompositedatabase.myalias

相反,使用参数无法在复合数据库 mycompositedatabase.withdot 中创建数据库别名 myalias。考虑相同的查询,但使用以下参数:

参数
{
  "aliasname": "myCompositeDatabase.withDot.myAlias"
}

由于第一个点将被用作分隔符,该命令将尝试在复合数据库 mycompositedatabase 中创建数据库别名 withdot.myalias。如果 mycompositedatabase 不存在,该命令将创建一个名为 mycompositedatabase.withdot.myalias 的数据库别名,它不属于任何复合数据库。

在这种情况下,建议避免使用参数,并明确地分别引用复合数据库名称和别名名称,以避免歧义。

处理参数

对于数据库别名和名称相似的复合数据库,需要使用参数进行进一步的特殊处理。

考虑此设置:

查询
CYPHER 5 CREATE COMPOSITE DATABASE foo
CYPHER 5 CREATE ALIAS `foo.bar` FOR DATABASE `northwind-graph`

别名 foo.bar 不属于复合数据库 foo

使用参数删除此别名会因别名缺失而导致错误:

参数
{
  "aliasname": "foo.bar"
}
查询
CYPHER 5 DROP ALIAS $aliasname FOR DATABASE
错误消息
Failed to delete the specified database alias 'foo.bar': Database alias does not exist.

如果复合数据库 foo 不存在,则数据库别名 foo.bar 将会被删除。

在这种情况下,建议避免使用参数,并明确地分别引用复合数据库名称和别名名称,以避免歧义。