语法
此页面包含创建、列出和删除 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
,它将确保来自提交事务的更新在后台线程中应用。
有关更多信息,请参见 全文索引 - 创建全文索引。
向量索引
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.18 开始,向量索引有两个可用的向量索引提供程序:vector-2.0
(默认)和 vector-1.0
。有关更多信息,请参见 用于兼容性的向量索引提供程序。
有关所有向量索引设置的完整列表,请参见 向量索引配置设置。请注意,在 Neo4j 5.23 之前,OPTIONS
子句是强制性的,因为创建向量索引时需要配置 vector.dimensions
和 vector.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 查询中自动使用。要使用它们,必须调用特定的过程。它们的签名可以在下面看到。
全文索引
CALL db.index.fulltext.queryNodes(indexName :: STRING, queryString :: STRING, options = {} :: MAP)
CALL db.index.fulltext.queryRelationships(indexName :: STRING, queryString :: STRING, options = {} :: MAP)
options
映射的有效 键:值 对是
-
skip: <number> — 跳过前 N 个结果。
-
limit: <number> — 限制返回的结果数。
-
analyzer: <string> — 使用指定的分析器作为此查询的搜索分析器。
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
DROP INDEX
命令可以使用它们的名称删除所有类型的索引。可以使用 SHOW INDEXES
命令找到索引的名称,该名称在输出列 name
中给出。
DROP INDEX
命令是可选的幂等的。这意味着它的默认行为是在尝试删除同一个索引两次时抛出错误。使用 IF EXISTS
,如果索引不存在,则不会抛出错误,也不会发生任何事情。从 Neo4j 5.17 开始,将返回一个信息通知,详细说明索引不存在。
删除索引需要 DROP INDEX 权限。 |
DROP INDEX index_name [IF EXISTS]
有关更多信息,请参见 创建、显示和删除索引 → DROP INDEX。