SKIP과 LIMIT#

GQL 절

작업 행을 페이지로 나눕니다. SKIP은 앞쪽 행을 버리고, LIMIT은 남길 행 수의 상한을 정합니다. OFFSET은 SKIP과 같은 뜻입니다.

개요#

{ SKIP | OFFSET } count
LIMIT count

굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.

설명#

SKIP과 LIMIT은 그 자체로 절이므로, 둘 중 어느 것이든 파이프라인의 어디서나 행을 페이지로 나눌 수 있습니다. RETURN이나 WITH 뒤에 쓰거나 MATCH 바로 뒤에 쓰십시오. 둘 중 하나만 써도 됩니다.

  • SKIP과 OFFSET은 같은 절입니다. 선호하는 표기를 쓰십시오. ISO/IEC 39075가 먼저 나열하는 것은 OFFSET입니다.

  • count는 리터럴만이 아니라 표현식이며, 한 번 평가됩니다.

  • 음수인 개수는 오류입니다. 행 수보다 큰 개수는 오류가 아닙니다. 끝을 넘어선 SKIP은 행을 내놓지 않고, 끝을 넘어선 LIMIT은 전부를 내놓습니다.

  • 소수인 개수는 가장 가까운 정수로 반올림됩니다.

  • 두 절 모두 쿼리를 시작할 수 없고, 혼자서 쿼리를 끝낼 수도 없습니다. 쿼리는 여전히 RETURN, FINISH, 또는 쓰기 절로 끝나야 합니다.

  • ORDER BY가 없으면 어느 행을 받는지가 정해져 있지 않습니다. 페이지가 일정해야 한다면 언제든 먼저 정렬하십시오.

  • 투영 뒤에 쓸 때는 수정자를 ORDER BY, SKIP/OFFSET, LIMIT 순서로 써야 합니다. 참고를 보십시오.

매개변수#

count

음수가 아닌 정수 표현식입니다. SKIP은 앞에서 그만큼의 행을 버리고, LIMIT은 최대 그만큼의 행을 남깁니다.

예제#

모든 예제는 예제 데이터셋에서 실행됩니다.

앞의 몇 행만 취하기#

MATCH (m:movie)
RETURN m.title AS film
ORDER BY film
LIMIT 2;
      film
----------------
 "Avatar"
 "Blade Runner"
(2 rows)

가운데에서 한 페이지 취하기#

MATCH (m:movie)
RETURN m.title AS film
ORDER BY film
SKIP 2
LIMIT 3;
        film
---------------------
 "Blade Runner 2049"
 "Elysium"
 "Gattaca"
(3 rows)

OFFSET도 같게 읽힙니다:

MATCH (m:movie)
RETURN m.title AS film
ORDER BY film
OFFSET 2
LIMIT 3;
        film
---------------------
 "Blade Runner 2049"
 "Elysium"
 "Gattaca"
(3 rows)

개수를 계산하기#

어떤 표현식이든 됩니다:

MATCH (m:movie)
RETURN m.title AS film
ORDER BY film
SKIP 1+1
LIMIT 2;
        film
---------------------
 "Blade Runner 2049"
 "Elysium"
(2 rows)

소수는 반올림됩니다. LIMIT 1.5는 두 행을 남깁니다:

MATCH (m:movie)
RETURN m.title AS film
ORDER BY film
LIMIT 1.5;
      film
----------------
 "Avatar"
 "Blade Runner"
(2 rows)

끝을 넘어서 페이지 넘기기#

MATCH (m:movie)
RETURN m.title AS film
ORDER BY film
SKIP 20;
 film
------
(0 rows)

영화가 18편이므로 남는 것이 없습니다. 같은 쿼리에 LIMIT 100을 쓰면 실패하는 것이 아니라 18편 전부를 반환합니다.

쿼리 도중에 파이프라인을 줄이기#

MATCH 뒤의 LIMIT은 뒤따르는 절이 조인해야 하는 행 수를 줄입니다:

MATCH (m:movie)
ORDER BY m.year DESC LIMIT 2
MATCH (p:person)-[:directed]->(m)
RETURN m.title AS film, p.name AS director
ORDER BY film;
            film            |      director
----------------------------+--------------------
 "Blade Runner 2049"        | "Denis Villeneuve"
 "The Matrix Resurrections" | "Lana Wachowski"
(2 rows)

음수인 개수는 거부된다#

MATCH (m:movie) RETURN m.title AS film ORDER BY film LIMIT -1;
ERROR:  LIMIT must not be negative
MATCH (m:movie) RETURN m.title AS film ORDER BY film SKIP -1;
ERROR:  OFFSET must not be negative

SKIP이 자신을 OFFSET으로 보고하는 것은 그 둘이 하나의 절이기 때문입니다.

놓일 수 없는 자리#

두 절 모두 쿼리를 시작할 수 없습니다:

LIMIT 3;
ERROR:  syntax error at or near "LIMIT"
LINE 1: LIMIT 3;
        ^

그리고 둘 다 쿼리를 닫지 못합니다:

MATCH (m:movie) LIMIT 3;
ERROR:  Cypher query must end with RETURN, FINISH or update clause

참고#

투영 뒤에서는 수정자를 ORDER BY, 그다음 SKIP/OFFSET, 그다음 LIMIT 순서로 쓰십시오. 그 순서만 투영 안으로 접혀 들어갑니다. LIMIT을 SKIP보다 앞에 두면 뒤에 남은 SKIP이 그 자체로 하나의 절로 읽히므로, 그 쿼리는 더 이상 투영으로 끝나지 않습니다. 오류가 보고하는 것이 그것입니다:

MATCH (m:movie) RETURN m.title AS film ORDER BY film LIMIT 3 SKIP 2;
ERROR:  Cypher query must end with RETURN, FINISH or update clause

파이프라인 가운데에서는 두 순서 모두 파싱되고, 뜻이 서로 다릅니다. 각 절은 그 앞의 절이 내놓은 행에 적용됩니다. 먼저 건너뛰면 세 번째부터 여섯 번째 행을 취합니다:

MATCH (m:movie) ORDER BY m.title SKIP 2 LIMIT 4 RETURN m.title AS film;
        film
---------------------
 "Blade Runner 2049"
 "Elysium"
 "Gattaca"
 "Inception"
(4 rows)

먼저 제한하면 네 행으로 잘라 낸 뒤 그중 둘을 건너뛰어 두 행이 남습니다:

MATCH (m:movie) ORDER BY m.title LIMIT 4 SKIP 2 RETURN m.title AS film;
        film
---------------------
 "Blade Runner 2049"
 "Elysium"
(2 rows)

호환성#

SKIP과 OFFSET (ISO/IEC 39075 §16.19)#

표준의 <offset synonym>은 OFFSET | SKIP이므로 두 표기 모두 표준에 맞습니다. openCypher에는 SKIP만 있습니다.

관련 항목#

  • ORDER BY — 먼저 정렬해 페이지를 재현 가능하게 만들기

  • RETURN, WITH — 이 절들이 페이지로 나누는 투영

  • MATCH — 작업을 줄이려고 파이프라인 도중에 페이지 나누기