NEXT#
GQL 절 2.18에 추가
두 쿼리를 끝과 끝으로 잇습니다. 첫 쿼리가 반환한 행이 둘째 쿼리의 입력 행이 됩니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
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는
그것을 그대로 받습니다.