{#next-next}
# NEXT
{bdg-primary-line}`GQL 절` {bdg-secondary-line}`2.18에 추가`
두 쿼리를 끝과 끝으로 잇습니다. 첫 쿼리가 반환한 행이 둘째 쿼리의 입력 행이 됩니다.
{#next-synopsis}
## 개요
queryNEXTquery[NEXTquery]...
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#next-description}
## 설명
`NEXT`는 왼쪽 쿼리의 결과 표를 오른쪽 쿼리를 돌리는 표로 만듭니다. 하나의 쿼리 안에서 `WITH`가
하는 조합을, 온전한 두 쿼리 사이의 경계로 올려놓은 것입니다.
- `NEXT` 왼쪽의 쿼리는 `RETURN`으로 끝나야 합니다.
- 이 경계는 **유효 범위를 초기화합니다.** 오른쪽에서는 `RETURN`이 내놓은 컬럼만 보입니다. 그 밖의
변수는 모두 사라집니다.
- 컬럼은 자기 타입을 그대로 지니고 경계를 넘습니다. 정점은 여전히 정점이고, 간선은 간선이고,
경로는 경로입니다.
- `NEXT`는 왼쪽 결합이므로 `A NEXT B NEXT C`는 `(A NEXT B) NEXT C`로 조합됩니다.
- [`UNION`](union.md), `INTERSECT`, `EXCEPT` 복합 쿼리가 어느 쪽에든 올 수 있습니다.
- `NEXT`는 문장의 맨 앞에서, 그리고 `EXPLAIN`과 `PREPARE` 안에서 받아들여집니다. 서브쿼리 안에서는
받아들여지지 않으며, `CALL { }` 본문과 서브쿼리 값 표현식 둘 다 그렇습니다.
{#next-parameters}
## 매개변수
query
: 온전한 쿼리입니다. `NEXT` 왼쪽의 쿼리는 `RETURN`으로 끝나야 하고, 반환하는 모든 컬럼에 이름이
있어야 합니다. 별칭이 없는 표현식은 `expression in WITH must be aliased (use AS)`를 냅니다.
오른쪽 쿼리는 새 쿼리입니다. 쿼리를 시작할 수 있는 절로 시작합니다(`MATCH`, `OPTIONAL MATCH`,
`CREATE`, `INSERT`, `MERGE`, `LOAD FROM`, `UNWIND`, `FOR`, `CALL`, `LET`, `RETURN`, `FINISH`).
전달된 표를 대상으로 동작하는 절로 시작할 수도 있습니다(`WITH`, `FILTER`, `ORDER BY`, `SKIP`,
`OFFSET`, `LIMIT`). 끝맺는 방식은 다른 쿼리와 같습니다. `RETURN`, `FINISH`, 또는 쓰기 절입니다.
{#next-examples}
## 예제
모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다.
한 감독이 만든 영화를 그 출연진을 찾는 둘째 쿼리로 넘깁니다. `NEXT`와 중간의 `WITH`는 같은 두
단계를 조합합니다. 탭을 바꿔 비교해 보십시오:
::::{tab-set}
:::{tab-item} GQL — NEXT
```cypher
MATCH (p:person {name: 'Christopher Nolan'})-[:directed]->(m:movie)
RETURN m
NEXT
MATCH (a:person)-[:acted_in]->(m)
RETURN m.title AS film, a.name AS actor ORDER BY film;
```
:::
:::{tab-item} Cypher — WITH
```cypher
MATCH (p:person {name: 'Christopher Nolan'})-[:directed]->(m:movie)
WITH m
MATCH (a:person)-[:acted_in]->(m)
RETURN m.title AS film, a.name AS actor ORDER BY film;
```
:::
::::
```
film | actor
----------------+-----------------------
"Inception" | "Leonardo DiCaprio"
"Interstellar" | "Matthew McConaughey"
(2 rows)
```
`m`은 정점으로 경계를 넘으므로, 둘째 쿼리는 그것에서 다시 순회합니다.
{#next-filter-an-aggregate-computed-by-the-first-query}
### 첫 쿼리가 계산한 집계를 걸러 내기
`FILTER`는 독립적인 쿼리를 시작할 수 없지만, `NEXT` 뒤의 쿼리는 시작할 수 있습니다. 그러면 `WITH`를
더 쓰지 않고도 집계에 `HAVING` 식의 필터를 줄 수 있습니다:
```cypher
MATCH (p:person)-[:acted_in]->(m:movie)
RETURN p.name AS actor, count(m) AS films
NEXT
FILTER films > 2
RETURN actor, films ORDER BY actor;
```
```
actor | films
-------------------------+-------
"Arnold Schwarzenegger" | 3
"Keanu Reeves" | 4
(2 rows)
```
{#next-chain-three-queries}
### 쿼리 세 개 잇기
`NEXT` 하나하나가 또 하나의 경계이며, 왼쪽에서 오른쪽으로 평가됩니다:
```cypher
MATCH (m:movie) RETURN m.genre AS genre
NEXT
RETURN DISTINCT genre AS g
NEXT
RETURN count(g) AS genres;
```
```
genres
--------
3
(1 row)
```
{#next-reach-a-variable-the-first-query-did-not-return}
### 첫 쿼리가 반환하지 않은 변수에 손대기
경계를 넘어 살아남는 것은 반환된 컬럼뿐이므로, 그 밖의 것을 가리키면 파싱 시점에 실패합니다:
```cypher
MATCH (p:person {name: 'Christopher Nolan'})-[:directed]->(m:movie)
RETURN m
NEXT
RETURN p.name;
```
```
ERROR: variable does not exist
LINE 4: RETURN p.name;
^
```
{#next-notes}
## 참고
`NEXT`는 실행 시점에 비용이 없습니다. 이 경계는 왼쪽 쿼리의 `RETURN`을, 절 파이프라인이 이미 절
묶음 사이에 놓는 `WITH`로 다시 쓰는 방식으로 만들어집니다. 그래서 위 탭의 두 쿼리는 실행 계획이
똑같습니다.
두 개의 안전장치가 잘못된 사용을 구문 오류가 아니라 곧바로 보고합니다. `RETURN`으로 끝나지 않는
왼쪽 쿼리는 `a query statement before NEXT must end with RETURN`을 냅니다. `FINISH`로 끝나는 왼쪽
쿼리는 `FINISH cannot be followed by NEXT`를 냅니다.
이어진 쿼리 중 마지막 쿼리도 문장을 제대로 끝맺어야 합니다. `ORDER BY`, `SKIP`, `OFFSET`, `LIMIT`은
그 자체로 절이지만 어느 것도 쿼리를 끝낼 수 없습니다. 그런 절에서 멈춘 사슬은
`Cypher query must end with RETURN, FINISH or update clause`를 냅니다. 뒤에 `RETURN`이나 `FINISH`를
붙이십시오.
`next`는 예약되지 않은 키워드이므로, 변수·레이블·속성 이름으로 계속 쓸 수 있습니다.
{#next-compatibility}
## 호환성
```{admonition} GQL 적합성
:class: gql-conformance
*프로시저 본문*(ISO/IEC 39075:2024 §9.2)의 GQL ``, 기능 GQ20 "Advanced linear
composition with NEXT"를 구현합니다.
- **지원** — 쿼리 문장 잇기, 왼쪽 결합의 여러 겹 잇기, 경계에서의 유효 범위 초기화,
그리고 양쪽 어디에나 오는 집합 연산 합성.
- **미지원** — 표준이 `NEXT`와 다음 문장 사이에 허용하는 선택적 `YIELD` 절
(`NEXT YIELD a, b …`). 구문 오류가 납니다. 대신 앞의 `RETURN`에서 투영하고 이름을
바꾸십시오.
진행 상황은 [GQL 적합성 표](../../appendix/gql-conformance.md)에서 확인하십시오.
```
{#next-opencypher}
### openCypher
openCypher에는 `NEXT`가 없습니다. 거기서 조합은 언제나 위 탭에 보인 `WITH` 형태이고, AgensGraph는
그것을 그대로 받습니다.
{#next-see-also}
## 관련 항목
- [`WITH`](with.md) — 하나의 쿼리 안에서 쓰는 Cypher의 대응 절
- [`LET`](let.md) {bdg-secondary-line}`GQL` — 경계 없이 컬럼을 더하기
- [`FILTER`](filter.md) {bdg-secondary-line}`GQL` — `NEXT`가 맨 앞에 올 수 있게 해 주는 절
- [`FINISH`](finish.md) {bdg-secondary-line}`GQL`
- [`RETURN`](return.md) — 왼쪽 쿼리가 끝나야 하는 방식
- [GQL 적합성 표](../../appendix/gql-conformance.md)