定义模式(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 |
|---|
|
行:1 |
复合索引
复合索引是针对具有特定标签的所有节点上的多个属性所建立的索引。例如,以下语句在所有标记为 Actor 且同时具有 name 和 born 属性的节点上创建一个复合索引
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 |
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
行:2 |
|||||||||||
使用约束
约束用于确保数据符合域规则。它们可以是属性唯一性、属性存在性、属性类型或键约束。
| 约束类型 | 描述 |
|---|---|
确保组合后的属性值对于所有具有特定标签的节点或所有具有特定类型的关系都是唯一的。 |
|
确保某个属性对于所有具有特定标签的节点或所有具有特定类型的关系都存在。企业版 |
|
确保某个属性对于所有具有特定标签的节点或所有具有特定类型的关系都具有所需的属性类型。企业版 |
|
确保所有属性都存在,并且组合后的属性值对于所有具有特定标签的节点或所有具有特定类型的关系都是唯一的。企业版 |
约束可以随时添加到数据库中。建议尽早添加(甚至可以在数据库为空时添加),因为添加约束要求现有数据必须符合所添加的约束。
这是如何创建约束的示例
CREATE CONSTRAINT constraint_example_1 FOR (movie:Movie) REQUIRE movie.title IS UNIQUE
持续学习
有关索引和约束的更多信息,请参考 Cypher 文档
-
搜索性能索引 → 查看如何实现索引与主数据存储之间精确匹配的快速检索。
-
语义索引 → 阅读更多关于语义索引如何捕获数据库中数据的语义含义或上下文的信息。
-
创建、查看和删除索引 → 了解如何创建、查看和删除索引。
-
创建、查看和删除约束 → 了解如何创建、查看和删除约束。