教程目录 引自:https://neo4j.com/docs/getting-started/cypher-intro/schema/
定义模式
示例图
首先创建一些数据以用于我们的示例:
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® 手册 → 查询调优 中有详细描述。
例如,以下查询将自动使用 example_index_1:
MATCH (actor:Actor {name: 'Tom Hanks'})
RETURN actor
复合索引是针对具有特定标签的所有节点的多个属性的索引。例如,以下语句将创建一个复合索引,该索引针对所有带有 Actor
标签并且同时具有 name
和 born
属性的节点。请注意,由于带有 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 手册 → 约束 中了解有关约束的更多信息。
Similar code found with 2 license types