创建、显示和删除索引

此页面描述了如何创建、列出和删除搜索性能索引。以下索引类型包含在此类别中

有关如何在 Cypher® 查询中使用搜索性能索引的信息,请参阅使用搜索性能索引

CREATE INDEX

创建索引使用CREATE …​ INDEX …​命令完成。如果在创建命令中未指定索引类型,则将创建范围索引

最佳实践是在创建索引时为其命名。如果未显式命名索引,则会获得自动生成的名称。

索引名称在索引和约束之间必须唯一。

CREATE INDEX命令可以选择性地幂等。这意味着其默认行为是在尝试创建相同的索引两次时抛出错误。如果将IF NOT EXISTS附加到命令,则不会抛出错误,并且如果已存在具有相同名称或相同模式和索引类型的索引,则不会发生任何事情。如果存在冲突的约束,例如具有相同名称或模式和后备索引类型的约束,它仍可能会抛出错误。从 Neo4j 5.17 开始,将返回一个信息通知,显示阻止创建的现有索引。

可以使用OPTIONS子句指定索引提供程序和配置设置。[1]

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

创建索引需要CREATE INDEX权限

新创建的索引不会立即可用,而是在后台创建。

创建范围索引

可以使用CREATE INDEX命令创建范围索引。请注意,索引名称必须唯一。

范围索引只有一个可用的索引提供程序,range-1.0,并且没有支持的索引配置。

支持的谓词

范围索引支持大多数类型的谓词

谓词 语法

相等性检查。

n.prop = value

列表成员资格检查。

n.prop IN list

存在性检查。

n.prop IS NOT NULL

范围搜索。

n.prop > value

前缀搜索。

STARTS WITH

示例

为节点创建单属性范围索引

以下语句将在所有标记为Person且具有surname属性的节点上创建一个名为范围索引。

在单个属性上创建节点范围索引
CREATE INDEX node_range_index_name FOR (n:Person) ON (n.surname)
为关系创建单属性范围索引

以下语句将在所有具有关系类型KNOWS和属性since的关系上创建一个名为范围索引。

在单个属性上创建关系范围索引
CREATE INDEX rel_range_index_name FOR ()-[r:KNOWS]-() ON (r.since)
为节点创建复合范围索引

在多个属性上的范围索引也称为复合索引。对于节点范围索引,只有具有指定标签并包含所有指定属性的节点才会添加到索引中。

以下语句将在所有标记为Person且同时具有agecountry属性的节点上创建一个名为复合范围索引。

在多个属性上创建复合节点范围索引
CREATE INDEX composite_range_node_index_name FOR (n:Person) ON (n.age, n.country)
为关系创建复合范围索引

在多个属性上的范围索引也称为复合索引。对于关系范围索引,只有具有指定类型并包含所有指定属性的关系才会添加到索引中。

以下语句将在所有标记为PURCHASED且同时具有dateamount属性的关系上创建一个名为复合范围索引。

在多个属性上创建复合关系范围索引

CREATE INDEX composite_range_rel_index_name FOR ()-[r:PURCHASED]-() ON (r.date, r.amount)
使用参数创建范围索引

此功能在 Neo4j 5.16 中引入。

以下语句将在所有具有 Person 标签和 firstname 属性的节点上创建一个命名范围索引,并使用参数指定索引名称。

参数
{
  "name": "range_index_param"
}
在单个属性上创建节点范围索引
CREATE INDEX $name FOR (n:Person) ON (n.firstname)
仅当范围索引不存在时创建它

如果不确定索引是否存在,请添加 IF NOT EXISTS 以确保其存在。

使用 IF NOT EXISTS 创建范围索引
CREATE INDEX node_range_index_name IF NOT EXISTS
FOR (n:Person) ON (n.surname)

如果已经存在具有相同模式和类型、相同名称或两者兼有的索引,则不会创建该索引。从 Neo4j 5.17 开始,将返回信息通知。

通知
`CREATE RANGE INDEX node_range_index_name IF NOT EXISTS FOR (e:Person) ON (e.surname)` has no effect.
`RANGE INDEX node_range_index_name FOR (e:Person) ON (e.surname)` already exists.

创建文本索引

可以使用 CREATE TEXT INDEX 命令创建文本索引。请注意,索引名称必须唯一。

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

支持的谓词

文本索引仅解决对 STRING 值进行操作的谓词。

以下仅对 STRING 值进行操作的谓词始终可以通过文本索引解决

  • STARTS WITH

  • ENDS WITH

  • CONTAINS

但是,只有在已知属性与 STRING 进行比较时,才会使用其他谓词

  • n.prop = "string"

  • n.prop IN ["a", "b", "c"]

这意味着文本索引无法解决例如 a.prop = b.prop,除非该属性上也存在属性类型约束

文本索引支持以下谓词

谓词 语法

相等性检查。

n.prop = 'example_string'

列表成员资格检查。

n.prop IN ['abc', 'example_string', 'neo4j']

前缀搜索。

STARTS WITH

后缀搜索。

ENDS WITH

子字符串搜索。

CONTAINS

从 Neo4j 5.11 开始,可以通过使用属性类型约束来扩展上述谓词集。有关更多信息,请参阅有关索引兼容性和属性类型约束的部分。

文本索引仅用于精确查询匹配。要执行近似匹配(包括例如变体和错字),以及计算 STRING 值之间的相似度分数,请改用语义全文索引

示例

创建节点文本索引

以下语句将在所有标记为 Person 且具有 nickname STRING 属性的节点上创建命名文本索引。

在单个属性上创建节点文本索引
CREATE TEXT INDEX node_text_index_nickname FOR (n:Person) ON (n.nickname)
创建关系文本索引

以下语句将在所有具有关系类型 KNOWSSTRING 属性 interest 的关系上创建命名文本索引。

在单个属性上创建关系文本索引
CREATE TEXT INDEX rel_text_index_name FOR ()-[r:KNOWS]-() ON (r.interest)
使用参数创建文本索引

此功能在 Neo4j 5.16 中引入。

以下语句将在所有具有 Person 标签和 favoriteColor STRING 属性的节点上创建命名文本索引,并使用参数指定索引名称。

参数
{
  "name": "text_index_param"
}
在单个属性上创建节点文本索引
CREATE TEXT INDEX $name FOR (n:Person) ON (n.favoriteColor)
仅当文本索引不存在时创建它

如果不确定索引是否存在,请添加 IF NOT EXISTS 以确保其存在。

以下语句将尝试在所有标记为 Person 且具有 nickname STRING 属性的节点上创建命名文本索引。

使用 IF NOT EXISTS 创建文本索引
CREATE TEXT INDEX node_index_name IF NOT EXISTS FOR (n:Person) ON (n.nickname)

请注意,如果已经存在具有相同模式和类型、相同名称或两者兼有的索引,则不会创建该索引。从 Neo4j 5.17 开始,将返回信息通知。

通知
`CREATE TEXT INDEX node_index_name IF NOT EXISTS FOR (e:Person) ON (e.nickname)` has no effect.
`TEXT INDEX node_text_index_nickname FOR (e:Person) ON (e.nickname)` already exists.
指定索引提供程序创建文本索引

要使用特定索引提供程序创建文本索引,请使用 OPTIONS 子句。索引提供程序的有效值为 text-2.0text-1.0(已弃用)。默认提供程序为 text-2.0

使用索引提供程序创建文本索引
CREATE TEXT INDEX text_index_with_indexprovider FOR ()-[r:TYPE]-() ON (r.prop1)
OPTIONS {indexProvider: 'text-2.0'}

文本索引没有支持的索引配置。

创建点索引

可以使用 CREATE POINT INDEX 命令创建点索引。请注意,索引名称必须唯一。

点索引具有支持的索引配置,但只有一个可用的索引提供程序,point-1.0

支持的谓词

点索引仅解决对 POINT 值进行操作的谓词。

点索引支持以下谓词

谓词 语法

属性点值。

n.prop = point({x: value, y: value})

在边界框内。

point.withinBBox(n.prop, lowerLeftCorner, upperRightCorner)

距离。

point.distance(n.prop, center) < = distance

从 Neo4j 5.11 开始,可以通过使用属性类型约束来扩展上述谓词集。有关更多信息,请参阅索引兼容性和属性类型约束

要了解有关 Cypher 支持的空间数据类型的更多信息,请参阅有关空间值的页面。

示例

创建节点点索引

以下语句将在所有标记为 Person 且具有 sublocation POINT 属性的节点上创建命名点索引。

在单个属性上创建节点点索引
CREATE POINT INDEX node_point_index_name FOR (n:Person) ON (n.sublocation)
创建关系点索引

以下语句将在所有具有关系类型 STREETPOINT 属性 intersection 的关系上创建命名点索引。

在单个属性上创建关系点索引
CREATE POINT INDEX rel_point_index_name FOR ()-[r:STREET]-() ON (r.intersection)
使用参数创建点索引

此功能在 Neo4j 5.16 中引入。

以下语句将在所有具有关系类型 STREETPOINT 属性 coordinate 的关系上创建命名点索引,并使用参数指定索引名称。

参数
{
  "name": "point_index_param"
}
在单个属性上创建关系点索引
CREATE POINT INDEX $name FOR ()-[r:STREET]-() ON (r.coordinate)
仅当点索引不存在时创建它

如果不确定索引是否存在,请添加 IF NOT EXISTS 以确保其存在。

使用 IF NOT EXISTS 创建点索引
CREATE POINT INDEX node_point_index IF NOT EXISTS
FOR (n:Person) ON (n.sublocation)

请注意,如果已经存在具有相同模式和类型、相同名称或两者兼有的索引,则不会创建该索引。从 Neo4j 5.17 开始,将返回信息通知。

通知
`CREATE POINT INDEX node_point_index IF NOT EXISTS FOR (e:Person) ON (e.sublocation)` has no effect.
`POINT INDEX node_point_index_name FOR (e:Person) ON (e.sublocation)` already exists.
指定索引配置创建点索引

要使用特定索引配置创建点索引,请在 OPTIONS 子句中使用 indexConfig 设置。有效的配置设置是

  • spatial.cartesian.min(默认值:[-1000000.0-1000000.0])

  • spatial.cartesian.max(默认值:[1000000.01000000.0])

  • spatial.cartesian-3d.min(默认值:[-1000000.0-1000000.0-1000000.0])

  • spatial.cartesian-3d.max(默认值:[1000000.01000000.01000000.0`])

  • spatial.wgs-84.min(默认值:[-180.0-90.0])

  • spatial.wgs-84.max(默认值:[-180.0-90.0])

  • spatial.wgs-84-3d.min(默认值:[-180.0-90.0-1000000.0])

  • spatial.wgs-84-3d.max(默认值:[180.090.01000000.0])

以下语句将创建一个指定 spatial.cartesian.minspatial.cartesian.max 设置的点索引。

使用索引配置创建点索引
CREATE POINT INDEX point_index_with_config
FOR (n:Label) ON (n.prop2)
OPTIONS {
  indexConfig: {
    `spatial.cartesian.min`: [-100.0, -100.0],
    `spatial.cartesian.max`: [100.0, 100.0]
  }
}

请注意,本例中未指定的 wgs-84 和 3D cartesian 设置将设置为其各自的默认值。

创建令牌查找索引

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

如果已删除令牌查找索引,则可以使用 CREATE LOOKUP INDEX 命令重新创建它。请注意,索引名称必须唯一。

令牌查找索引只有一个可用的索引提供程序,token-lookup-1.0,并且没有支持的索引配置。

支持的谓词

令牌查找索引默认存在,并且仅解决节点标签和关系类型谓词

谓词 语法(示例)

节点标签谓词。

MATCH (n:Label)
MATCH (n)
WHERE n:Label

关系类型谓词。

MATCH ()-[r:REL]->()
MATCH ()-[r]->()
WHERE r:REL

令牌查找索引可以提高 Cypher 查询的性能以及其他索引的填充速度。删除这些索引可能会导致严重的性能下降。

示例

创建节点标签查找索引

以下语句将在所有具有一个或多个标签的节点上创建命名节点标签查找索引

创建节点标签查找索引
CREATE LOOKUP INDEX node_label_lookup_index FOR (n) ON EACH labels(n)

一次只能存在一个节点标签查找索引。

创建关系类型查找索引

以下语句将在所有具有任何关系类型的关系上创建命名关系类型查找索引。

创建关系类型查找索引
CREATE LOOKUP INDEX rel_type_lookup_index FOR ()-[r]-() ON EACH type(r)

一次只能存在一个关系类型查找索引。

仅当令牌查找索引不存在时创建它

如果不确定索引是否存在,请添加 IF NOT EXISTS 以确保其存在。

使用 IF NOT EXISTS 创建节点标签查找索引
CREATE LOOKUP INDEX node_label_lookup IF NOT EXISTS FOR (n) ON EACH labels(n)

如果已经存在具有相同模式和类型、相同名称或两者兼有的索引,则不会创建该索引。从 Neo4j 5.17 开始,将返回信息通知。

通知
`CREATE LOOKUP INDEX node_label_lookup IF NOT EXISTS FOR (e) ON EACH labels(e)` has no effect.
`LOOKUP INDEX node_label_lookup_index FOR (e) ON EACH labels(e)` already exists.

存在冲突索引或约束时创建索引

无法创建已存在的索引

在具有 Book 标签的节点上为属性 title 创建索引,而该索引已存在。

创建重复索引
CREATE INDEX bookTitleIndex FOR (book:Book) ON (book.title)

在这种情况下,无法创建索引,因为它已经存在。

错误消息
There already exists an index (:Book {title}).

在创建索引时使用 IF NOT EXISTS 将不会导致错误,也不会创建新索引。

无法创建与已存在的索引同名的索引

在具有 Book 标签的节点上为属性 numberOfPages 创建命名索引,而具有给定名称的索引已存在。现有索引的索引类型无关紧要。

创建具有重复名称的索引
CREATE INDEX indexOnBooks FOR (book:Book) ON (book.numberOfPages)

在这种情况下,无法创建索引,因为已经存在具有给定名称的索引。

错误消息
There already exists an index called 'indexOnBooks'.

在创建索引时使用 IF NOT EXISTS 将不会导致错误,也不会创建新索引。

存在约束时无法创建索引

在具有 Book 标签的节点上为属性 isbn 创建索引,而该模式上已存在索引支持的约束。这仅与范围索引相关。

在与现有索引支持的约束相同的模式上创建范围索引
CREATE INDEX bookIsbnIndex FOR (book:Book) ON (book.isbn)

在这种情况下,无法创建索引,因为在该标签和属性组合上已存在索引支持的约束。

错误消息
There is a uniqueness constraint on (:Book {isbn}), so an index is already created that matches this.

无法创建与已存在的约束同名的索引

在具有 Book 标签的节点上为属性 numberOfPages 创建命名索引,而具有给定名称的约束已存在。

创建与现有约束同名的索引
CREATE INDEX bookRecommendations FOR (book:Book) ON (book.recommendations)

在这种情况下,无法创建索引,因为已经存在具有给定名称的约束。

错误消息
There already exists a constraint called 'bookRecommendations'.

SHOW INDEXES

可以使用 SHOW INDEXES 列出索引。

列出索引需要SHOW INDEX 权限

示例

列出所有索引

要列出所有具有默认输出列的索引,可以使用 SHOW INDEXES 命令。如果需要所有列,请使用 SHOW INDEXES YIELD *

显示所有索引
SHOW INDEXES
结果
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | name                              | state    | populationPercent | type     | entityType     | labelsOrTypes | properties         | indexProvider      | owningConstraint | lastRead                 | readCount |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 3  | "composite_range_node_index_name" | "ONLINE" | 100.0             | "RANGE"  | "NODE"         | ["Person"]    | ["age", "country"] | "range-1.0"        | NULL             | NULL                     | 0         |
| 4  | "composite_range_rel_index_name"  | "ONLINE" | 100.0             | "RANGE"  | "RELATIONSHIP" | ["PURCHASED"] | ["date", "amount"] | "range-1.0"        | NULL             | 2023-03-13T11:41:44.537Z | 1         |
| 16 | "example_index"                   | "ONLINE" | 100.0             | "RANGE"  | "NODE"         | ["Book"]      | ["title"]          | "range-1.0"        | NULL             | 2023-04-10T15:41:44.537Z | 2         |
| 17 | "indexOnBooks"                    | "ONLINE" | 100.0             | "TEXT"   | "NODE"         | ["Label1"]    | ["prop1"]          | "text-2.0"         | NULL             | NULL                     | 0         |
| 14 | "node_label_lookup_index"         | "ONLINE" | 100.0             | "LOOKUP" | "NODE"         | NULL          | NULL               | "token-lookup-1.0" | NULL             | 2023-04-13T08:11:15.537Z | 10        |
| 10 | "node_point_index_name"           | "ONLINE" | 100.0             | "POINT"  | "NODE"         | ["Person"]    | ["sublocation"]    | "point-1.0"        | NULL             | 2023-04-05T16:21:44.692Z | 1         |
| 1  | "node_range_index_name"           | "ONLINE" | 100.0             | "RANGE"  | "NODE"         | ["Person"]    | ["surname"]        | "range-1.0"        | NULL             | 2022-12-30T02:01:44.537Z | 6         |
| 6  | "node_text_index_nickname"        | "ONLINE" | 100.0             | "TEXT"   | "NODE"         | ["Person"]    | ["nickname"]       | "text-2.0"         | NULL             | 2023-04-13T11:41:44.537Z | 2         |
| 12 | "point_index_param"               | "ONLINE" | 100.0             | "POINT"  | "RELATIONSHIP" | ["STREET"]    | ["coordinate"]     | "point-1.0"        | NULL             | NULL                     | 0         |
| 13 | "point_index_with_config"         | "ONLINE" | 100.0             | "POINT"  | "NODE"         | ["Label"]     | ["prop2"]          | "point-1.0"        | NULL             | NULL                     | 0         |
| 5  | "range_index_param"               | "ONLINE" | 100.0             | "RANGE"  | "NODE"         | ["Person"]    | ["firstname"]      | "range-1.0"        | NULL             | 2023-12-13T08:23:53.338Z | 2         |
| 11 | "rel_point_index_name"            | "ONLINE" | 100.0             | "POINT"  | "RELATIONSHIP" | ["STREET"]    | ["intersection"]   | "point-1.0"        | NULL             | 2023-03-03T13:37:42.537Z | 2         |
| 2  | "rel_range_index_name"            | "ONLINE" | 100.0             | "RANGE"  | "RELATIONSHIP" | ["KNOWS"]     | ["since"]          | "range-1.0"        | NULL             | 2023-04-12T10:41:44.692Z | 5         |
| 7  | "rel_text_index_name"             | "ONLINE" | 100.0             | "TEXT"   | "RELATIONSHIP" | ["KNOWS"]     | ["interest"]       | "text-2.0"         | NULL             | 2023-04-01T10:40:44.537Z | 3         |
| 15 | "rel_type_lookup_index"           | "ONLINE" | 100.0             | "LOOKUP" | "RELATIONSHIP" | NULL          | NULL               | "token-lookup-1.0" | NULL             | 2023-04-12T21:41:44.537Z | 7         |
| 8  | "text_index_param"                | "ONLINE" | 100.0             | "TEXT"   | "NODE"         | ["Person"]    | ["favoriteColor"]  | "text-2.0"         | NULL             | NULL                     | 0         |
| 9  | "text_index_with_indexprovider"   | "ONLINE" | 100.0             | "TEXT"   | "RELATIONSHIP" | ["TYPE"]      | ["prop1"]          | "text-2.0"         | NULL             | NULL                     | 0         |
| 18 | "uniqueBookIsbn"                  | "ONLINE" | 100.0             | "RANGE"  | "NODE"         | ["Book"]      | ["isbn"]           | "range-1.0"        | "uniqueBookIsbn" | 2023-04-13T11:41:44.692Z | 6         |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
18 rows

SHOW INDEXES 的输出列之一是索引的名称。这可用于使用DROP INDEX 命令删除索引。

列出特定列

可以使用 YIELD 子句仅返回可用索引的特定列

返回所有索引的特定列
SHOW INDEXES
YIELD name, type, indexProvider AS provider, options, createStatement
RETURN name, type, provider, options.indexConfig AS config, createStatement
结果
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| name                              | type     | provider           | config                                                                                                                                                                                                                                                                                                                                                                                                                     | createStatement                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "composite_range_node_index_name" | "RANGE"  | "range-1.0"        | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE RANGE INDEX `composite_range_node_index_name` FOR (n:`Person`) ON (n.`age`, n.`country`)"                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| "composite_range_rel_index_name"  | "RANGE"  | "range-1.0"        | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE RANGE INDEX `composite_range_rel_index_name` FOR ()-[r:`PURCHASED`]-() ON (r.`date`, r.`amount`)"                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| "example_index"                   | "RANGE"  | "range-1.0"        | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE RANGE INDEX `example_index` FOR (n:`Book`) ON (n.`title`)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| "indexOnBooks"                    | "TEXT"   | "text-2.0"         | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE TEXT INDEX `indexOnBooks` FOR (n:`Label1`) ON (n.`prop1`) OPTIONS {indexConfig: {}, indexProvider: 'text-2.0'}"                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| "index_343aff4e"                  | "LOOKUP" | "token-lookup-1.0" | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE LOOKUP INDEX `index_343aff4e` FOR (n) ON EACH labels(n)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| "index_f7700477"                  | "LOOKUP" | "token-lookup-1.0" | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE LOOKUP INDEX `index_f7700477` FOR ()-[r]-() ON EACH type(r)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| "node_point_index_name"           | "POINT"  | "point-1.0"        | {`spatial.cartesian.min`: [-1000000.0, -1000000.0], `spatial.wgs-84.min`: [-180.0, -90.0], `spatial.wgs-84.max`: [180.0, 90.0], `spatial.cartesian.max`: [1000000.0, 1000000.0], `spatial.wgs-84-3d.max`: [180.0, 90.0, 1000000.0], `spatial.cartesian-3d.min`: [-1000000.0, -1000000.0, -1000000.0], `spatial.cartesian-3d.max`: [1000000.0, 1000000.0, 1000000.0], `spatial.wgs-84-3d.min`: [-180.0, -90.0, -1000000.0]} | "CREATE POINT INDEX `node_point_index_name` FOR (n:`Person`) ON (n.`sublocation`) OPTIONS {indexConfig: {`spatial.cartesian-3d.max`: [1000000.0, 1000000.0, 1000000.0],`spatial.cartesian-3d.min`: [-1000000.0, -1000000.0, -1000000.0],`spatial.cartesian.max`: [1000000.0, 1000000.0],`spatial.cartesian.min`: [-1000000.0, -1000000.0],`spatial.wgs-84-3d.max`: [180.0, 90.0, 1000000.0],`spatial.wgs-84-3d.min`: [-180.0, -90.0, -1000000.0],`spatial.wgs-84.max`: [180.0, 90.0],`spatial.wgs-84.min`: [-180.0, -90.0]}, indexProvider: 'point-1.0'}"       |
| "node_range_index"                | "RANGE"  | "range-1.0"        | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE RANGE INDEX `node_range_index` FOR (n:`Person`) ON (n.`surname`)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| "node_text_index_nickname"        | "TEXT"   | "text-2.0"         | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE TEXT INDEX `node_text_index_nickname` FOR (n:`Person`) ON (n.`nickname`) OPTIONS {indexConfig: {}, indexProvider: 'text-2.0'}"                                                                                                                                                                                                                                                                                                                                                                                                                          |
| "point_index_with_config"         | "POINT"  | "point-1.0"        | {`spatial.cartesian.min`: [-100.0, -100.0], `spatial.wgs-84.min`: [-180.0, -90.0], `spatial.wgs-84.max`: [180.0, 90.0], `spatial.cartesian.max`: [100.0, 100.0], `spatial.wgs-84-3d.max`: [180.0, 90.0, 1000000.0], `spatial.cartesian-3d.min`: [-1000000.0, -1000000.0, -1000000.0], `spatial.cartesian-3d.max`: [1000000.0, 1000000.0, 1000000.0], `spatial.wgs-84-3d.min`: [-180.0, -90.0, -1000000.0]}                 | "CREATE POINT INDEX `point_index_with_config` FOR (n:`Label`) ON (n.`prop2`) OPTIONS {indexConfig: {`spatial.cartesian-3d.max`: [1000000.0, 1000000.0, 1000000.0],`spatial.cartesian-3d.min`: [-1000000.0, -1000000.0, -1000000.0],`spatial.cartesian.max`: [100.0, 100.0],`spatial.cartesian.min`: [-100.0, -100.0],`spatial.wgs-84-3d.max`: [180.0, 90.0, 1000000.0],`spatial.wgs-84-3d.min`: [-180.0, -90.0, -1000000.0],`spatial.wgs-84.max`: [180.0, 90.0],`spatial.wgs-84.min`: [-180.0, -90.0]}, indexProvider: 'point-1.0'}"                            |
| "rel_point_index_name"            | "POINT"  | "point-1.0"        | {`spatial.cartesian.min`: [-1000000.0, -1000000.0], `spatial.wgs-84.min`: [-180.0, -90.0], `spatial.wgs-84.max`: [180.0, 90.0], `spatial.cartesian.max`: [1000000.0, 1000000.0], `spatial.wgs-84-3d.max`: [180.0, 90.0, 1000000.0], `spatial.cartesian-3d.min`: [-1000000.0, -1000000.0, -1000000.0], `spatial.cartesian-3d.max`: [1000000.0, 1000000.0, 1000000.0], `spatial.wgs-84-3d.min`: [-180.0, -90.0, -1000000.0]} | "CREATE POINT INDEX `rel_point_index_name` FOR ()-[r:`STREET`]-() ON (r.`intersection`) OPTIONS {indexConfig: {`spatial.cartesian-3d.max`: [1000000.0, 1000000.0, 1000000.0],`spatial.cartesian-3d.min`: [-1000000.0, -1000000.0, -1000000.0],`spatial.cartesian.max`: [1000000.0, 1000000.0],`spatial.cartesian.min`: [-1000000.0, -1000000.0],`spatial.wgs-84-3d.max`: [180.0, 90.0, 1000000.0],`spatial.wgs-84-3d.min`: [-180.0, -90.0, -1000000.0],`spatial.wgs-84.max`: [180.0, 90.0],`spatial.wgs-84.min`: [-180.0, -90.0]}, indexProvider: 'point-1.0'}" |
| "rel_range_index_name"            | "RANGE"  | "range-1.0"        | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE RANGE INDEX `rel_range_index_name` FOR ()-[r:`KNOWS`]-() ON (r.`since`)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| "rel_text_index_name"             | "TEXT"   | "text-2.0"         | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE TEXT INDEX `rel_text_index_name` FOR ()-[r:`KNOWS`]-() ON (r.`interest`) OPTIONS {indexConfig: {}, indexProvider: 'text-2.0'}"                                                                                                                                                                                                                                                                                                                                                                                                                          |
| "text_index_with_indexprovider"   | "TEXT"   | "text-2.0"         | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE TEXT INDEX `text_index_with_indexprovider` FOR ()-[r:`TYPE`]-() ON (r.`prop1`) OPTIONS {indexConfig: {}, indexProvider: 'text-2.0'}"                                                                                                                                                                                                                                                                                                                                                                                                                    |
| "uniqueBookIsbn"                  | "RANGE"  | "range-1.0"        | {}                                                                                                                                                                                                                                                                                                                                                                                                                         | "CREATE CONSTRAINT `uniqueBookIsbn` FOR (n:`Book`) REQUIRE (n.`isbn`) IS UNIQUE OPTIONS {indexConfig: {}, indexProvider: 'range-1.0'}"                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

请注意,如果使用 RETURN 子句,则 YIELD 是必需的。但是,当使用 YIELD 子句时,RETURN 不是必需的。

使用过滤条件列出索引

SHOW INDEX 命令可以通过多种方式进行过滤。

例如,要仅显示范围索引,请使用 SHOW RANGE INDEXES

另一种更灵活的过滤输出方法是使用 WHERE 子句。例如,仅显示不属于约束的索引。

要仅显示不属于约束的范围索引,我们可以组合过滤版本。

显示范围索引
SHOW RANGE INDEXES WHERE owningConstraint IS NULL
结果
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | name                              | state    | populationPercent | type    | entityType     | labelsOrTypes | properties         | indexProvider | owningConstraint | lastRead                 | readCount |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 3  | "composite_range_node_index_name" | "ONLINE" | 100.0             | "RANGE" | "NODE"         | ["Person"]    | ["age", "country"] | "range-1.0"   | NULL             | NULL                     | 0         |
| 4  | "composite_range_rel_index_name"  | "ONLINE" | 100.0             | "RANGE" | "RELATIONSHIP" | ["PURCHASED"] | ["date", "amount"] | "range-1.0"   | NULL             | 2023-03-13T11:41:44.537Z | 1         |
| 16 | "example_index"                   | "ONLINE" | 100.0             | "RANGE" | "NODE"         | ["Book"]      | ["title"]          | "range-1.0"   | NULL             | 2023-04-10T15:41:44.537Z | 2         |
| 1  | "node_range_index_name"           | "ONLINE" | 100.0             | "RANGE" | "NODE"         | ["Person"]    | ["surname"]        | "range-1.0"   | NULL             | 2022-12-30T02:01:44.537Z | 6         |
| 5  | "range_index_param"               | "ONLINE" | 100.0             | "RANGE" | "NODE"         | ["Person"]    | ["firstname"]      | "range-1.0"   | NULL             | 2023-12-13T08:23:53.338Z | 2         |
| 2  | "rel_range_index_name"            | "ONLINE" | 100.0             | "RANGE" | "RELATIONSHIP" | ["KNOWS"]     | ["since"]          | "range-1.0"   | NULL             | 2023-04-12T10:41:44.692Z | 5         |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
6 rows

这将仅返回默认输出列。

要获取所有列,请使用

SHOW RANGE INDEXES YIELD * WHERE owningConstraint IS NULL

列出索引的结果列

下表包含了 SHOW INDEXES YIELD * 命令返回的所有列的完整信息。

表 1. 列出索引输出
列名 描述 类型

id

索引的 ID。默认输出

INTEGER

name

索引名称(由用户显式设置或自动分配)。默认输出

STRING

state

索引的当前状态。默认输出

STRING

populationPercent

索引填充率的百分比。默认输出

FLOAT

type

此索引的 IndexType(FULLTEXTLOOKUPPOINTRANGETEXT)。默认输出

STRING

entityType

此索引表示的实体类型(节点或关系)。默认输出

STRING

labelsOrTypes

此索引的标签或关系类型。默认输出

LIST<STRING>

properties

此索引的属性。默认输出

LIST<STRING>

indexProvider

此索引的索引提供程序。默认输出

STRING

owningConstraint

索引关联的约束名称,如果索引未关联任何约束,则为 null默认输出

STRING

lastRead

上次使用索引进行读取的时间。如果自 trackedSince 以来未读取过索引,或者未跟踪统计信息,则返回 null默认输出 在 5.8 版本中引入

ZONED DATETIME

readCount

trackedSince 以来对此索引发出的读取查询次数,或者如果未跟踪统计信息,则为 null默认输出 在 5.8 版本中引入

INTEGER

trackedSince

此索引的用量统计信息跟踪开始时间,如果未跟踪统计信息,则为 null在 5.8 版本中引入

ZONED DATETIME

options

OPTIONS 映射中检索到的有关索引的提供程序和配置设置的信息。如果在创建索引时既未指定提供程序也未指定配置设置,则此列将返回默认值。

MAP

failureMessage

失败索引的错误描述。

STRING

createStatement

用于创建索引的语句。

STRING

删除索引

可以使用 DROP INDEX index_name 命令以及索引名称删除(移除)索引。此命令可以删除任何类型的索引,但支持约束的索引除外。可以使用 SHOW INDEXES 命令 在输出列 name 中找到索引名称。

DROP INDEX index_name [IF EXISTS]

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

删除索引需要 DROP INDEX 权限

示例

删除索引

以下语句将尝试删除名为 example_index 的索引。

删除索引
DROP INDEX example_index

如果存在具有该名称的索引,则将其删除,否则命令将失败。

使用参数删除索引

此功能在 Neo4j 5.16 中引入。

以下语句将尝试使用索引名称的参数删除名为 range_index_param 的索引。

参数
{
  "name": "range_index_param"
}
删除索引
DROP INDEX $name

如果存在具有该名称的索引,则将其删除,否则命令将失败。

删除支持约束的索引失败

无法删除支持约束的索引。

删除支持约束的索引
DROP INDEX uniqueBookIsbn
错误消息
Unable to drop index: Index belongs to constraint: `uniqueBookIsbn`

删除支持约束的索引也将删除支持的索引。有关更多信息,请参阅 按名称删除约束

删除不存在的索引

如果不确定索引是否存在,并且希望在存在时删除它,但在不存在时不希望得到错误,请使用 IF EXISTS

以下语句将尝试删除名为 missing_index_name 的索引。

使用 IF EXISTS 删除索引
DROP INDEX missing_index_name IF EXISTS

如果存在具有该名称的索引,则将其删除,否则命令将不执行任何操作。从 Neo4j 5.17 开始,此外还会返回一个信息通知。

通知
`DROP INDEX missing_index_name IF EXISTS` has no effect. `missing_index_name` does not exist.

1. 索引提供程序本质上是同一索引类型的不同实现。不同的提供程序仅适用于 文本索引