2017-04-07 1 views
0

이 쿼리를 작성하는 가장 효율적인 방법은 무엇입니까? 문제. 나는 농구를하는 남자와 여자 아이들의 이름이 3500 개입니다. 나는 그들과 관계를 맺고 싶다. 그들은 자신의 연령 그룹에 근거한 유아, 청소년, 십대에 속한다.Foreach의 neo4j case 문

foreach 내에서 case 문을 수행 할 수 없습니다.

Match(b:BoysandGirls) 
UNWIND (b.name) as namelist 
FOREACH (fullname in namelist | 
    MERGE(b1:BoysandGirls {name:fullname}) 
    CASE WHEN b1.age < 6 THEN 
     MERGE(t1:KidsType {group:"Toddler"}) // this groups already exist 
     MERGE(b1)-[BELONGS_TO]->(t1) 
    END 
) 

는 // 내가 청소년과 대 등의 많은 그룹이 ...하지만
있는지 나는 오류 유효하지 않은 입력 ... 예상 1/L ... CASE 문에서 얻을. 무엇이 잘못 되었나요?

답변

1

FOREACH은 돌연변이 연산 만 허용하지만 CASE은 돌연변이 연산이 아니며 CASE도 일치/돌연변이 연산을 포함 할 수 없습니다. 이러한 문제 외에도 UNWIND에 대해 혼란 스러울 것입니다. 아마도 COLLECT을 의미했을 것입니다. 그러나 나는 당신이 COLLECTFOREACH을 사용할 필요가 없다고 생각합니다. (기본적으로 그들은 서로를 취소하기 때문입니다).

MATCH (bg:BoysandGirls) 
WHERE bg.age < 6 
MATCH (t:KidsType {group:"Toddler"}) 
MERGE (bg)-[BELONGS_TO]->(t); 

그것은 6 이상의 모든 BoysandGirls 젊은 발견하고 "유아"KidsType에 그들은합니다 (BELONS_TO 관계 유형을 통해) 관련 보장 :

이 훨씬 간단 쿼리는 모두 당신이해야 할 수 있습니다.

+1

@ClickAway 또 다른 고려해야 할 점은 노드를 범주화하는 것이 유일한 경우 (KidsType 노드에 다른 속성이없고 다른 이유로 이러한 노드를 사용하지 않으려는 경우) 노드에 추가 레이블을 추가하십시오 (: Toddler, : Youth, : Teenager). Neo4j는 다중 레이블 노드를 허용하므로 연령 그룹에 대한 빠른 쿼리를 위해이 레이블을 사용하여 일치시킬 수 있습니다. – InverseFalcon