语法

此页面包含用于创建、列出和删除 Neo4j 中可用约束的语法。

有关语法的更多详细信息,请参阅操作手册 → 管理命令的 Cypher® 语法

CREATE CONSTRAINT

使用CREATE CONSTRAINT命令创建约束。创建约束时,建议提供约束名称。此名称在索引和约束中必须唯一。如果未显式给出名称,则会自动生成唯一名称。

创建约束需要CREATE CONSTRAINT权限

CREATE CONSTRAINT命令可以选择性地幂等。这意味着其默认行为是在尝试两次创建相同约束时抛出错误。使用IF NOT EXISTS标志,如果名称相同或架构和约束类型相同的约束已存在,则不会抛出错误,也不会发生任何事情。如果存在冲突的数据、索引或约束,它仍然可能会抛出错误。例如,节点缺少属性、索引名称相同或约束架构相同但约束类型冲突。从 Neo4j 5.17 开始,如果什么也没有发生,则会返回一条信息通知,显示阻止创建的现有约束。

对于由索引支持的约束,可以使用OPTIONS子句指定支持索引的索引提供程序。索引提供程序只有一个有效值,即range-1.0,它是默认值。范围索引没有支持的索引配置。

创建属性唯一性约束

在单个属性上为节点属性创建唯一性约束的语法
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE n.propertyName IS [NODE] UNIQUE
[OPTIONS "{" option: value[, ...] "}"]
在多个属性上为复合节点属性创建唯一性约束的语法
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE (n.propertyName_1, ..., n.propertyName_n) IS [NODE] UNIQUE
[OPTIONS "{" option: value[, ...] "}"]
在单个属性上为关系属性创建唯一性约束的语法 在 5.7 中引入
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR ()-"["r:RELATIONSHIP_TYPE"]"-()
REQUIRE r.propertyName IS [REL[ATIONSHIP]] UNIQUE
[OPTIONS "{" option: value[, ...] "}"]
在多个属性上为复合关系属性创建唯一性约束的语法 在 5.7 中引入
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR ()-"["r:RELATIONSHIP_TYPE"]"-()
REQUIRE (r.propertyName_1, ..., r.propertyName_n) IS [REL[ATIONSHIP]] UNIQUE
[OPTIONS "{" option: value[, ...] "}"]

可以使用OPTIONS子句指定索引提供程序。

有关如何创建属性唯一性约束的示例,请参阅创建、显示和删除约束 → 创建属性唯一性约束。属性唯一性约束是索引支持的

创建属性存在约束

创建节点属性存在约束的语法
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE n.propertyName IS NOT NULL
[OPTIONS "{" "}"]
创建关系属性存在约束的语法
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR ()-"["r:RELATIONSHIP_TYPE"]"-()
REQUIRE r.propertyName IS NOT NULL
[OPTIONS "{" "}"]

属性存在约束没有支持的OPTIONS值,但为了保持一致性,允许使用空选项映射。

有关如何创建属性存在约束的示例,请参阅创建、显示和删除约束 → 创建属性存在约束

创建属性类型约束

创建节点属性类型约束的语法
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE n.propertyName {[IS] :: | IS TYPED} <TYPE>
[OPTIONS "{" "}"]
创建关系属性类型约束的语法
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR ()-"["r:RELATIONSHIP_TYPE"]"-()
REQUIRE r.propertyName {[IS] :: | IS TYPED} <TYPE>
[OPTIONS "{" "}"]

表达式的三种变体IS ::::IS TYPED是同一表达式的语法同义词。首选语法是IS ::变体。

其中<TYPE>是以下属性类型之一

  • BOOLEAN

  • STRING

  • INTEGER

  • FLOAT

  • DATE

  • LOCAL TIME

  • ZONED TIME

  • LOCAL DATETIME

  • ZONED DATETIME

  • DURATION

  • POINT

  • LIST<BOOLEAN NOT NULL> 在 5.10 中引入

  • LIST<STRING NOT NULL> 在 5.10 中引入

  • LIST<INTEGER NOT NULL> 在 5.10 中引入

  • LIST<FLOAT NOT NULL> 在 5.10 中引入

  • LIST<DATE NOT NULL> 在 5.10 中引入

  • LIST<LOCAL TIME NOT NULL> 在 5.10 中引入

  • LIST<ZONED TIME NOT NULL> 在 5.10 中引入

  • LIST<LOCAL DATETIME NOT NULL> 在 5.10 中引入

  • LIST<ZONED DATETIME NOT NULL> 在 5.10 中引入

  • LIST<DURATION NOT NULL> 在 5.10 中引入

  • LIST<POINT NOT NULL> 在 5.10 中引入

  • 上述类型的任何封闭动态联合,例如INTEGER | FLOAT | STRING在 5.11 中引入

这些类型的允许语法变体列在类型及其同义词中。

属性类型约束没有支持的OPTIONS值,但为了保持一致性,允许使用空选项映射。

有关如何创建属性类型约束的示例,请参阅创建、显示和删除约束 → 创建属性类型约束

创建键约束

在单个属性上为节点创建键约束的语法
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE n.propertyName IS [NODE] KEY
[OPTIONS "{" option: value[, ...] "}"]
在多个属性上为复合节点创建键约束的语法

CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE (n.propertyName_1, ..., n.propertyName_n) IS [NODE] KEY
[OPTIONS "{" option: value[, ...] "}"]
在单个属性上创建关系键约束的语法 在 5.7 版本中引入
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR ()-"["r:RELATIONSHIP_TYPE"]"-()
REQUIRE r.propertyName IS [REL[ATIONSHIP]] KEY
[OPTIONS "{" option: value[, ...] "}"]
在多个属性上创建复合关系键约束的语法 在 5.7 版本中引入
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR ()-"["r:RELATIONSHIP_TYPE"]"-()
REQUIRE (r.propertyName_1, ..., r.propertyName_n) IS [REL[ATIONSHIP]] KEY
[OPTIONS "{" option: value[, ...] "}"]

可以使用OPTIONS子句指定索引提供程序。

有关如何创建键约束的示例,请参阅 创建、显示和删除约束 → 创建键约束。键约束是 索引支持的

SHOW CONSTRAINTS

要列出所有具有默认输出列的约束,请使用 SHOW CONSTRAINTS。如果需要所有列,请使用 SHOW CONSTRAINTS YIELD *。如果只需要特定列,请使用 SHOW CONSTRAINTS YIELD field[, …​]SHOW CONSTRAINTS 子句也可以使用 WHERE 子句进行过滤。

列出约束需要 SHOW CONSTRAINTS 权限
列出约束并使用默认返回值的语法
SHOW [
      ALL
     |NODE UNIQUE[NESS]
     |REL[ATIONSHIP] UNIQUE[NESS]
     |UNIQUE[NESS]
     |NODE [PROPERTY] EXIST[ENCE]
     |REL[ATIONSHIP] [PROPERTY] EXIST[ENCE]
     |[PROPERTY] EXIST[ENCE]
     |NODE PROPERTY TYPE
     |REL[ATIONSHIP] PROPERTY TYPE
     |PROPERTY TYPE
     |NODE KEY
     |REL[ATIONSHIP] KEY
     |KEY
] CONSTRAINT[S]
  [WHERE expression]
列出约束并使用完整返回值的语法
SHOW [
      ALL
     |NODE UNIQUE[NESS]
     |REL[ATIONSHIP] UNIQUE[NESS]
     |UNIQUE[NESS]
     |NODE [PROPERTY] EXIST[ENCE]
     |REL[ATIONSHIP] [PROPERTY] EXIST[ENCE]
     |[PROPERTY] EXIST[ENCE]
     |NODE PROPERTY TYPE
     |REL[ATIONSHIP] PROPERTY TYPE
     |PROPERTY TYPE
     |NODE KEY
     |REL[ATIONSHIP] KEY
     |KEY
] CONSTRAINT[S]
YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]
  [WHERE expression]
  [RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

类型过滤关键字根据约束类型过滤返回的约束

表 1. 类型过滤器
过滤器 描述

ALL

返回所有约束,不根据约束类型进行过滤。如果未指定任何过滤器,则为默认值。

NODE UNIQUE[NESS]

返回节点属性唯一性约束。 在 5.7 版本中引入

REL[ATIONSHIP] UNIQUE[NESS]

返回关系属性唯一性约束。 在 5.7 版本中引入

UNIQUE[NESS]

返回所有属性唯一性约束,包括节点和关系。 在 5.3 版本中引入了允许使用 UNIQUENESS

NODE [PROPERTY] EXIST[ENCE]

返回节点属性存在约束。

REL[ATIONSHIP] [PROPERTY] EXIST[ENCE]

返回关系属性存在约束。

[PROPERTY] EXIST[ENCE]

返回所有属性存在约束,包括节点和关系。

NODE PROPERTY TYPE

返回节点属性类型约束。 在 5.9 版本中引入

REL[ATIONSHIP] PROPERTY TYPE

返回关系属性类型约束。 在 5.9 版本中引入

PROPERTY TYPE

返回所有属性类型约束,包括节点和关系。 在 5.9 版本中引入

NODE KEY

返回节点键约束。

REL[ATIONSHIP] KEY

返回关系键约束。 在 5.7 版本中引入

KEY

返回所有节点和关系键约束。 在 5.7 版本中引入

有关如何列出约束的示例,请参阅 创建、显示和删除约束 → SHOW CONSTRAINTS。有关 SHOW CONSTRAINTS 命令的结果列的完整详细信息,请参阅 创建、显示和删除约束 → 列出约束的结果列

DROP CONSTRAINT

使用 DROP CONSTRAINT 命令删除约束。删除约束是通过指定约束的名称来完成的。

删除约束需要 DROP CONSTRAINT 权限
按名称删除约束的语法
DROP CONSTRAINT constraint_name [IF EXISTS]

此命令可以选择性地幂等。这意味着其默认行为是在尝试两次删除相同约束时抛出错误。使用 IF EXISTS 标志,如果约束不存在,则不会抛出错误,也不会发生任何事情。从 Neo4j 5.17 开始,将返回一个信息通知,详细说明约束不存在。

有关如何删除约束的示例,请参阅 创建、显示和删除约束 → DROP CONSTRAINT