扩展图类型仅限 Cypher 25企业版Neo4j 2026.02 中引入
可以使用命令 ALTER CURRENT GRAPH TYPE ADD 来扩展图类型。此命令无法修改图类型中现有的元素,但可以向现有的图类型中添加全新的元素。
|
扩展图类型需要以下权限
|
设置图类型 (Set graph type)
ALTER CURRENT GRAPH TYPE SET {
(p:Person => :Resident {name :: STRING, ssn :: INTEGER})
REQUIRE (p.name, p.ssn) IS KEY,
(:Pet => :Resident&Animal {insuranceNumber :: INTEGER IS KEY, healthCertificate :: STRING IS UNIQUE, name :: STRING}),
(:Robot => :Resident {application :: STRING NOT NULL}),
(:City => {name :: STRING NOT NULL, population :: INTEGER}),
(:Resident)-[:LIVES_IN => {since :: DATE NOT NULL}]->(:City),
CONSTRAINT company_name FOR (c:Company) REQUIRE c.name IS KEY,
CONSTRAINT animal_id FOR (a:Animal) REQUIRE a.id IS UNIQUE,
CONSTRAINT resident_address FOR (resident:Resident) REQUIRE resident.address :: STRING
}
| 有关图类型可包含的不同元素的详细信息,请参阅 设置图类型。 |
通过添加新元素类型来扩展图类型
ALTER CURRENT GRAPH TYPE ADD {
(:Company => {name :: STRING, address :: STRING IS UNIQUE}), (1)
(:Person)-[:WORKS_FOR => {role :: STRING}]->(:Company)
}
| 1 | 此操作添加了一个节点元素类型,其标识标签也由图类型中的现有键约束 (company_name) 使用。对于最初未在标识标签上定义的属性唯一性约束和键约束,这种添加是可能的,但对于属性存在性约束和属性类型约束则不行。 |
该扩展向图类型中添加了一个节点元素类型和一个关系元素类型。它通过以下约束来实现
| 标识节点标签/关系类型 | 约束类型 | 详细信息 |
|---|---|---|
|
节点属性类型 |
|
|
节点属性类型 |
|
|
节点属性唯一性 |
|
|
关系属性类型 |
|
|
关系源标签 |
源节点必须具有标签 |
|
关系目标标签 |
目标节点必须具有标签 |
有关图类型如何实现的更多信息,请参阅 设置图类型 → 图类型实现:转换为约束。
该图类型现在包含了添加的节点和关系元素类型
当前图类型 — 包含已添加的节点和关系元素类型
(p:Person => :Resident {name :: STRING, ssn :: INTEGER})
REQUIRE (p.name, p.ssn) IS KEY,
(:Pet => :Resident&Animal {insuranceNumber :: INTEGER IS KEY, healthCertificate :: STRING IS UNIQUE, name :: STRING}),
(:Robot => Resident {application :: STRING NOT NULL}),
(:City => {name :: STRING NOT NULL, population :: INTEGER}),
(:Resident)-[:LIVES_IN => {since :: DATE NOT NULL}]->(:City),
CONSTRAINT company_name FOR (c:Company) REQUIRE c.name IS KEY,
CONSTRAINT animal_id FOR (a:Animal) REQUIRE a.id IS UNIQUE,
CONSTRAINT resident_address FOR (resident:Resident) REQUIRE resident.address :: STRING,
(:Company => {name :: STRING, address :: STRING IS UNIQUE}),
(:Person)-[:WORKS_FOR => {role :: STRING}]->(:Company)
图 1. 更新后的数据模型,显示了图类型中添加的节点元素类型和关系元素类型
无效的图类型扩展
ALTER CURRENT GRAPH TYPE ADD {
(p:Person => :Resident {name :: STRING, ssn :: INTEGER, nationality :: STRING})
REQUIRE (p.name, p.ssn) IS KEY, (1)
CONSTRAINT pet_address FOR (pet:Pet) REQUIRE pet.address IS NOT NULL, (2)
(:Animal => {type :: STRING NOT NULL}) (3)
}
| 1 | 这试图通过添加一个新属性 (nationality) 来扩展现有的 Person 节点元素类型。这是无效的。 |
| 2 | 这试图在现有图类型 (Pet) 的标识标签上添加属性类型约束。这是无效的。反之(添加一个节点或关系元素类型,且其标识标签/类型已由属性类型或属性存在性约束定义)也是不可能的。 |
| 3 | 这试图添加一个节点元素类型,其标识标签已被现有图类型 (Pet) 中某个节点元素类型的隐含标签使用。这是无效的。反之(添加一个节点元素类型,其隐含标签已被现有节点元素类型用作标识标签)也是不可能的。 |