具有两个唯一性约束的 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})
行为是:
- 如果有
name
爱丽丝和id_number
153的节点,则返回
- 如果有
name
Alicexorid_number
153的节点,会出现错误,因为我们无法创建新节点并维护两者唯一性约束
- 如果有一个节点既不具有
name
Alice 也不具有 id_number
153,则创建具有这些属性的新节点。
我想改变 xor 的行为,这样我们就可以
- 如果有
name
爱丽丝或id_number
153的节点,则返回
- 如果有一个节点既不具有
name
Alice 也不具有 id_number
153,则创建具有这些属性的新节点。
知道如何在 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
具有应该唯一的未绑定节点的模式。
假设我在 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})
行为是:
- 如果有
name
爱丽丝和id_number
153的节点,则返回 - 如果有
name
Alicexorid_number
153的节点,会出现错误,因为我们无法创建新节点并维护两者唯一性约束 - 如果有一个节点既不具有
name
Alice 也不具有id_number
153,则创建具有这些属性的新节点。
我想改变 xor 的行为,这样我们就可以
- 如果有
name
爱丽丝或id_number
153的节点,则返回 - 如果有一个节点既不具有
name
Alice 也不具有id_number
153,则创建具有这些属性的新节点。
知道如何在 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
具有应该唯一的未绑定节点的模式。