Merge 具有两个唯一性约束的密码合并
假设我在Cypher中的标签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,则返回该节点 如果有一个节
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和名称
153,则返回该节点id\u编号
- 如果有一个节点具有
Alicexor名称
153,则会出现错误,因为我们无法创建新节点并维护这两个唯一性约束id\u编号
- 如果有一个节点既没有
Alice也没有名称
153,则将使用这些属性创建一个新节点id\u编号
- 如果有一个节点具有
Alice或名称
153,则返回该节点id\u编号
- 如果有一个节点既没有
Alice也没有名称
153,则将使用这些属性创建一个新节点id\u编号
知道如何在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
模式,该模式应具有唯一的未绑定节点