具有两个唯一性约束的 Cypher MERGE

Cypher MERGE with two uniqueness constraints

假设我在 Cypher 中的标签 Person 上指定了两个唯一性约束:

CREATE CONSTRAINT ON Person
ASSERT name IS UNIQUE
CREATE CONSTRAINT ON Person
ASSERT id_number IS UNIQUE

如果我运行下面的MERGE命令

MERGE (p:Person {name:"Alice", id_number=153})

行为是:

我想改变 xor 的行为,这样我们就可以

知道如何在 Cypher 中实现这个吗?

如果你有一个节点是 name Alice 而另一个节点是 id_number 153,会发生什么?这是这种模式的核心哲学问题。抛开这一点,你最接近的赌注将是手动调整 MERGE 逻辑,如下所示:

OPTIONAL MATCH (p:Person)
WHERE p.name = 'Alice' or p.id_number = 153
WITH COLLECT(p) AS ps
WITH ps, CASE SIZE(ps) WHEN 0 THEN [True] ELSE [] END AS news
UNWIND news AS new
MERGE (q:Person {name: 'Alice', id_number:153})
WITH ps, COLLECT(q) AS qs
WITH COALESCE(HEAD(ps), HEAD(qs)) AS p

在您的案例中,您实际上可能不需要唯一性约束;它们经常被随便用来代替常规索引,但实际上只有在您不得不担心异步写入时才需要它们(即便如此,也可以通过其他方式进行管理)。否则,您只需要在查询编写中遵守纪律,以便使用 MERGE 而不是 CREATE 并且不要 MERGE 具有应该唯一的未绑定节点的模式。