我想在Neo4j中使用密码查询语言在ELSE语句中的THEN和UPDATE执行CREATE语句。
这是我的问题:
MATCH (product:user_product) WHERE id(product) = 45
OPTIONAL MATCH (user:person) where id(user) = 90
FOREACH (o IN CASE WHEN user IS NOT NULL THEN
CREATE (user)<-[:HAS_USER]-(product)
ELSE
set product.userStatus = 1
END)
return user, product
答案 0 :(得分:2)
您可以在按产品和用户分组时将collect
用户添加到列表中,列表的大小为0或1,因为它不包含null
。
然后,
只有当用户存在时,您才可以在列表上进行迭代以执行CREATE
部分
如果用户列表的大小为1或0
结果查询是这样的:
MATCH (product:user_product) WHERE id(product) = 45
OPTIONAL MATCH (user:person) WHERE id(user) = 90
WITH product, user, collect(user) AS users
FOREACH (u IN users | CREATE (u)<-[:HAS_USER]-(product))
FOREACH (i in range(1, 1 - size(users)) | SET product.userStatus = 1)
RETURN user, product
答案 1 :(得分:2)
如果任一条件为真,则可以为特定条件设置一个集合,然后使用FOREACH
循环遍历条件(如果为真)。通过组合它们,您可以选择执行其中一个。
MATCH (product:user_product) WHERE id(product) = 45
OPTIONAL MATCH (user:person) where id(user) = 90
WITH CASE WHEN user IS NOT null THEN
[1]
END as create_rel,
CASE WHEN user IS null THEN
[1]
END as update_product, product, user
FOREACH (x in create_rel |
MERGE (user)<-[r:HAS_USER]-(product)
ON CREATE set r.updated = 1
ON MATCH set r.updated = r.updated + 1
)
FOREACH (x in update_product |
SET product.userStatus = 1
)
return user, product