Cypher语言 - 条件必选创建



Normal Create如何在数据库中工作

在大多数创建环境中,如果数据库中已经存在唯一键或主键之一,则不希望创建新节点。我也不想更新节点,因为那将是一个麻烦。如果键存在于数据库中,我什么都不想做。这就像一个唯一约束。

使用唯一密钥创建

如果我只希望email字段是唯一的,我可以这样做:

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,其中:

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"

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

最新更新