Cypher MERGE具有两个唯一性约束

时间:2016-10-28 18:52:25

标签: merge neo4j cypher unique-constraint

假设我在Cypher中的标签f(x,y) = s[y] - (x==0 ? 0 : s[x-1]) 上指定了两个唯一性约束:

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}) Alice name 153,则会返回
  • 如果存在id_number Alice xor name 153的节点,则会出现错误,因为我们无法创建新节点并维护两者的唯一性约束
  • 如果某个节点既没有id_number Alice 也不 name 153,则会创建一个包含这些属性的新节点。

我想更改 xor 行为,以便我们执行

  • 如果有一个节点包含id_number Alice name 153,则会返回
  • 如果某个节点既没有id_number Alice 也不 name 153,则会创建一个包含这些属性的新节点。

知道如何在Cypher中实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

如果您有一个节点包含fieldsToMap Alice而另一个节点包含name 153,会发生什么?这种模式的中心哲学问题。除此之外,您最接近的赌注将是手动调整id_number逻辑,如下所示:

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模式与非唯一的未绑定节点。