2015-02-05 4 views
2

현재 데이터베이스에서 일부 정보를 가져 오기 위해 다음 세 가지 쿼리를 사용하고 있습니다.Distinct Neo4j Cypher 쿼리 결합

MATCH (u:User { id: "1" }), (x:Label) 
WHERE (u)-[:SEES]->(x) 
RETURN collect(x) as labels 

MATCH (u:User { id: "1" }), (x:Label) 
WHERE (u)-[:SEES]->(x)  
    AND NOT((x)-[:CLASSIFIES]->())  
    AND NOT(()-[:CLASSIFIES]->(x)) 
RETURN collect(x) as uniquelabels 

MATCH (u:User { id: "1" }), p=(a:Label)-[:CLASSIFIES*]->(b:Label) 
WHERE ALL(n IN nodes(path) WHERE ((u)-[:SEES]->(n))) 
    AND NOT(()-[:CLASSIFIES]->(a))  
    AND NOT((b)-[:CLASSIFIES]->()) 
    WITH collect(extract(n IN nodes(p) | n.id)) as paths 
RETURN distinct paths 

이러한 쿼리를 하나로 결합하는 올바른 방법은 무엇입니까?

답변

1

우선 NOT()을 쓰지 않는 한 구문 (ASCII 아트 화살표 구문)을 WHERE 절에 사용하지 않는 것이 좋습니다. 나는 쿼리 너무 밀접하게

에 못 봤어하지만,

MATCH (u:User { id: "1" })-[:SEES]->(x:Label) 
RETURN extract(n IN collect(distinct x) | n.id) as labels 
    UNION 
MATCH (x:Label) 
WHERE NOT((x)-[:CLASSIFIES]-())  
RETURN extract(n IN collect(distinct x) | n.id) as uniquelabels 
    UNION 
MATCH (u:User { id: "1" }), p=(a:Label)-[:CLASSIFIES*]->(b:Label) 
WHERE ALL(n IN nodes(path) WHERE ((u)-[:SEES]->(n))) 
    AND NOT(()-[:CLASSIFIES]->(a))  
    AND NOT((b)-[:CLASSIFIES]->()) 
RETURN DISTINCT collect(extract(n IN nodes(p) | n.id)) 

그것을 할 수있는 더 우아한 방법이있을 수 있습니다

나는이 같은 UNION을 사용할 수 있어야한다고 생각합니다