然后在neo4j中的密码查询语言中使用ELSE条件语句

时间:2016-07-29 11:27:42

标签: neo4j cypher

我想在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

2 个答案:

答案 0 :(得分:2)

您可以在按产品和用户分组时将collect用户添加到列表中,列表的大小为0或1,因为它不包含null

然后,

  1. 只有当用户存在时,您才可以在列表上进行迭代以执行CREATE部分

  2. 如果用户列表的大小为1或0

  3. ,您可以迭代0或1次来设置属性(如果不是0,则为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