精华 Neo4j官方教程:第14节,定义模式
发布于 1 天前 作者 pangguoming 17 次浏览 来自 分享

教程目录 引自: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)

这是生成的图:

image (插入图表链接)

使用索引

在图数据库中使用索引的主要原因是找到图遍历的起点。一旦找到该起点,遍历就会依赖于图内结构来实现高性能。

  • 可以随时添加索引。
  • 如果数据库中存在现有数据,则索引联机需要一些时间。

以下查询创建一个索引,以加快在数据库中按名称查找演员的速度:

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 标签且名称为“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

回到顶部