管理复合数据库中的数据库别名企业版Aura 不可用
本地和远程数据库别名都可以作为复合数据库的一部分进行创建。从 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"] | +-------------------------------------------+
包含点的数据库别名名称
在复合数据库中命名数据库别名遵循与 命名标准数据库别名 相同的规则。但是,当使用反引号转义名称时,有一些额外的事情需要考虑。
别名名称中的点具有歧义。它们既可以被解释为名称本身的一部分,也可以被解释为分隔复合命名空间和别名名称的点。
名称冲突引入于 2025.06
在 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 特有行为引入于 2025.06
访问现有的带点别名
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`
该查询尝试按给定顺序创建以下别名:
-
复合数据库
my中的组成部分别名garden.beautiful.flowers。 -
复合数据库
my.garden中的组成部分别名beautiful.flowers。 -
复合数据库
my.garden.beautiful中的组成部分别名flowers。 -
常规非复合别名
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 将会被删除。
在这种情况下,建议避免使用参数,并明确地分别引用复合数据库名称和别名名称,以避免歧义。