定义模式

示例图

首先创建一些用于示例的数据

CREATE (forrestGump:Movie {title: 'Forrest Gump', released: 1994})
CREATE (robert:Person:Director {name: 'Robert Zemeckis', born: 1951})
CREATE (tom:Person:Actor {name: 'Tom Hanks', born: 1956})
CREATE (tom)-[:ACTED_IN {roles: ['Forrest']}]->(forrestGump)
CREATE (robert)-[:DIRECTED]->(forrestGump)

这是生成的图

cypher intro schema data arr

使用索引

在图数据库中使用索引的主要原因是为了找到图遍历的起点。一旦找到该起点,遍历将依赖于图内结构来实现高性能。

索引可以随时添加。

如果数据库中存在现有数据,索引上线需要一些时间。

以下查询创建了一个索引,以加快在数据库中按名称查找演员的速度

CREATE INDEX example_index_1 FOR (a:Actor) ON (a.name)

在大多数情况下,查询数据时无需指定索引,因为会自动使用适当的索引。

可以使用 索引提示 在特定查询中指定要使用的索引。这是查询调优的几个选项之一,详见 Cypher® 手册 → 查询调优

例如,以下查询将自动使用 example_index_1

MATCH (actor:Actor {name: 'Tom Hanks'})
RETURN actor

复合索引 是针对所有具有特定标签的节点的多个属性上的索引。例如,以下语句将为所有标记为 Actor 且同时具有 nameborn 属性的节点创建复合索引。请注意,由于标签为 Actor 且名称为 "Keanu Reeves" 的节点没有 born 属性。因此,该节点将不会添加到索引中。

CREATE INDEX example_index_2 FOR (a:Actor) ON (a.name, a.born)

您可以使用 SHOW INDEXES 查询数据库以找出定义了哪些索引。

SHOW INDEXES YIELD name, labelsOrTypes, properties, type
Rows: 2

+----------------------------------------------------------------+
| name              | labelsOrTypes | properties       | type    |
+----------------------------------------------------------------+
| 'example_index_1' | ['Actor']     | ['name']         | 'BTREE' |
| 'example_index_2' | ['Actor']     | ['name', 'born'] | 'BTREE' |
+----------------------------------------------------------------+

了解更多关于索引的信息,请参阅 Cypher 手册 → 索引

使用约束

约束用于确保数据符合领域规则。例如

“如果一个节点具有 Actor 标签和 name 属性,那么 name 的值在所有具有 Actor 标签的节点中必须是唯一的”。

示例 1. 唯一性约束

此示例展示了如何为具有 Movie 标签和 title 属性的节点创建约束。该约束指定 title 属性必须是唯一的。

添加唯一性约束将隐式地在该属性上添加一个索引。如果约束被删除,但仍然需要该索引,则必须显式创建该索引。

CREATE CONSTRAINT constraint_example_1 FOR (movie:Movie) REQUIRE movie.title IS UNIQUE

语法在 Neo4j 4.4 中已更改,旧语法是

CREATE CONSTRAINT constraint_example_1 ON (movie:Movie) ASSERT movie.title IS UNIQUE Deprecated

约束可以添加到已包含数据的数据库中。这要求现有数据符合正在添加的约束。

您可以使用 SHOW CONSTRAINTS Cypher 语法查询数据库以找出定义了哪些约束。

示例 2. 约束查询

此示例显示了一个 Cypher 查询,该查询返回为数据库定义的约束。

SHOW CONSTRAINTS YIELD id, name, type, entityType, labelsOrTypes, properties, ownedIndexId
Rows: 1

+-----------------------------------------------------------------------------------------------------+
| id | name                   | type         | entityType | labelsOrTypes | properties | ownedIndexId |
+-----------------------------------------------------------------------------------------------------+
| 4  | 'constraint_example_1' | 'UNIQUENESS' | 'NODE'     | ['Movie']     | ['title']  | 3            |
+-----------------------------------------------------------------------------------------------------+

上述约束适用于所有版本的 Neo4j。Neo4j 企业版提供额外的约束。

了解更多关于约束的信息,请参阅 Cypher 手册 → 约束

© . All rights reserved.