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

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

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

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

所需权限在DBMS 别名管理权限中描述。

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

有关此命令返回的所有列的说明,以及如何过滤 SHOW ALIASES FOR DATABASE 命令以查找别名的方式,请参见列出标准数据库的别名

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

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

数据库别名由两部分组成,用点分隔:命名空间和别名名称。

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

查询
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                       | user    |
+-----------------------------------------------------------------------------------------------------+
| "garden.flowers" | "garden"  | "perennial-flowers" | "local"  | NULL                      | NULL    |
| "garden.trees"   | "garden"  | "trees"             | "remote" | "neo4j+s://location:7687" | "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                       | user    | driver | properties        |
+-----------------------------------------------------------------------------------------------------------------------------------+
| "garden.flowers"  | "garden"  | "perennial-flowers" | "local"  | NULL                      | NULL    | NULL   | {perennial: TRUE} |
| "garden.trees"    | "garden"  | "updatedtrees"      | "remote" | "neo4j+s://location:7687" | "alice" | {}     | {treeversion: 2}  |
| "library.romance" | "library" | "romance-books"     | "remote" | "neo4j+s://location:7687" | "alice" | {}     | {}                |
| "library.sci-fi"  | "library" | "sci-fi-books"      | "local"  | 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                       | user    |
+--------------------------------------------------------------------------------------------------+
| "garden.trees"    | "garden"  | "updatedtrees"  | "remote" | "neo4j+s://location:7687" | "alice" |
| "library.romance" | "library" | "romance-books" | "remote" | "neo4j+s://location:7687" | "alice" |
| "library.sci-fi"  | "library" | "sci-fi-books"  | "local"  | NULL                      | NULL    |
+--------------------------------------------------------------------------------------------------+

此外,已删除的别名将不再显示在 SHOW DATABASE 命令的 constituents 列中。

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

数据库别名和转义

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

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

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

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

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

如果未单独引用,则会创建一个完整名称为 my alias with.dots and spaces 的数据库别名

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

处理多个点

数据库别名也可以包含点。但是,这些始终需要引用,以避免与复合数据库和数据库别名分隔符混淆。

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

单点和本地数据库别名

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

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

处理参数

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

考虑带参数的查询

参数
{
  "aliasname": "mySimpleCompositeDatabase.myAlias"
}
查询
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 的数据库别名,该别名不属于任何复合数据库。

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

处理参数

对于数据库别名和类似命名的复合数据库,还需要对参数进行进一步的特殊处理。

考虑以下设置

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

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

使用参数删除此别名会因缺少别名而失败

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

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

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

© . All rights reserved.