定义模式

示例图

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

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标签且name为“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 手册 → 约束中了解有关约束的更多信息。