定义模式
示例图
首先创建一些用于示例的数据
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
标签且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
标签的节点中必须唯一”。
此示例演示如何为具有Movie
标签和title
属性的节点创建约束。约束指定title
属性必须唯一。
添加唯一性约束将隐式地为该属性添加索引。如果约束被删除,但仍然需要索引,则必须显式创建索引。
CREATE CONSTRAINT constraint_example_1 FOR (movie:Movie) REQUIRE movie.title IS UNIQUE
Neo4j 4.4 中更改了语法,旧语法为
|
约束可以添加到已经包含数据的数据库中。这要求现有数据符合正在添加的约束。
您可以使用SHOW CONSTRAINTS
Cypher 语法查询数据库以了解定义了哪些约束。
此示例显示了一个 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 手册 → 约束中了解有关约束的更多信息。 |