语法

此页面包含在 Neo4j 中创建、列出和删除可用索引的语法。它还包含使用全文和向量索引所需调用的过程签名。

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

创建索引

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 权限

范围索引

范围索引没有受支持的索引配置。因此,以下语法中已省略 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])

文本索引

文本索引没有受支持的索引配置。因此,以下语法中已省略 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)
无法在多个属性上创建复合文本索引。

点索引

为节点标签上的单个属性创建点索引
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

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

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

令牌查找索引

令牌查找索引没有受支持的索引配置。因此,以下语法中已省略 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.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.23 之前,OPTIONS 子句是强制性的,因为在创建向量索引时需要配置 vector.dimensionsvector.similarity_function 设置。

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

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

显示索引

列出索引需要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: <数字> — 跳过前 N 个结果。

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

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

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 命令可以使用索引名称删除所有类型的索引。索引名称可以通过 SHOW INDEXES 命令在输出列 name 中找到。

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

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

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

© . All rights reserved.