NEXT#

GQL 절 2.18에 추가

두 쿼리를 끝과 끝으로 잇습니다. 첫 쿼리가 반환한 행이 둘째 쿼리의 입력 행이 됩니다.

개요#

query NEXT query [ NEXT query ] ...

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

설명#

NEXT는 왼쪽 쿼리의 결과 표를 오른쪽 쿼리를 돌리는 표로 만듭니다. 하나의 쿼리 안에서 WITH가 하는 조합을, 온전한 두 쿼리 사이의 경계로 올려놓은 것입니다.

  • NEXT 왼쪽의 쿼리는 RETURN으로 끝나야 합니다.

  • 이 경계는 유효 범위를 초기화합니다. 오른쪽에서는 RETURN이 내놓은 컬럼만 보입니다. 그 밖의 변수는 모두 사라집니다.

  • 컬럼은 자기 타입을 그대로 지니고 경계를 넘습니다. 정점은 여전히 정점이고, 간선은 간선이고, 경로는 경로입니다.

  • NEXT는 왼쪽 결합이므로 A NEXT B NEXT C는 (A NEXT B) NEXT C로 조합됩니다.

  • UNION, INTERSECT, EXCEPT 복합 쿼리가 어느 쪽에든 올 수 있습니다.

  • NEXT는 문장의 맨 앞에서, 그리고 EXPLAIN과 PREPARE 안에서 받아들여집니다. 서브쿼리 안에서는 받아들여지지 않으며, CALL { } 본문과 서브쿼리 값 표현식 둘 다 그렇습니다.

매개변수#

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와 중간의 WITH는 같은 두 단계를 조합합니다. 탭을 바꿔 비교해 보십시오:

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;
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은 정점으로 경계를 넘으므로, 둘째 쿼리는 그것에서 다시 순회합니다.

첫 쿼리가 계산한 집계를 걸러 내기#

FILTER는 독립적인 쿼리를 시작할 수 없지만, NEXT 뒤의 쿼리는 시작할 수 있습니다. 그러면 WITH를 더 쓰지 않고도 집계에 HAVING 식의 필터를 줄 수 있습니다:

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 하나하나가 또 하나의 경계이며, 왼쪽에서 오른쪽으로 평가됩니다:

MATCH (m:movie) RETURN m.genre AS genre
NEXT
RETURN DISTINCT genre AS g
NEXT
RETURN count(g) AS genres;
 genres
--------
 3
(1 row)

첫 쿼리가 반환하지 않은 변수에 손대기#

경계를 넘어 살아남는 것은 반환된 컬럼뿐이므로, 그 밖의 것을 가리키면 파싱 시점에 실패합니다:

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는 실행 시점에 비용이 없습니다. 이 경계는 왼쪽 쿼리의 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는 예약되지 않은 키워드이므로, 변수·레이블·속성 이름으로 계속 쓸 수 있습니다.

호환성#

GQL 적합성

프로시저 본문(ISO/IEC 39075:2024 §9.2)의 GQL <next statement>, 기능 GQ20 “Advanced linear composition with NEXT”를 구현합니다.

  • 지원 — 쿼리 문장 잇기, 왼쪽 결합의 여러 겹 잇기, 경계에서의 유효 범위 초기화, 그리고 양쪽 어디에나 오는 집합 연산 합성.

  • 미지원 — 표준이 NEXT와 다음 문장 사이에 허용하는 선택적 YIELD 절 (NEXT YIELD a, b …). 구문 오류가 납니다. 대신 앞의 RETURN에서 투영하고 이름을 바꾸십시오.

진행 상황은 GQL 적합성 표에서 확인하십시오.

openCypher#

openCypher에는 NEXT가 없습니다. 거기서 조합은 언제나 위 탭에 보인 WITH 형태이고, AgensGraph는 그것을 그대로 받습니다.

관련 항목#

  • WITH — 하나의 쿼리 안에서 쓰는 Cypher의 대응 절

  • LET GQL — 경계 없이 컬럼을 더하기

  • FILTER GQL — NEXT가 맨 앞에 올 수 있게 해 주는 절

  • FINISH GQL

  • RETURN — 왼쪽 쿼리가 끝나야 하는 방식

  • GQL 적합성 표