
3.3.13 CREATE UNIQUE语句
CREATE UNIQUE语句相当于MATCH和CREATE的混合体—尽可能地匹配,然后创建未匹配到的。
提示:可能会想到用MERGE来代替CREATE UNIQUE,然而MERGE并不能很强地保证关系的唯一性。
3.3.13.1 简介
CREATE UNIQUE介于MATCH和CREATE之间,其作用是匹配所能匹配得上的,创建不存在的。CREATE UNIQUE尽可能地减少对图的改变,充分利用已有的图。与MATCH的另外一个不同是,CREATE UNIQUE假设模式是唯一性的,如果有多个匹配的子图可以找到,则此时将会报错。
CREATE UNIQUE图例如图3-16所示。

图3-16 CREATE UNIQUE图例
3.3.13.2 创建唯一节点
1.创建未匹配到的节点
如果模式描述的节点未匹配到,则创建一个新节点。
查询:

root节点没有任何LOVES关系。因此,创建了一个节点及其与root节点的LOVES关系。
结果:

2.用含值的模式创建节点
描述的模式可以在节点中包含值,语法为prop: <expression>。
查询:

没有与root节点相连的name为D的节点,所以创建一个新的节点来匹配该模式。
结果:

3.创建未匹配到带标签的节点
如果描述的模式需要一个带标签的节点,而数据库中没有带给定标签的节点,Cypher将创建一个新的节点。
查询:

与A节点相连的KNOWS关系有一个C节点,但C节点没有blue标签,那么将创建一个带有blue标签的节点和从A到它的KNOWS关系。
结果:

3.3.13.3 创建唯一关系
1.创建未匹配到的关系
CREATE UNIQUE用于描述应该被找到的或需要创建的模式。
查询:

匹配一个左节点和两个右节点之间的关系。其中一个关系已存在,因此能匹配到,然后创建了不存在的关系。
结果:

2.用含值的模式创建关系
创建模式中含值的关系。
查询:

本例中希望关系有一个值,因为没有这样的关系匹配到,因此创建了一个新节点和关系。注意,因为不关心创建的节点,所以没有对该节点命名。
结果:

3.3.13.4 描述复杂模式
就像MATCH和CREATE语句一样,CREATE UNIQUE描述的模式也可以用逗号分隔。
查询:

本例中的模式使用了两条用逗号分隔的路径。
结果:
