{#languages-cypher-gql-and-sql} # Cypher, GQL, SQL AgensGraph는 세 가지 언어로 질문에 답합니다. 세 가지 제품도, 세 가지 모드도, 세 가지 연결도 아닙니다. 파서 하나, 플래너 하나, 테이블 한 벌, 통신 프로토콜 하나가 있고, 문장마다 언어를 고릅니다 — 또는 한 문장에서 둘을 섞습니다. **Cypher**는 그래프 언어이며 가장 완전한 표면입니다. 그래프가 할 수 있는 모든 것에 Cypher에서 닿을 수 있습니다. **GQL**은 표준 그래프 쿼리 언어인 ISO/IEC 39075입니다. AgensGraph에서 이것은 별도의 방언이 아닙니다. GQL 문장은 Cypher 문장이 허용되는 곳이면 어디서나 허용됩니다. `LET`, `NEXT`, `FILTER`, `FINISH`, `INSERT`, `FOR`, `CALL { }`, 그리고 서브쿼리 값 표현식인 `EXISTS { }`와 `VALUE { }`입니다. 켜야 할 스위치도, 별도의 파서도 없습니다. 표준의 어느 부분이 들어와 있는지는 [GQL 적합성](../appendix/gql-conformance.md)이 기록합니다. **SQL**은 PostgreSQL의 것 그대로입니다. PostgreSQL에서 알고 있는 모든 테이블, 뷰, 함수, 확장, 롤, 트랜잭션이 여기 있고, 그래프는 SQL에게 보통 테이블로 보입니다. {#languages-choosing} ## 무엇을 고를까 취향이 아니라 질문의 모양으로 고르십시오: * **관계를 따라가는 것** — 어떤 사람이 어떤 영화와 어떻게 연결되는지, 두 영화가 얼마나 떨어져 있는지, 세 홉 안에 무엇에 도달할 수 있는지 — 이것이 그래프 패턴이 있는 이유입니다. SQL의 조인 사슬은 같은 것을 몇 배의 길이로 말하며, "몇 홉이든"은 아예 표현할 수 없습니다. * **집계, 윈도, 집합 연산, 보통 테이블과의 조인, 그리고 관리 작업 전반**은 SQL의 것이고, Cypher는 그것을 대신하려 하지 않습니다. * **GQL**은 표준의 표기를 쓰고 싶을 때, 또는 그래프 데이터베이스를 여러 개 상대로 작성하며 이식 가능한 형태를 원할 때 씁니다. `INSERT`와 `CREATE`는 같은 일을 하고, `FILTER`와 `WHERE`도 같은 일을 합니다. 한 번 고르고 끝낼 필요는 없습니다. [SQL과 Cypher 섞기](../querying/combining-sql-and-cypher.md)가 그 교차점을 다루는 페이지 하나를 온전히 쓰고 있으며, 이미 SQL을 아는 독자에게는 이 매뉴얼에서 가장 유용한 부분입니다. {#languages-if-you-know-sql} ## SQL을 알고 있다면 [그래프는 스키마이고 레이블은 테이블](graph-on-postgresql.md)이므로, 두 언어의 어휘는 구문에서 보이는 것보다 훨씬 가깝게 대응됩니다: | SQL | Cypher | 비고 | | --- | --- | --- | | `CREATE SCHEMA s` | `CREATE GRAPH s` | 그래프가 *곧* 스키마입니다. | | `CREATE TABLE t` | `CREATE VLABEL t` | 정점 레이블입니다. 간선은 `CREATE ELABEL`입니다. | | `INSERT INTO t VALUES (…)` | `CREATE (:t {…})` | `INSERT (:t {…})`가 GQL 표기입니다. | | `SELECT … FROM t WHERE …` | `MATCH (n:t) WHERE … RETURN …` | `RETURN`이 결과 투영이며 맨 뒤에 옵니다. | | `SELECT … FROM a JOIN b ON …` | `MATCH (a)-[:e]->(b)` | 패턴은 간선을 따라가는 조인입니다. | | `LEFT JOIN` | `OPTIONAL MATCH` | 일치하지 않은 행은 null과 함께 돌아옵니다. | | `UPDATE t SET c = …` | `MATCH (n:t) SET n.c = …` | 먼저 찾고 그다음 씁니다. | | `DELETE FROM t WHERE …` | `MATCH (n:t) WHERE … DELETE n` | `DETACH DELETE`는 간선까지 함께 지웁니다. | | `WITH cte AS (…)` | `WITH …` / `NEXT` | Cypher의 `WITH`는 파이프라인을 나눕니다. CTE가 아닙니다. | | `ORDER BY` / `LIMIT` / `OFFSET` | `ORDER BY` / `LIMIT` / `SKIP` | `SKIP`과 `OFFSET`은 같은 뜻입니다. | | `CREATE INDEX ON t ((c))` | `CREATE PROPERTY INDEX ON t (c)` | 표현식 인덱스가 됩니다. | | `count(*)`, `sum`, `avg` | 같습니다 | 집계 함수는 PostgreSQL의 것입니다. | | `information_schema`, `pg_catalog` | `ag_graph`, `ag_label` | [시스템 카탈로그](../system_catalogs/index)를 참고하십시오. | SQL 사용자가 초반에 걸리는 차이가 세 가지 있고, 세 가지 모두 요란하게가 아니라 조용히 걸립니다: **속성 읽기는 텍스트가 아니라 `jsonb`를 반환합니다.** `RETURN m.title`은 `"The Matrix"`를 따옴표와 함께 출력하며, 쿼리 안에서 형 변환을 해도 달라지지 않습니다. 평범한 스칼라를 얻으려면 바깥에서 벗기십시오: `SELECT t #>> '{}' FROM (MATCH (m:movie) RETURN m.title AS t) q`. **`ORDER BY 2`는 "두 번째 컬럼"을 뜻하지 않습니다.** Cypher에서 `2`는 상수이므로 모든 행이 같다고 비교되어 아무것도 정렬되지 않습니다. 별칭이나 표현식으로 정렬하십시오. **`n.id`는 id가 아닙니다.** `id(n)`이 `graphid`를 반환합니다. `n.id`는 `id`라는 이름의 속성을 찾고, 그런 속성이 없으면 아무것도 반환하지 않습니다. {#languages-one-statement-two-languages} ## 한 문장, 두 언어 SQL이 테이블을 기대하는 자리에 Cypher 쿼리가 올 수 있습니다: ```psql SELECT q.title #>> '{}' AS film, r.score FROM (MATCH (:person {name: 'Christopher Nolan'})-[:directed]->(m:movie) RETURN m.title AS title) q JOIN rating r ON r.title = q.title #>> '{}' WHERE r.source = 'critics' ORDER BY r.score DESC; ``` ``` film | score --------------+------- Inception | 8.8 Interstellar | 8.7 ``` 그리고 Cypher가 값을 기대하는 자리에 SQL이 올 수 있습니다: ```cypher MATCH (m:movie) WHERE m.title = (SELECT to_jsonb(title) FROM rating WHERE source = 'critics' ORDER BY score DESC LIMIT 1) RETURN m.title AS best; ``` ``` best ------------- "Inception" ``` 위 둘은 모두 [예제 데이터셋](../get_started/example-dataset.md)에서 실행됩니다. {#languages-what-gql-support-means-in-this-release} ## 이번 릴리스에서 "GQL 지원"이 뜻하는 것 GQL은 두 번째 언어로서가 아니라 기존 문법에 추가된 문장으로 AgensGraph에 들어왔습니다. 여기서 분명히 말해 둘 만한 결과가 두 가지 따라옵니다. GQL 문장은 한 쿼리 안에서 Cypher와 섞일 수 있습니다 — `MATCH … LET … RETURN`도 유효한 문장이고 `MATCH … FILTER … NEXT RETURN …`도 그렇습니다. 어떤 쿼리를 "GQL"이라고 표시하는 것은 없습니다. 그리고 적합성은 부분적이며, 모드 단위가 아니라 기능 단위입니다. [GQL 적합성](../appendix/gql-conformance.md)이 ISO/IEC 39075:2024의 하위 조항에 대해 기능별로 그것을 나열하며, [레퍼런스](../reference/clauses/index)의 각 절 페이지도 그 절에 대한 같은 내용을 자기 *호환성* 제목 아래에 반복해 둡니다.