2016-07-29 4 views
3

Neo4j의 사이퍼 쿼리 언어로 ELSE 문에서 THEN 및 UPDATE의 CREATE 문을 실행하고 싶습니다. 제품과 사용자가 null 포함되지 않습니다 0 또는 1의 크기를해야합니다 목록으로 그룹화 동안THEN ELSE neo4j의 cypher 쿼리 언어의 조건문

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 수 있습니다

여기 내 쿼리입니다. 그런 다음

,

  1. 당신은 사용자가

  2. 존재하는 경우에만이 속성을 설정하는 0 또는 1 회 반복 (또는 할 수없는 CREATE 부분을 할 목록에 반복 할 수

    에서

    012,351 : 사용자리스트의 크기가 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 
+0

'user'노드가 null이면 다른 노드가 null이라는 오류가 발생합니다. – Jeevika

+1

실제로'CREATE'를 보호하기 위해 FOREACH 루프를 추가했습니다. –

+0

멋진 답변 - 나는'product.userStatus' 업데이트를위한 두 번째'FOREACH'를 좋아합니다. –

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