{#next-next} # NEXT {bdg-primary-line}`GQL 절` {bdg-secondary-line}`2.18에 추가` 두 쿼리를 끝과 끝으로 잇습니다. 첫 쿼리가 반환한 행이 둘째 쿼리의 입력 행이 됩니다. {#next-synopsis} ## 개요
query NEXT query [ NEXT query ] ...

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

{#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)