{#finish-finish} # FINISH {bdg-primary-line}`GQL 절` {bdg-secondary-line}`2.18에 추가` 아무것도 투영하지 않고 쿼리를 끝냅니다. 작업은 실행되고, 쿼리는 빈 결과를 반환합니다. {#finish-synopsis} ## 개요
FINISH

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

{#finish-description} ## 설명 모든 쿼리는 `RETURN`, `FINISH`, 또는 쓰기 절로 끝나야 합니다. `FINISH`는 "결과를 내놓지 않는다"고 말하는 끝맺음입니다. 인자를 받지 않고, 컬럼을 투영하지 않으며, 문장을 닫습니다. - `FINISH`는 **마지막** 절이어야 합니다. 그 뒤에 무엇이 오면 `FINISH must be at the end of the query`가 나옵니다. - 읽기 뒤의 `FINISH`는 행을 버립니다. 플래너가 그것을 `LIMIT 0`으로 적용하므로, 스캔은 열리지만 행은 하나도 가져오지 않습니다. - 쓰기 뒤에서도 쓰기는 그대로 일어납니다. `FINISH`는 투영만 억제합니다. - `FINISH`로 끝나는 쿼리는 **빈 결과**를 반환합니다. 컬럼도 행도 없습니다. `psql`은 그것을 `--` 머리와 그 뒤의 `(0 rows)`로 출력하고, `\gdesc`는 `The command has no result, or the result has no columns.` 라고 보고합니다. - `FINISH`로 끝나는 쓰기는 결과 대신 자기 명령 태그를 보고합니다. 정점 하나를 만들었다면 `UPDATE 1` 같은 것입니다. {#finish-examples} ## 예제 모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. 실행 계획만 보려고 읽기를 실행하는 경우입니다. 이것을 표기하는 Cypher 방식은 없습니다. `RETURN`도 쓰기 절도 없는 Cypher 쿼리는 거부됩니다: ```cypher MATCH (m:movie) FINISH; ``` ``` -- (0 rows) ``` {#finish-perform-a-write-without-reading-the-result-back} ### 결과를 다시 읽지 않고 쓰기 만들어진 요소를 클라이언트로 보내고 싶지 않을 때 꺼내 쓸 형태가 `CREATE … FINISH`입니다: ```cypher CREATE (:movie {title: 'Tenet', year: 2020, genre: 'Action'}) FINISH; ``` ``` UPDATE 1 ``` 그 정점은 만들어져 있습니다: ```cypher MATCH (m:movie {title: 'Tenet'}) RETURN m.title AS film, m.year AS year; ``` ``` film | year ---------+------ "Tenet" | 2020 (1 row) ``` {#finish-confirm-that-a-read-costs-nothing-after-finish} ### FINISH 뒤의 읽기가 비용을 들이지 않음을 확인하기 실행 계획에 이 절이 컴파일된 `LIMIT 0`이 보이고, 그 아래에는 한 번도 값을 가져가지 않는 스캔이 있습니다: ```cypher EXPLAIN (COSTS OFF) MATCH (m:movie) FINISH; ``` ``` QUERY PLAN --------------------------- Limit -> Seq Scan on movie m (2 rows) ``` 쓰기 계획은 쓰기 노드를 유지합니다. 그 쓰기는 선택이 아니기 때문입니다: ```cypher EXPLAIN (COSTS OFF) CREATE (:movie {title: 'Tenet'}) FINISH; ``` ``` QUERY PLAN -------------- Graph Create -> Result (2 rows) ``` {#finish-end-a-sorted-query-that-projects-nothing} ### 아무것도 투영하지 않는, 정렬된 쿼리 끝맺기 `ORDER BY`, `SKIP`, `OFFSET`, `LIMIT`은 그 자체로 절이지만 어느 것도 쿼리를 끝낼 수 없습니다. `FINISH`가 그런 절로 끝나는 파이프라인을 닫아 줍니다: ```cypher MATCH (m:movie) ORDER BY m.year LIMIT 3 FINISH; ``` ``` -- (0 rows) ``` `FINISH`가 없으면 같은 쿼리가 `Cypher query must end with RETURN, FINISH or update clause`를 냅니다. {#finish-notes} ## 참고 결과가 필요한 자리에서는 `FINISH`가 받아들여지지 않습니다. `CALL { }` 본문은 무언가를 투영해야 하므로, `FINISH`로 끝나는 본문은 `CALL subquery must RETURN at least one variable`을 냅니다. `FINISH`로 끝나는 쿼리는 [`NEXT`](next.md)의 왼쪽 피연산자가 될 수도 없습니다. 그 경우 `FINISH cannot be followed by NEXT`가 나옵니다. ```{note} `finish`는 2.18에서 예약 키워드가 됐습니다. 패턴 안의 레이블 이름으로는 따옴표 없이도 여전히 받아들여지며(`MATCH (n:finish)`), 업그레이드한 데이터베이스에 필요한 것이 그것입니다. 변수 이름, `CREATE VLABEL` 이름, SQL 식별자로는 받아들여지지 않습니다. 그 자리에는 `"finish"`로 쓰거나 이름을 바꾸십시오. 속성 키와 `RETURN` 별칭은 영향을 받지 않습니다. ``` {#finish-compatibility} ## 호환성 ```{admonition} GQL 적합성 :class: gql-conformance GQL *기본 결과 문장*(ISO/IEC 39075:2024 §14.10)의 `FINISH`를 구현합니다. 표준은 `FINISH`가 "빈 타입"을 가지며 실행 결과를 "결과가 생략된 성공"으로 설정한다고 규정하는데, 위의 컬럼 없는 빈 결과가 그것을 나타냅니다. - **지원** — 읽기 쿼리와 데이터를 바꾸는 쿼리의 마지막 문장으로 쓰는 `FINISH`. 후자의 경우 표준은 그것을 어차피 암시적인 것으로 봅니다(§13.1). - **미지원** — 집합 연산의 한 갈래로 쓰는 `FINISH`. 표준도 그것을 금지합니다(§14.2, 구문 규칙 5). AgensGraph는 컬럼 수 불일치로 거부합니다: `each UNION query must have the same number of columns`. 진행 상황은 [GQL 적합성 표](../../appendix/gql-conformance.md)에서 확인하십시오. ``` {#finish-opencypher} ### openCypher openCypher에는 `FINISH`가 없습니다. 거기서는 읽기 쿼리가 `RETURN`으로 끝나야 하고, 쓰기 쿼리는 자기 쓰기 절로 끝날 수 있습니다. AgensGraph는 두 번째 형태도 받으므로, `FINISH`는 무언가를 대체하는 것이 아니라 읽기 경우를 더해 줍니다. {#finish-see-also} ## 관련 항목 - [`RETURN`](return.md) — 쿼리를 끝내는 또 다른 방법 - [`ORDER BY`](order-by.md)와 [`SKIP`·`LIMIT`](skip-and-limit.md) — 끝맺는 절이 필요한 절들 - [`NEXT`](next.md) {bdg-secondary-line}`GQL` — `FINISH`가 앞설 수 없는 유일한 절 - [`INSERT`](insert.md) {bdg-secondary-line}`GQL` — `FINISH`로 끝낼 만한 쓰기 - [GQL 적합성 표](../../appendix/gql-conformance.md)