语法

本页面包含用于在 Neo4j 中创建、列出和删除索引的语法。它还包含为了使用全文索引和向量索引而需要调用的过程签名。

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

CREATE INDEX

CREATE INDEX 命令的通用结构如下

CREATE [index_type] INDEX [index_name] [IF NOT EXISTS]
FOR {node_pattern | relationship_pattern}
ON property_or_token_lookup_pattern
[OPTIONS "{" option: value[, ...] "}"]

CREATE …​ INDEX …​ 命令可选择是否幂等。这意味着默认行为是:如果尝试创建名称相同的索引两次,则会抛出错误。使用 IF NOT EXISTS 时,如果存在名称相同或架构和索引类型相同的索引,则不会抛出错误且不会执行任何操作(如果存在冲突的约束,例如名称相同或具有相同架构和支撑索引的约束,仍可能抛出错误)。相反,它会返回一个提示信息,显示导致创建被阻止的现有索引。

索引名称在索引和约束中必须是唯一的。如果在创建索引时未明确指定名称,将分配一个随机名称。

可以使用 OPTIONS 子句指定索引配置设置。但是,并非所有索引都有可用的配置设置。在这些情况下,无需指定任何内容,应从查询中省略 OPTIONS 映射。

创建索引需要 CREATE INDEX 权限

范围索引 (Range indexes)

范围索引不支持任何索引配置。因此,下方的语法中省略了 OPTIONS 映射。

为节点标签创建范围索引(基于单个属性或复合属性)
CREATE [RANGE] INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName)
ON (n.propertyName_1[,
    n.propertyName_2,
    ...
    n.propertyName_n])
为关系类型创建范围索引(基于单个属性或复合属性)
CREATE [RANGE] INDEX [index_name] [IF NOT EXISTS]
FOR ()-"["r:TYPE_NAME"]"-()
ON (r.propertyName_1[,
    r.propertyName_2,
    ...
    r.propertyName_n])

更多信息,请参阅 创建索引 → 创建范围索引

文本索引 (Text indexes)

文本索引不支持任何索引配置。因此,下方的语法中省略了 OPTIONS 映射。

为节点标签的单个属性创建文本索引
CREATE TEXT INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName)
ON (n.propertyName_1)
为关系类型的单个属性创建文本索引
CREATE TEXT INDEX [index_name] [IF NOT EXISTS]
FOR ()-"["r:TYPE_NAME"]"-()
ON (r.propertyName_1)
无法在多个属性上创建复合文本索引。

更多信息,请参阅 创建索引 → 创建文本索引

点索引 (Point indexes)

为节点标签的单个属性创建点索引
CREATE POINT INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName)
ON (n.propertyName_1)
[OPTIONS "{" option: value[, ...] "}"]
为关系类型的单个属性创建点索引
CREATE POINT INDEX [index_name] [IF NOT EXISTS]
FOR ()-"["r:TYPE_NAME"]"-()
ON (r.propertyName_1)
[OPTIONS "{" option: value[, ...] "}"]

点索引可指定以下设置

  • spatial.cartesian.min

  • spatial.cartesian.max

  • spatial.cartesian-3d.min

  • spatial.cartesian-3d.max

  • spatial.wgs-84.min

  • spatial.wgs-84.max

  • spatial.wgs-84-3d.min

  • spatial.wgs-84-3d.max

无法在多个属性上创建复合点索引。

更多信息,请参阅 创建索引 → 创建点索引

令牌查找索引 (Token lookup indexes)

令牌查找索引不支持任何索引配置。因此,下方的语法中省略了 OPTIONS 映射。

创建节点标签查找索引
CREATE LOOKUP INDEX [index name] [IF NOT EXISTS]
FOR (n)
ON EACH labels(n)
创建关系类型查找索引
CREATE LOOKUP INDEX [index name] [IF NOT EXISTS]
FOR ()-"["r"]"-()
ON [EACH] type(r)

创建 Neo4j 数据库时默认存在两个令牌查找索引,且同一时间只能存在一个节点标签查找索引和一个关系类型查找索引。

更多信息,请参阅 创建索引 → 创建令牌查找索引

全文索引 (Full-text indexes)

为多个节点标签创建全文索引(基于单个属性或多个属性)
CREATE FULLTEXT INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName["|" ...])
ON EACH "[" n.propertyName[, ...] "]"
[OPTIONS "{" option: value[, ...] "}"]
为多个关系类型创建全文索引(基于单个属性或多个属性)
CREATE FULLTEXT INDEX [index_name] [IF NOT EXISTS]
FOR ()-"["r:TYPE_NAME["|" ...]"]"-()
ON EACH "[" r.propertyName[, ...] "]"
[OPTIONS "{" option: value[, ...] "}"]

全文索引可指定以下设置

  • fulltext.analyzer - 指定要使用的分析器(db.index.fulltext.listAvailableAnalyzers() 过程列出了可用的分析器)。

  • fulltext.eventually_consistent - 指定全文索引是否为最终一致性。如果设置为 true,它将确保来自提交事务的更新在后台线程中应用。

更多信息,请参阅 全文索引 - 创建全文索引

向量索引 (Vector indexes)

为节点标签的单个属性创建向量索引
CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName["|" ...])
ON (n.propertyName)
[WITH "[" n.additionalPropertyName[, ...] "]"]
[OPTIONS "{" option: value[, ...] "}"]
为关系类型的单个属性创建向量索引
CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR ()-"["r:TYPE_NAME["|" ...]"]"-()
ON (r.propertyName)
[WITH "[" r.additionalPropertyName[, ...] "]"]
[OPTIONS "{" option: value[, ...] "}"]
OPTIONS {
  indexConfig: {
    `vector.dimensions`: $dimension,
    `vector.similarity_function`: $similarityFunction
  }
}

建议在创建向量索引时提供维度。这样做可以避免产生困扰,即同一个索引可能包含不同维度的并排向量,但仍然只允许在相同维度的向量之间进行比较。

有关所有向量索引设置的完整列表,请参阅 向量索引配置设置

从 Neo4j 2026.01 开始,向量索引支持多标签、多关系类型以及用于过滤的附加属性。向量索引只能索引一个向量属性,可选的 WITH 子句添加用于过滤的非向量属性;它不会在多个向量属性上创建复合向量索引。

更多信息,请参阅 向量索引 - 创建和配置向量索引

SHOW INDEX

列出索引需要 SHOW INDEX 权限
列出数据库中的索引(全部列出或按索引类型过滤)
SHOW [ALL | FULLTEXT | LOOKUP | POINT | RANGE | TEXT | VECTOR] INDEX[ES]
[YIELD { * | field[,...] } [ORDER BY field[,...]] [SKIP n] [LIMIT n]]
[WHERE expression]
[RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]

使用 RETURN 子句时,必须使用 YIELD 子句。

更多信息,请参阅 显示索引

查询语义索引

Neo4j 的语义索引不会在 Cypher 查询中自动使用。要使用它们,必须调用特定的过程,或者在向量索引的情况下,必须显式使用 Cypher SEARCH 子句。过程的签名和 SEARCH 子句的语法如下所示。

全文索引

查询节点全文索引:db.index.fulltext.queryNodes()
CALL db.index.fulltext.queryNodes(indexName :: STRING, queryString :: STRING, options = {} :: MAP)
查询关系全文索引:db.index.fulltext.queryRelationships()
CALL db.index.fulltext.queryRelationships(indexName :: STRING, queryString :: STRING, options = {} :: MAP)

options 映射中有效的 key: value 对为

  • skip: <number> — 跳过前 N 个结果。

  • limit: <number> — 限制返回的结果数量。

  • analyzer: <string> — 使用指定的分析器作为此查询的搜索分析器。

options 映射和所有键都是可选的。

更多信息,请参阅 全文索引 - 查询全文索引

向量索引

从 Neo4j 2026.01 开始,查询向量索引的首选方式是使用 Cypher SEARCH 子句。另一种较弱的替代方案(也适用于早期 Neo4j 版本)是使用过程 db.index.vector.queryNodesdb.index.vector.queryRelationships

使用 SEARCH 查询节点向量索引
MATCH (n)
  [WHERE ...]
  SEARCH n IN (
    VECTOR INDEX index_name
    FOR query_vector
    [WHERE ...]
    LIMIT limit
  ) [SCORE AS score_alias]
使用 SEARCH 查询关系向量索引
MATCH ()-"["r"]"->()
  [WHERE ...]
  SEARCH r IN (
    VECTOR INDEX index_name
    FOR query_vector
    [WHERE ...]
    LIMIT limit
  ) [SCORE AS score_alias]
使用过程查询节点向量索引:db.index.vector.queryNodes()
CALL db.index.vector.queryNodes(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: VECTOR | LIST<INTEGER | FLOAT>)
使用过程查询关系向量索引:db.index.vector.queryRelationships()
CALL db.index.vector.queryRelationships(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: VECTOR | LIST<INTEGER | FLOAT>)

numberOfNearestNeighbours 指的是要作为邻域返回的最近邻居数量。query 指的是 LIST<INTEGER | FLOAT>,或者从 Neo4j 2025.10 开始,还可以指代应该搜索其邻域的 VECTOR

更多信息,请参阅 向量索引 - 查询向量索引

DROP INDEX

DROP INDEX 命令可以使用名称删除所有类型的索引。索引名称可以使用 SHOW INDEXES 命令查找,该命令在输出列 name 中给出。

DROP INDEX 命令可选择是否幂等。这意味着默认行为是:如果尝试删除同一个索引两次,则会抛出错误。使用 IF EXISTS 时,如果索引不存在,则不会抛出错误且不会执行任何操作。相反,它会返回一个提示信息,详细说明索引不存在。

删除索引需要 DROP INDEX 权限
删除任何类型的索引
DROP INDEX index_name [IF EXISTS]

更多信息,请参阅 删除索引