Merge 具有两个唯一性约束的密码合并

Merge 具有两个唯一性约束的密码合并,merge,neo4j,cypher,unique-constraint,Merge,Neo4j,Cypher,Unique Constraint,假设我在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}) 这种行为是: 如果有一个节点具有名称Alice和id\u编号153,则返回该节点 如果有一个节

假设我在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})
这种行为是:

  • 如果有一个节点具有
    名称
    Alice
    id\u编号
    153,则返回该节点
  • 如果有一个节点具有
    名称
    Alicexor
    id\u编号
    153,则会出现错误,因为我们无法创建新节点并维护这两个唯一性约束
  • 如果有一个节点既没有
    名称
    Alice也没有
    id\u编号
    153,则将使用这些属性创建一个新节点
我想改变异或的行为,这样我们就可以

  • 如果有一个节点具有
    名称
    Alice
    id\u编号
    153,则返回该节点
  • 如果有一个节点既没有
    名称
    Alice也没有
    id\u编号
    153,则将使用这些属性创建一个新节点

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

如果一个节点的名称为
Alice,而另一个节点的id\u编号为
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
模式,该模式应具有唯一的未绑定节点