{#gql-conformance-gql-conformance} # GQL 적합성 AgensGraph는 ISO/IEC 39075:2024 *Information technology — Database languages — GQL* 의 일부를 구현합니다. 이 부록은 적합성을 남김없이 선언하는 문서가 아닙니다. 주요 주제를 알맞고 쓸모 있는 만큼 자세히 다룹니다. 아래 표는 표준의 세부 조항을 기준으로 삼습니다. 표준 자신이 구문 조각에 적합성 규칙을 붙일 때 쓰는 단위가 그것이기 때문입니다. 모든 행은 실제로 도는 2.18 서버에서 확인했습니다. 어떤 행이 **Yes**라고 말하는 것은 그 조항이 정의하는 구문이 받아들여졌고 조항이 요구하는 결과를 냈을 때뿐입니다. 조항의 구문 중 일부는 받아들여지고 나머지는 오류를 내면 **Partial**이고, 어느 것도 파싱되지 않으면 **No**입니다. 표준이 같은 생각을 여러 표기로 제시하는 곳에서는 AgensGraph가 어느 쪽을 취하는지를 비고에 적었습니다. 모든 행에 두루 해당하는 것 셋이 있으며, 비고마다 되풀이하지 않습니다. GQL은 별도의 모드가 아닙니다. GQL 문장과 Cypher 문장은 같은 파서를 지나며 한 파이프라인에서 섞일 수 있으므로, `LET`이 `WITH` 옆에 오고 `INSERT`가 `CREATE` 옆에 옵니다. [Cypher, GQL, SQL](../concepts/languages.md)을 참고하십시오. 그래프는 PostgreSQL 스키마이고 레이블은 테이블입니다. 그래서 디렉터리·스키마·그래프 타입의 카탈로그를 설명하는 표준의 부분들에는 GQL이 아니라 PostgreSQL 쪽 대응물이 있습니다. 작업 그래프는 `USE` 절이 아니라 `graph_path` 설정에서 오고, 권한은 PostgreSQL의 권한입니다. [그래프가 어떻게 저장되는가](../concepts/graph-on-postgresql.md)를 참고하십시오. 오류는 GQLSTATUS가 아니라 다섯 글자의 SQLSTATE를 지닙니다. [오류 코드](error-codes.md)를 참고하십시오. {#gql-conformance-supported-features} ## 지원하는 기능 아래 세부 조항은 전부 또는 일부가 구현돼 있습니다. **Partial**인 비고는 무엇이 빠졌는지를 가리키므로, 표준 GQL을 옮겨 오는 독자가 무엇을 살펴야 할지 알 수 있습니다. | 세부 조항 | 이름 | 지원 | 비고 | | --- | --- | --- | --- | | 8.1–8.4 | ``, ``, ``, `` | Yes | PostgreSQL 자신의 트랜잭션 문장이 이 조항들에 답합니다. `START TRANSACTION READ ONLY`·`COMMIT`·`ROLLBACK`이 모두 동작합니다. | | 9.2 | `` | Partial | `NEXT`가 한 문장을 앞 문장의 결과에 이어 붙입니다. `NEXT`는 `YIELD` 절을 지닐 수 없고, 9.2가 함께 허용하는 바인딩 변수 정의 블록은 없습니다. 아래 10.1–10.3을 참고하십시오. | | 11.1 | `` | Partial | `CURRENT_GRAPH`와 `CURRENT_PROPERTY_GRAPH`를 Cypher에서도 SQL에서도 받습니다. 키워드만으로 쓰며, `current_graph()`는 구문 오류입니다. 그 밖의 그래프 표현식 형태는 없습니다. | | 12.4 | `` | Partial | `CREATE GRAPH name`과 `CREATE GRAPH IF NOT EXISTS name`이 동작합니다. 표준이 이름 뒤에 요구하는 그래프 타입(`ANY`·`LIKE`·그래프 타입 참조)은 받지 않으며, `OR REPLACE`·`PROPERTY GRAPH`·`AS COPY OF`도 마찬가지입니다. | | 12.5 | `` | Partial | `DROP GRAPH name`과 `DROP GRAPH IF EXISTS name`이 동작하고, 표준에 없는 `CASCADE`도 있습니다. 새 그래프에 이미 `ag_vertex`와 `ag_edge`가 들어 있어 그것이 필요합니다. `DROP PROPERTY GRAPH`는 구문 오류입니다. | | 13.1 | `` | Yes | 문장 하나가 읽기 절과 쓰기 절을 한 파이프라인에 엮으며, 쓰기 절의 변경이 그 뒤의 읽기 절에 보입니다. | | 13.2 | `` | Yes | `INSERT`는 Cypher `CREATE`와 같은 패턴을 받으며 그것의 동의어입니다. | | 13.3 | `` | Partial | 속성 대입이 동작하며, 표준에 없는 `+=` 병합 형태도 있습니다. 이 조항이 함께 정의하는 레이블 집합 대입은 없습니다. 정점은 레이블을 정확히 하나 가집니다. | | 13.4 | `` | Partial | `REMOVE n.prop`이 속성을 지웁니다. 같은 까닭으로 `REMOVE n:Label`은 없습니다. | | 13.5 | `` | Yes | `DELETE`와 `DETACH DELETE`입니다. 간선이 남아 있는 정점을 지우는 것은 `DETACH`를 주지 않으면 거부됩니다. | | 14.2 | `` | Partial | `UNION`·`UNION ALL`·`EXCEPT`·`INTERSECT`가 쿼리 문장 둘을 엮습니다. `OTHERWISE`는 구문 오류입니다. | | 14.3 | `` and `` | Yes | 쿼리는 아래의 기본 쿼리 문장을 이어 놓은 것이며, 기본 결과 문장으로 끝납니다. | | 14.4 | `` | Partial | `MATCH`와 `OPTIONAL MATCH`가 동작합니다. 중괄호 형태 `OPTIONAL { MATCH … MATCH … }`는 구문 오류입니다. | | 14.5 | `` | Partial | 두 호출 형태 모두 동작합니다. 각각이 무엇을 요구하는지는 15.2와 15.3을 참고하십시오. | | 14.6 | `` | Yes | `FILTER expr`과 `FILTER WHERE expr` 둘 다 됩니다. | | 14.7 | `` | Yes | 더하는 방식이고 행 단위이며 쿼리를 이끌 수도 있습니다. `LET` 표현식 안의 집계는 거부됩니다. | | 14.8 | `` | Partial | 리스트 순회가 동작하며 `WITH OFFSET AS name`이 0부터 시작하는 인덱스를 줍니다. `WITH ORDINALITY`는 구문 오류이고, `FOR`는 바인딩 테이블을 순회하지 못합니다. | | 14.9 | `` | Yes | `ORDER BY`·`SKIP`·`OFFSET`·`LIMIT`이 그 자체로 문장이며 파이프라인 어디에나 놓입니다. 표준과 마찬가지로 AgensGraph도 이것들이 쿼리를 *끝맺게* 하지 않습니다. 14.3이 기본 결과 문장으로 끝날 것을 요구하므로, `ORDER BY`로 끝나는 쿼리는 `ERROR: Cypher query must end with RETURN, FINISH or update clause`를 냅니다. | | 14.10 | `` | Yes | `RETURN`, `RETURN … ORDER BY …`, 그리고 `FINISH`입니다. | | 14.11 | `` | Partial | `RETURN`·`RETURN DISTINCT`·`RETURN ALL`·`RETURN *`과 명시적 별칭입니다. `RETURN NO BINDINGS`는 구문 오류입니다. 묶음(grouping)은 암시적입니다. 16.15를 참고하십시오. | | 15.1 | `` and `` | Yes | `CALL`과 `OPTIONAL CALL`이며 두 호출 형태 모두에 적용됩니다. | | 15.2 | `` | Partial | `CALL (v) { … }`·`CALL () { … }`·`CALL (*) { … }`·`CALL { WITH v … }`가 모두 올바르게 가져옵니다. 그냥 쓴 `CALL { … }`은 표준과 다릅니다. 구문 규칙 3은 변수 범위 절이 없으면 들어오는 작업 레코드의 *모든* 필드를 가리키는 것으로 다시 쓰라고 하므로, 표준대로라면 `CALL (*) { … }`처럼 전부를 가져옵니다. AgensGraph는 대신 아무것도 가져오지 않으면서 오류도 내지 않으므로, 쿼리가 보이는 것과 다른 물음에 답하게 됩니다. 언제나 가져올 변수 목록을 적으십시오. 서브쿼리 본문의 쓰기 절은 거부되고 `IN TRANSACTIONS`는 없습니다. | | 15.3 | `` | Partial | `CALL routine(args) YIELD item [AS alias]`와 `YIELD *`가 동작하며, 인수가 이미 범위에 있는 변수를 참조하면 상관 호출이 됩니다. 조항은 `YIELD`를 선택으로 두지만 여기서는 필수이고, 이 절은 쿼리를 이끌 수도 끝맺을 수도 없습니다. 이름은 17.5가 설명하는 카탈로그의 프로시저가 아니라 PostgreSQL 함수로 해석됩니다. 기본 서버에는 프로시저가 등록돼 있지 않고, 프로시저를 부르면 `() is a procedure`가 납니다. | | 16.3 | `` | Partial | 그래프 패턴이 바인딩 테이블을 만듭니다. 이 조항이 함께 허용하는 패턴 `YIELD` 절은 구문 오류입니다. | | 16.4 | `` | Partial | 쉼표로 구분한 경로 패턴이 동작합니다. 일치 모드(`DIFFERENT EDGES`·`REPEATABLE ELEMENTS`)와 `KEEP` 절은 구문 오류입니다. | | 16.5 | `` | Yes | `INSERT`나 `CREATE` 뒤의 패턴은 정점을, 간선을, 또는 이미 묶인 정점 사이의 간선을 만들 수 있습니다. | | 16.7 | `` | Partial | 이어 붙이기가 동작합니다. 경로 다중집합 선택과 경로 패턴 합집합 — `\|` 로 구분한 경로 패턴 둘 — 은 구문 오류입니다. | | 16.8 | `