假设我在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中实现这一目标吗?
答案 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
模式与非唯一的未绑定节点。