语法

此页面包含创建、列出和删除 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,如果已经存在具有相同名称或相同模式和索引类型的索引,则不会抛出错误,也不会发生任何情况(如果存在冲突的约束,例如具有相同名称或具有相同模式和后备索引的约束,它仍然可能会抛出错误)。从 Neo4j 5.17 开始,将返回一条信息通知,显示阻止创建的现有索引。

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

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

创建索引需要 CREATE INDEX 权限.

范围索引

范围索引只有一个索引提供程序 range-1.0,并且没有支持的索引配置。由于索引提供程序将默认分配,因此下面的语法中已省略 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])

文本索引

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

文本索引没有支持的索引配置,并且从 Neo4j 5.1 开始,它们有两个可用的索引提供程序:text-2.0(默认)和 text-1.0(已弃用)。

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

点索引

为节点标签上的单个属性创建一个点索引
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[, …] “}”]

点索引只有一个可用的索引提供程序 point-1.0。以下设置可用于点索引

  • 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-1.0,并且没有支持的索引配置。由于索引提供程序将默认分配,因此下面的语法中已省略 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 数据库时默认存在两个令牌查找索引,并且一次只能存在一个节点标签查找索引和一个关系类型查找索引。

全文索引

为一个或多个节点标签创建一个全文索引,可以是单个属性或多个属性
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-1.0。以下设置可用于全文索引

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

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

有关更多信息,请参见 全文索引 - 创建全文索引

向量索引

为单个属性上的节点标签创建向量索引 在 5.15 中引入
CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName)
ON (n.propertyName)
[OPTIONS “{“ option: value[, …] “}”]
为单个属性上的关系类型创建向量索引 在 5.18 中引入
CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR ()-”[“r:TYPE_NAME”]”-()
ON (r.propertyName)
[OPTIONS “{“ option: value[, …] “}”]

从 Neo4j 5.18 开始,向量索引有两个可用的向量索引提供程序:vector-2.0(默认)和 vector-1.0。有关更多信息,请参见 用于兼容性的向量索引提供程序

有关所有向量索引设置的完整列表,请参见 向量索引配置设置。请注意,在 Neo4j 5.23 之前,OPTIONS 子句是强制性的,因为创建向量索引时需要配置 vector.dimensionsvector.similarity_function 设置。

OPTIONS {
  indexConfig: {
    `vector.dimensions`: $dimension,
    `vector.similarity_function`: $similarityFunction
  }
}
无法在多个属性上创建复合向量索引。

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

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 子句是强制性的。

有关更多信息,请参见 创建、显示和删除索引 → SHOW INDEXES

查询语义索引

Neo4j 的语义索引不会在 Cypher 查询中自动使用。要使用它们,必须调用特定的过程。它们的签名可以在下面看到。

全文索引

查询节点上的全文索引: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 映射的有效 键:值 对是

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

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

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

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

有关更多信息,请参见 全文索引 - 查询全文索引

向量索引

查询节点上的向量文本索引:db.index.vector.queryNodes 在 5.11 中引入
CALL db.index.vector.queryNodes(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: LIST<INTEGER | FLOAT>)
查询关系上的向量文本索引:db.index.vector.queryRelationships 在 5.18 中引入
CALL db.index.vector.queryRelationships(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: LIST<INTEGER | FLOAT>)

numberOfNearestNeighbours 指的是要返回的作为邻域的最近邻居的数量。query 向量是指要搜索邻域的 LIST<FLOAT>

有关更多信息,请参见 向量索引 - 查询向量索引

DROP INDEX

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

DROP INDEX 命令是可选的幂等的。这意味着它的默认行为是在尝试删除同一个索引两次时抛出错误。使用 IF EXISTS,如果索引不存在,则不会抛出错误,也不会发生任何事情。从 Neo4j 5.17 开始,将返回一个信息通知,详细说明索引不存在。

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

有关更多信息,请参见 创建、显示和删除索引 → DROP INDEX