修改元素类型

图类型中的 节点关系元素类型 可以使用 ALTER CURRENT GRAPH TYPE ALTER 命令进行更改。在更改图类型时,只需包含需要修改的节点或关系元素类型即可。

更改图类型中的元素类型需要以下权限

设置图类型 (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),
    (:Company => {name :: STRING, address :: STRING IS UNIQUE}),
    (:Person)-[:WORKS_FOR => {role :: STRING}]->(:Company),
    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 ALTER {
    (:Robot => :Resident&Machine {application :: STRING NOT NULL, id :: INTEGER NOT NULL}), (1)
    (:Resident)-[:LIVES_IN => {since :: ANY NOT NULL}]->(:City) (2)
}
1 带有 Robot 标签的节点现在必须同时拥有 Machine 标签。Robot 节点还需要具备类型为 INTEGERid 属性。
2 LIVES_IN 关系上的 since 属性现在可以是 ANY 类型(之前被限制为 DATE 类型)。

此更改通过创建以下约束来实现

识别节点标签 约束类型 详细信息

(:Robot)

节点属性类型

id :: INTEGER

(:Robot)

节点属性存在性

id IS NOT NULL

(:Robot)

节点标签存在性

带有 Robot 标签的节点必须同时拥有 Machine 标签。

它也通过删除以下约束来实现

识别关系类型 约束类型 详细信息

()-[:LIVES_IN]->()

关系属性类型

since :: DATE

只要识别节点标签或关系类型与当前图类型中定义的相同,ALTER CURRENT GRAPH TYPE ALTER 就会将元素类型更改为更改中包含的任何内容。换句话说,对元素类型进行部分定义并不会使更改中未包含的元素类型部分保持不变。相反,它会根据指定的简化定义重新定义该元素类型。 注意,这不适用于在带有识别标签的节点或带有识别类型的关系上定义的键和属性唯一性约束;这些约束不能通过 ALTER 修改,因此将保持不变。

有关图类型实现方式的更多信息,请参阅 设置图类型 → 图类型实现:转换为约束

规则

关于 ALTER CURRENT GRAPH TYPE ALTER 命令,识别节点标签和关系类型上的键与属性唯一性约束的行为,以及非识别节点标签和关系类型上的约束行为,遵循 Neo4j 约束 的规则;它们可以被创建和删除,但不能通过单个命令进行修改(在这种情况下,必须删除并重新创建它们以适应所需的更改)。

在更改图类型时,不允许向节点或关系元素类型添加键和属性唯一性约束。它们也不能通过更改转换为另一种约束。

不允许 — 更改节点或关系元素类型以包含键约束
ALTER CURRENT GRAPH TYPE ALTER {
    (:City => {name :: STRING NOT NULL, population :: INTEGER IS KEY}) (1)
}
1 此更改无效,因为它修改了 City 节点元素类型以包含节点键约束。
不允许 — 通过将键约束转换为属性唯一性约束来更改节点或关系元素类型
ALTER CURRENT GRAPH TYPE ALTER {
(p:Person => :Resident {name :: STRING, ssn :: INTEGER})
    REQUIRE (p.name, p.ssn) IS UNIQUE (1)
}
1 此更改不被允许,因为它试图通过将节点键约束转换为属性唯一性约束来修改 Person 节点元素类型。

约束不能使用 ALTER CURRENT GRAPH TYPE ALTER 命令进行更改。

不允许 — 更改图类型中非识别关系类型上的约束
ALTER CURRENT GRAPH TYPE ALTER {
    CONSTRAINT altered_animal_id FOR (a:Animal) REQUIRE a.id IS KEY (1)
}
1 此更改不被允许,因为它试图将非识别节点标签上的属性唯一性约束转换为键约束。此外,约束的名称不能更改。