在复合数据库中管理数据库别名
本地和远程数据库别名都可以作为复合数据库的一部分创建。从 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
将被删除。
在这些情况下,建议避免使用参数,并明确单独引用复合数据库名称和别名,以避免歧义。