Cypher - 条件创建

Cypher - Conditional Create

正常创建在数据库中的工作原理

在大多数创建情况下,如果唯一键或主键之一已存在于数据库中,您不想创建新节点。我也不想更新节点,因为那将是一个 upsert。如果密钥存在于数据库中,我不想做任何事情。这将像唯一约束一样工作。

使用唯一键创建

如果我只希望电子邮件字段是唯一的,我可以这样做:

MERGE (u:User { email: 'me@you.com' })
ON CREATE SET u.name='Jon Smith'
RETURN u

如果已经有电子邮件,则不会创建用户。

使用多个唯一键创建?

假设我不希望用户能够在数据库中已有用户名或电子邮件地址的情况下创建用户。你会认为这会起作用:

MERGE (u:User { email: 'me@you.com', username: 'bill' })
ON CREATE SET u.name='Jon Smith'
RETURN u

但是,这仍会创建节点,因为只有 COMBINATION 必须是唯一的。我希望这两个值分别是唯一的...或失败。

条件创建

我想要的是条件创建:IF X THEN Y where:

x = email OR username IS NOT IN User
y = CREATE User email="me@you.com", username="bill", role="admin", ...

如何做到这一点?

J

请考虑以下查询:

GRAPH.QUERY g "cypher email='a' username='b'
OPTIONAL MATCH (n)
WHERE n.email = $email OR n.username = $username
WITH n is null as missing
WHERE missing = true
CREATE ({email:$email, username:$username})"

给定一个空图:

GRAPH.QUERY g "cypher email='a' username='b' OPTIONAL MATCH (n) WHERE n.email = $email OR n.username = $username  WITH n is null as missing WHERE missing = true CREATE (n {email:$email, username:$username})"
1) 1) "Nodes created: 1"
   2) "Properties set: 2"
   3) "Cached execution: 0"
   4) "Query internal execution time: 1.469000 milliseconds"

GRAPH.QUERY g "cypher email='a' username='b' OPTIONAL MATCH (n) WHERE n.email = $email OR n.username = $username  WITH n is null as missing WHERE missing = true CREATE (n {email:$email, username:$username})"
    1) 1) "Cached execution: 1"
       2) "Query internal execution time: 0.614000 milliseconds"

运行 两次完全相同的查询,第一次执行创建了丢失的节点,第二次没有修改图形。