절(Clauses)
RETURN
RETURN 절은 Cypher 쿼리의 결과로 반환할 속성을 명시하는 데 사용됩니다. 매칭된 그래프 패턴의 정점, 간선, 속성 등을 반환합니다.
정점 반환
MATCH (j {name: 'Jack'}) RETURN j;
정점을 반환하려면 반환하고자 하는 정점을 MATCH 절에 정의하고 해당 변수를 할당해야 합니다. 그런 다음 RETURN 절에 정의하면 정점이 반환됩니다.
간선 반환
MATCH (j {name: 'Jack'})-[k:knows]->(e) RETURN k;
간선을 반환하려면 반환하고자 하는 간선을 MATCH 절에 정의하고 해당 변수를 할당해야 합니다. 그런 다음 RETURN 절에 정의하면 간선이 반환됩니다.
속성 반환
MATCH (j {name: 'Jack'}) RETURN j.age;
정점이나 간선의 속성을 반환하려면 찾고자 하는 정점이나 간선을 MATCH 절에 정의하고 해당 변수를 할당해야 합니다. 그런 다음 RETURN 절에 정의한 후 변수와 점(.)을 이어 붙이면 속성이 반환됩니다.
전체 반환
MATCH (j {name: 'Jack'})-[k:knows]->(e) RETURN *;
MATCH 절의 모든 요소를 반환하려면 RETURN 절에
asterisk(별표)를 넣기만 하면 됩니다. 이 경우 변수를 가진 요소만 반환됩니다.경로 반환
MATCH p=(j {name: 'Jack'})-[k:knows]->(e) RETURN p;
MATCH 절에서 매칭된 패턴의 경로를 반환하려면 패턴에 변수가 있어야 합니다. 패턴에 변수를 할당하려면 패턴 앞에 변수와 **
등호 기호(=)**를 넣습니다. 그런 다음 RETURN 절에 정의하면 경로가 반환됩니다.별칭 반환
쿼리 :
MATCH (j {name: 'Jack'}) RETURN j.age AS HisAge;
결과 :
hisage -------- 24
쿼리 :
MATCH (j {name: 'Jack'}) RETURN j.age AS "HisAge";
결과 :
HisAge -------- 24
AS 키워드와 그 뒤에 별칭을 붙이면 반환 결과에 별칭을 할당할 수 있습니다. 큰따옴표가 없으면 별칭은 소문자로 표시됩니다. 대문자로 표시하고 싶다면 별칭을 큰따옴표로 감싸십시오.
표현식 반환
RETURN 'Hello World~!'; RETURN 1219, 33.33; MATCH (j {name: 'Jack'}), (e {name: 'Emily'}) RETURN j.age > e.age;
패턴에 정의된 속성뿐만 아니라 표현식도 표시할 수 있습니다. 문자열, 숫자, 또는 boolean 결과를 갖는 표현식을 표시할 수 있습니다.
DISTINCT 반환
쿼리 :
MATCH (:person {name:'Jack'})-[:knows]->()-[:knows]->(fof) RETURN fof.name;
결과 :
name -------- Tom Rachel Edward Emily Amy Paul Rachel (7 rows)
쿼리 :
MATCH (:person {name:'Jack'})-[:knows]->()-[:knows]->(fof) RETURN DISTINCT fof.name;
결과 :
name -------- Tom Rachel Edward Emily Amy Paul (6 rows)
결과에서 중복된 데이터를 발견하는 경우가 있습니다. 이러한 경우를 방지하려면
DISTINCT키워드가 필요합니다.
ORDER BY
ORDER BY 절은 결과를 정렬하기 위한 절입니다. RETURN 또는 WITH 절과 함께 사용되며 오름차순 또는 내림차순으로 정렬할 수 있습니다.
속성으로 정렬
MATCH (a:person) RETURN a.name AS NAME ORDER BY NAME; MATCH (a:person) RETURN a.name AS NAME, a.age AS AGE ORDER BY NAME, AGE; MATCH (a:person) RETURN a ORDER BY a.name;
기본적으로 ORDER BY 절은 정점, 간선, 또는 속성을 정렬하므로 정렬 기준의 별칭을 ORDER BY 절에 정의해야 합니다. 즉, 정렬 기준이 될 속성의 별칭을 먼저 정의한 후 ORDER BY 절에 넣어야 합니다. ORDER BY 절에 여러 개의 기준이 있는 경우, 결과는 첫 번째 정렬 기준에 따라 먼저 정렬되고 그 다음 정렬 기준이 적용됩니다. 별칭을 사용하고 싶지 않다면 별칭 대신 속성을 ORDER BY 절에 정의할 수 있습니다.
내림차순 정렬
MATCH (a:person) RETURN a.name AS NAME ORDER BY NAME DESC; MATCH (a:person) RETURN a.name AS NAME, a.age AS AGE ORDER BY NAME DESC, AGE;
ORDER BY 절은 기본적으로 오름차순으로 동작합니다. 내림차순으로 정렬하려면 **
DESC**를 넣으십시오. ORDER BY 절에 여러 개의 기준이 있고 그중 일부를 내림차순으로 동작시키고 싶다면, 원하는 기준 뒤에 DESC를 넣으십시오.NULL 정렬
쿼리 :
MATCH (a:person) RETURN a.name AS NAME, a.hobby ORDER BY hobby DESC;
결과 :
name | hobby ----------+-------------------- Emily | Tom | Carl | Denny | Amy | Rachel | Paul | Alice | Kelly | Sally | Angela | John | Martin | Peter | Thomas | William | Henry | Jennifer | Nicole | Sharon | James | Robert | Michael | Edward | Jack | Playing the guitar (25 rows)
ORDER BY 절에 지정된 속성을 갖지 않는 요소는 null로 출력됩니다. 결과 집합을 정렬할 때 null은 항상 결과 집합의 끝에 옵니다. DESC 키워드를 사용하여 null을 포함하는 결과 집합을 출력하면 null이 결과의 맨 위에 출력됩니다.
LIMIT
LIMIT 절은 결과 집합의 결과 개수를 제한하는 절입니다.
결과 집합 제한
MATCH (a) RETURN a.name LIMIT 10;
출력할 결과의 개수를 제한하고 싶다면 LIMIT 절에 개수를 지정하면 됩니다. 결과 집합의 결과 개수가 LIMIT 절에 지정된 개수보다 작거나 같으면 모든 결과가 출력됩니다.
ORDER BY와 함께 사용하는 LIMIT
MATCH (a) RETURN a.name AS NAME ORDER BY NAME LIMIT 10; MATCH (a) RETURN a.name AS NAME ORDER BY NAME DESC LIMIT 10;
LIMIT 절은 ORDER BY 절과 함께 자주 사용됩니다. 상위 몇 개만 출력하고 싶다면 둘을 함께 사용하십시오. 레코드를 내림차순으로 정렬하려면
DESC키워드를 사용하십시오.
SKIP
SKIP 절은 검색 시작 위치를 변경하는 절입니다.
SKIP
쿼리 :
MATCH (a) RETURN a.name;
결과 :
name ---------- Emily Tom Carl Denny Amy Rachel . . .
쿼리 :
MATCH (a) RETURN a.name SKIP 3;
결과 :
name ---------- Denny Amy Rachel Paul Alice Kelly . . .
MATCH 절에서 패턴을 검색할 때 SKIP 절에 지정된 개수만큼 건너뛰고 검색을 시작합니다.
ORDER BY와 함께 사용하는 SKIP
MATCH (a) RETURN a.name AS NAME ORDER BY NAME SKIP 3;
ORDER BY 절을 함께 사용하면 정렬한 후 SKIP 절에 지정된 개수만큼 건너뛰고 검색을 시작합니다. 상위 몇 개를 제외하고 반환하고 싶을 때 사용하십시오.
ORDER BY 및 LIMIT와 함께 사용하는 SKIP
MATCH (a) RETURN a.name AS NAME ORDER BY NAME SKIP 3 LIMIT 7;
상위에서 중간의 몇 개 값을 반환하고 싶다면 SKIP 절을 ORDER BY 및 LIMIT 절과 함께 사용하십시오.
WITH
WITH 절은 여러 Cypher 쿼리를 연결하는 절입니다. 즉, WITH 절은 앞선 쿼리의 값을 다음 쿼리의 입력으로 전달하는 RETURN 절로 간주할 수 있습니다.
WITH
MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person) RETURN other, count(common); WHERE count(common) > 1 RETURN other; MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person) WITH other, count(common) AS cnt WHERE cnt > 1 RETURN other;
WITH 절은 위의 세 가지 쿼리를 예로 들어 설명합니다. 첫 번째 쿼리는 Jack과 ‘누군가’가 공통으로 아는 지인의 수를 그 ‘누군가’와 함께 반환합니다. 두 번째 쿼리가 첫 번째 쿼리와 관련된 것이라면, 이 쿼리는 공통 지인의 수가 1보다 큰 경우에 해당하는 ‘누군가’를 반환하는 쿼리로 이해할 수 있습니다. 두 번째 쿼리는 단독으로 실행할 수 없으며, 첫 번째 쿼리와 결합될 때 의미를 갖습니다. WITH 절은 두 쿼리를 연결하는 역할을 합니다.
세 번째 쿼리는 첫 번째와 두 번째 쿼리를 연결하는 WITH 절을 포함하는 쿼리입니다. 첫 번째 쿼리의 결과를 변수, 별칭 형태로 보유하고 그 결과를 두 번째 쿼리로 전달합니다. 이처럼 여러 쿼리를 연결하고 앞선 쿼리의 출력을 뒤따르는 쿼리의 입력으로 사용하고 싶다면 WITH 절로 연결할 수 있습니다. WITH 절은 반드시 변수 또는 별칭 형태로 보유해야 합니다.파티셔닝
MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person) RETURN other, count(common) ORDER BY other.name LIMIT 10; WHERE count(common) > 1 RETURN other; MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person) WITH other, count(common) AS cnt ORDER BY other.name LIMIT 10 WHERE cnt > 1 RETURN other;
WITH 절을 사용할 때는 전체 쿼리를 분할하는 것이 중요합니다. WITH 절을 RETURN 절로 간주하고, RETURN 뒤에 오는 ORDER BY 및 LIMIT 절을 하나의 분할로 간주하십시오. 따라서 앞선 쿼리에 ORDER BY, LIMIT 절이 있다면 해당 절을 WITH 절 뒤에 작성한 다음 뒤따르는 쿼리를 작성할 수 있습니다.
UNION
UNION 절은 여러 쿼리의 결과를 하나로 결합합니다.
UNION
MATCH (a:person) WHERE 20 < a.age::int RETURN a.name AS name UNION MATCH (b:person) WHERE b.age::int < 50 RETURN b.name AS name; MATCH (a:person) WHERE 20 < a.age::int RETURN a.name AS name UNION ALL MATCH (b:person) WHERE b.age::int < 50 RETURN b.name AS name;
두 쿼리 사이에
UNION키워드를 넣으면 두 결과를 함께 결합할 수 있습니다. **UNION**은 중복된 값을 한 번만 출력합니다. **UNION**과 **ALL**을 함께 사용하면 두 결과를 결합할 때 값이 중복으로 출력됩니다.전제 조건
MATCH (a:person) RETURN a.name AS AAA UNION MATCH (b:person) RETURN b.age AS AAA; MATCH (a:person) RETURN a.name UNION MATCH (b:person) RETURN b.age;
UNION 연산자를 사용하여 둘 이상의 쿼리의 결과 집합을 결합하려면 기본 규칙이 있습니다. 각 쿼리의 RETURN 절에 지정된 요소의 개수가 동일해야 합니다. 서로 다른 속성이더라도 각 쿼리의 RETURN에 지정된 요소의 개수만 동일하면 됩니다.