2016-07-29 14 views
3

我想在Neo4j中的密码查询语言中的THEN和UPDATE中执行ELSE语句中的CREATE语句。THEN ELSE neo4j中的密码查询语言中的条件语句

这里是我的查询:

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

您可以将用户collect到列表中,同时通过产品和用户,这将有一个大小为0或1,因为它不包含null列表分组。

然后,

  1. 可以遍历名单上,只有当用户存在

  2. CREATE部分可以重复0或1次设置的属性(或者没有在)的0的情况下,如果用户列表的大小是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 
+0

如果'user'节点为空,则会抛出其他节点为空的错误。 – Jeevika

+1

的确,我添加了一个'FOREACH'循环来保护'CREATE'。 –

+0

很好的答案 - 我喜欢第二个'FOREACH'来更新'product.userStatus' –

1

如果任一条件为真,则可以为特定条件设置一个集合,然后使用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