定义模式(Schema)

本指南介绍了如何通过使用索引(indexes)和约束(constraints)来定义模式。虽然 Neo4j 通常被描述为模式可选(schema optional),但在需要时可以添加索引和约束,以优化性能或获得建模优势。

示例图

使用以下示例图来学习本指南。

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)

这是生成的图

使用索引

索引用于加速数据检索,从而提高性能。它们可以在任何时候添加。

以下查询创建了一个索引,以便更方便地在数据库中按名称查找演员

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

Cypher® 的查询规划器会自动选择适合您查询的索引。只有在极少数情况下,您才需要指定使用哪个索引。更多信息请参阅 Cypher → Cypher 规划器的索引提示

例如,以下查询会自动使用之前创建的 example_index_1

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

结果为:

actor

(:Person:Actor {born: 1956, name: "Tom Hanks"})

行:1

复合索引

复合索引是针对具有特定标签的所有节点上的多个属性所建立的索引。例如,以下语句在所有标记为 Actor 且同时具有 nameborn 属性的节点上创建一个复合索引

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

请注意,例如,如果您有一个带有 Actor 标签但未包含 born 属性的节点,则该节点不会被索引。

查看索引

您可以使用 SHOW INDEXES 来列出数据库中的索引

SHOW INDEXES

在当前的示例数据集中,结果为

id 名称 (name) state populationPercent type entityType labelsOrTypes 属性 indexProvider owningConstraint lastRead readCount

1

"index_1b9dcc97"

"ONLINE"

100.0

"LOOKUP"

"RELATIONSHIP"

null

null

"token-lookup-1.0"

null

null

0

0

"index_460996c0"

"ONLINE"

100.0

"LOOKUP"

"RELATIONSHIP"

null

null

"token-lookup-1.0"

null

null

0

行:2

使用约束

约束用于确保数据符合域规则。它们可以是属性唯一性、属性存在性、属性类型或键约束。

约束类型 描述

属性唯一性

确保组合后的属性值对于所有具有特定标签的节点或所有具有特定类型的关系都是唯一的。

属性存在性

确保某个属性对于所有具有特定标签的节点或所有具有特定类型的关系都存在。企业版

属性类型

确保某个属性对于所有具有特定标签的节点或所有具有特定类型的关系都具有所需的属性类型。企业版

确保所有属性都存在,并且组合后的属性值对于所有具有特定标签的节点或所有具有特定类型的关系都是唯一的。企业版

约束可以随时添加到数据库中。建议尽早添加(甚至可以在数据库为空时添加),因为添加约束要求现有数据必须符合所添加的约束。

这是如何创建约束的示例

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

查看约束

您可以使用 SHOW CONSTRAINTS 来查找图中的所有现有约束

SHOW CONSTRAINTS

在当前示例中,您得到的结果如下

id 名称 (name) type entityType labelsOrTypes 属性 ownedIndex propertyType

5

"constraint_example_1"

"UNIQUENESS"

"NODE"

["Movie"]

["title"]

"constraint_example_1"

null

行:1

持续学习

有关索引和约束的更多信息,请参考 Cypher 文档