{#keywords-keywords} # 키워드 AgensGraph는 PostgreSQL의 키워드 목록을 물려받고 거기에 자기 그래프 문장에 필요한 단어를 더합니다. 키워드의 범주가 그 단어를 여전히 이름으로 쓸 수 있는 자리를 정합니다. **비예약**어는 무엇의 이름으로도 쓸 수 있습니다. **예약**어는 그럴 수 없고 먼저 큰따옴표로 감싸야 합니다. 물려받은 SQL 단어와 그 범주는 PostgreSQL의 [Key Words](https://www.postgresql.org/docs/18/sql-keywords-appendix.html) 부록이 나열합니다. 이 페이지는 AgensGraph가 더하고 바꾸는 것만 다룹니다. PostgreSQL이 쓰는 범주 중 *타입/함수 이름*과 *컬럼 이름* 둘에는 AgensGraph의 항목이 없습니다. 아래의 모든 단어는 비예약어이거나 완전한 예약어입니다. 식별자는 SQL 방식대로 큰따옴표로 감쌉니다. 백틱은 구문 오류이므로 `` `let` `` 은 회피 표기로 통하지 않습니다. `"let"` 이라고 쓰십시오. {#keywords-words-agensgraph-adds} ## AgensGraph가 더하는 단어 아래 스물네 단어는 AgensGraph의 키워드 목록에 있고 PostgreSQL 18의 목록에는 없습니다. 비고는 그 단어가 속한 절이나 문장을 가리킵니다. | 단어 | 범주 | 비고 | | --- | --- | --- | | `allshortestpaths` | 비예약 | 경로 함수. 두 정점 사이의 모든 최단 경로입니다. | | `assert` | 비예약 | `CREATE CONSTRAINT … ASSERT` 입니다. | | `collect` | 비예약 | `COLLECT { }` 서브쿼리 표현식입니다. | | `contains` | 비예약 | `CONTAINS` 문자열 조건입니다. | | `count` | 비예약 | `COUNT { }` 서브쿼리 표현식입니다. | | `current_graph` | **예약** | 키워드만으로 쓰는 작업 그래프입니다. | | `current_property_graph` | **예약** | `CURRENT_GRAPH`의 동의어입니다. | | `dijkstra` | 비예약 | 경로 함수. 가중치가 있는 최단 경로입니다. | | `elabel` | 비예약 | `CREATE ELABEL`·`ALTER ELABEL`·`DROP ELABEL` 입니다. | | `ends` | 비예약 | `ENDS WITH` 문자열 조건입니다. | | `finish` | **예약** | 아무것도 투영하지 않는 쿼리를 끝내는 `FINISH` 절입니다. | | `graph` | 비예약 | `CREATE GRAPH`·`DROP GRAPH`, 그리고 `graph_path` 설정의 문장들입니다. | | `let` | **예약** | `LET` 절입니다. | | `optional` | 비예약 | `OPTIONAL MATCH`와 `OPTIONAL CALL` 입니다. | | `property` | 비예약 | `CREATE PROPERTY INDEX`·`CURRENT_PROPERTY_GRAPH` 입니다. | | `remove` | 비예약 | `REMOVE` 절입니다. | | `shortestpath` | 비예약 | 경로 함수. 최단 경로 하나입니다. | | `single` | 비예약 | `single()` 리스트 조건입니다. | | `size` | 비예약 | `size()` 함수입니다. | | `starts` | 비예약 | `STARTS WITH` 문자열 조건입니다. | | `unwind` | **예약** | `UNWIND` 절입니다. | | `vlabel` | 비예약 | `CREATE VLABEL`·`ALTER VLABEL`·`DROP VLABEL` 입니다. | | `xor` | **예약** | `XOR` 불리언 연산자입니다. | | `yield` | 비예약 | `CALL … YIELD` 입니다. | AgensGraph가 물려받은 단어 넷은 여기서 예약어이고 PostgreSQL에서는 비예약어입니다. 각각이 Cypher 절을 이끌기 때문입니다. `insert`·`match`·`merge`·`return` 입니다. `CALL`은 일부러 비예약어로 두었으므로 `call`은 여전히 컬럼·테이블·별칭·레이블·속성 키·변수의 이름이 됩니다. 뜻이 달라지는 표기는 정확히 둘입니다. 렉서가 `CALL` 뒤에 `(`나 `{`가 올 때 그것을 특별하게 다루기 때문입니다: - `call(...)` — 이름이 글자 그대로 `call`인 함수를 인수와 함께 호출하는 것입니다. 따옴표로 감싸십시오. `"call"(1)` 입니다. - `(call { ... })` — 변수 이름이 `call`이고 레이블 없이 속성 맵을 지닌 정점 패턴입니다. 따옴표로 감싸십시오. `("call" { ... })` 입니다. {#keywords-words-that-became-reserved-in-218} ## 2.18에서 예약어가 된 단어 2.18에서 예약어이고 2.17에서는 아니었던 단어가 여섯입니다. `insert`·`finish`·`let`·`xor`· `current_graph`·`current_property_graph` 입니다. 단어를 예약하면 그것을 이름으로 쓰던 애플리케이션이 망가질 수 있으므로, 각각을 문법이 허락하는 만큼 좁게 만들었습니다. 그래서 결과가 한결같지 않습니다. 여전히 통하는 자리가 있으며, 아래 표는 일반 규칙이 아니라 실제로 재어 본 결과입니다. 각 칸은 그 자리를 2.18 서버에서 실제로 실행해 본 결과입니다. **된다**는 따옴표 없는 단어가 받아들여졌다는 뜻입니다. | 단어 | 패턴 안의 레이블 | `CREATE VLABEL` | 변수 | `RETURN … AS` 별칭 | 정렬 키로 쓴 별칭 | 속성 키 | | --- | --- | --- | --- | --- | --- | --- | | `insert` | 된다 | 안 된다 | 된다 | 된다 | 된다 | 된다 | | `finish` | 된다 | 안 된다 | 안 된다 | 된다 | 안 된다 | 된다 | | `let` | 안 된다 | 안 된다 | 안 된다 | 된다 | 안 된다 | 된다 | | `xor` | 안 된다 | 안 된다 | 안 된다 | 된다 | 안 된다 | 된다 | | `current_graph` | 안 된다 | 안 된다 | 안 된다 | 된다 | 된다 | 된다 | | `current_property_graph` | 안 된다 | 안 된다 | 안 된다 | 된다 | 된다 | 된다 | 그 표에서 두 열이 이상하게 읽히므로, 둘 다 말로 적어 둡니다. `insert`와 `finish`는 레이블로 쓸 때 패턴에서는 되고 레이블 DDL에서는 안 됩니다. `CREATE (:insert)`와 `MATCH (n:insert)`는 받아들여집니다. `CREATE VLABEL insert`는 그렇지 않습니다: ```cypher CREATE VLABEL insert; ``` ``` ERROR: syntax error at or near "insert" ``` 레이블은 따옴표로 감싼 이름으로 만드십시오. `CREATE VLABEL "insert"` 입니다. 그 뒤에도 따옴표 없는 패턴 표기가 그것을 찾습니다. 따옴표 없는 식별자는 소문자로 내려가기 때문입니다. 별칭은 언제나 되지만 그 별칭으로 정렬하는 것은 늘 되지는 않습니다. `RETURN n.k AS let`은 받아들여지고 그 뒤의 `ORDER BY let`은 그렇지 않습니다: ```cypher MATCH (n:t) RETURN n.k AS let ORDER BY let; ``` ``` ERROR: syntax error at or near "let" ``` `current_graph`와 `current_property_graph`가 예외입니다. 이 두 이름의 별칭은 정렬됩니다. 이름을 큰따옴표로 감싸면 실패하는 칸이 모두 해결됩니다. 정의할 때와 쓸 때 모두 감싸야 합니다: ```cypher MATCH (n:t) RETURN n.k AS "let" ORDER BY "let"; ``` 속성 키에는 따옴표가 결코 필요하지 않습니다. 키는 식별자가 아니라 `jsonb` 문서 안의 문자열이므로, `CREATE (:t {let: 1})`과 `RETURN n.let`은 이 모든 것에 영향을 받지 않습니다. SQL 쪽에서도 같은 여섯 단어는 컬럼 이름으로 쓸 때 따옴표가 필요합니다. `CREATE TABLE t (xor int)`은 구문 오류이고 `CREATE TABLE t ("xor" int)`는 됩니다. {#keywords-the-reserved-set-is-wider-than-the-graph-words} ## 예약어 집합은 그래프 단어보다 넓다 그래프 절을 위해 단어를 예약하는 것은 전체 그림의 일부일 뿐입니다. AgensGraph는 PostgreSQL의 예약어도 물려받습니다. Cypher의 레이블이나 변수도 같은 문법의 식별자이므로, 그중 무엇이든 따옴표 없이는 거부됩니다. `both`가 좋은 예입니다. 그래프와 아무 상관이 없는 PostgreSQL 예약어입니다: ```cypher CREATE VLABEL both; ``` ``` ERROR: syntax error at or near "both" ``` `all`·`and`·`any`·`array`·`as`·`case`·`cast`·`end`·`from`·`in`·`not`·`null`·`or`·`select`· `table`·`to`·`union`·`when`·`where`와 PostgreSQL 예약어 목록의 나머지도 마찬가지입니다. 레이블· 변수·속성 인덱스의 이름을 고르기 전에 PostgreSQL의 [Key Words](https://www.postgresql.org/docs/18/sql-keywords-appendix.html) 부록에 비추어 확인하십시오. AgensGraph가 지닌 모든 SQL 단어의 범주가 거기에 있습니다. ```{note} 키워드 목록은 AgensGraph 소스의 파일 하나이며, 단어마다 범주와 함께 한 줄씩 적혀 있습니다. 어떤 이름이 거부되는데 이 페이지가 그 까닭을 말해 주지 않으면 그것을 보십시오. ``` {#keywords-see-also} ## 관련 항목 - [구문](../reference/syntax.md) — 식별자 접기를 포함한 어휘 규칙 - [Cypher 호환성](cypher-compatibility.md) — 옮겨 온 쿼리가 부딪히는 그 밖의 차이 - [2.18로 업그레이드하기](../release_notes/upgrade-to-2.18.md) — 업그레이드 전 점검 목록 전부 - [AgensGraph 2.18.6.0 릴리스 노트](../release_notes/2.18.md) — 이 단어들이 쓰이는 절