语法
此页面包含在 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
,它将确保来自提交事务的更新在后台线程中应用。
有关更多信息,请参见全文索引 - 创建全文索引。
向量索引
CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR (n:LabelName)
ON (n.propertyName)
[OPTIONS “{“ option: value[, …] “}”]
CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR ()-”[“r:TYPE_NAME”]”-()
ON (r.propertyName)
[OPTIONS “{“ option: value[, …] “}”]
有关所有向量索引设置的完整列表,请参见向量索引配置设置。请注意,在 Neo4j 5.23 之前,OPTIONS
子句是强制性的,因为在创建向量索引时需要配置 vector.dimensions
和 vector.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 查询中自动使用。要使用它们,必须调用特定的过程。它们的签名如下所示。
全文索引
CALL db.index.fulltext.queryNodes(indexName :: STRING, queryString :: STRING, options = {} :: MAP)
CALL db.index.fulltext.queryRelationships(indexName :: STRING, queryString :: STRING, options = {} :: MAP)
options
映射的有效 键: 值 对是
-
skip: <数字> — 跳过前 N 个结果。
-
limit: <数字> — 限制返回结果的数量。
-
analyzer: <字符串> — 使用指定的分析器作为此查询的搜索分析器。
options
映射和所有键都是可选的。
有关更多信息,请参见全文索引 - 查询全文索引。
向量索引
CALL db.index.vector.queryNodes(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: LIST<INTEGER | FLOAT>)
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。