Cypher, GQL, SQL#
AgensGraph는 세 가지 언어로 질문에 답합니다. 세 가지 제품도, 세 가지 모드도, 세 가지 연결도 아닙니다. 파서 하나, 플래너 하나, 테이블 한 벌, 통신 프로토콜 하나가 있고, 문장마다 언어를 고릅니다 — 또는 한 문장에서 둘을 섞습니다.
Cypher는 그래프 언어이며 가장 완전한 표면입니다. 그래프가 할 수 있는 모든 것에 Cypher에서 닿을 수 있습니다.
GQL은 표준 그래프 쿼리 언어인 ISO/IEC 39075입니다. AgensGraph에서 이것은 별도의 방언이
아닙니다. GQL 문장은 Cypher 문장이 허용되는 곳이면 어디서나 허용됩니다. LET, NEXT, FILTER,
FINISH, INSERT, FOR, CALL { }, 그리고 서브쿼리 값 표현식인 EXISTS { }와 VALUE { }입니다.
켜야 할 스위치도, 별도의 파서도 없습니다. 표준의 어느 부분이 들어와 있는지는
GQL 적합성이 기록합니다.
SQL은 PostgreSQL의 것 그대로입니다. PostgreSQL에서 알고 있는 모든 테이블, 뷰, 함수, 확장, 롤, 트랜잭션이 여기 있고, 그래프는 SQL에게 보통 테이블로 보입니다.
무엇을 고를까#
취향이 아니라 질문의 모양으로 고르십시오:
관계를 따라가는 것 — 어떤 사람이 어떤 영화와 어떻게 연결되는지, 두 영화가 얼마나 떨어져 있는지, 세 홉 안에 무엇에 도달할 수 있는지 — 이것이 그래프 패턴이 있는 이유입니다. SQL의 조인 사슬은 같은 것을 몇 배의 길이로 말하며, “몇 홉이든”은 아예 표현할 수 없습니다.
집계, 윈도, 집합 연산, 보통 테이블과의 조인, 그리고 관리 작업 전반은 SQL의 것이고, Cypher는 그것을 대신하려 하지 않습니다.
GQL은 표준의 표기를 쓰고 싶을 때, 또는 그래프 데이터베이스를 여러 개 상대로 작성하며 이식 가능한 형태를 원할 때 씁니다.
INSERT와CREATE는 같은 일을 하고,FILTER와WHERE도 같은 일을 합니다.
한 번 고르고 끝낼 필요는 없습니다. SQL과 Cypher 섞기가 그 교차점을 다루는 페이지 하나를 온전히 쓰고 있으며, 이미 SQL을 아는 독자에게는 이 매뉴얼에서 가장 유용한 부분입니다.
SQL을 알고 있다면#
그래프는 스키마이고 레이블은 테이블이므로, 두 언어의 어휘는 구문에서 보이는 것보다 훨씬 가깝게 대응됩니다:
SQL |
Cypher |
비고 |
|---|---|---|
|
|
그래프가 곧 스키마입니다. |
|
|
정점 레이블입니다. 간선은 |
|
|
|
|
|
|
|
|
패턴은 간선을 따라가는 조인입니다. |
|
|
일치하지 않은 행은 null과 함께 돌아옵니다. |
|
|
먼저 찾고 그다음 씁니다. |
|
|
|
|
|
Cypher의 |
|
|
|
|
|
표현식 인덱스가 됩니다. |
|
같습니다 |
집계 함수는 PostgreSQL의 것입니다. |
|
|
시스템 카탈로그를 참고하십시오. |
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라는 이름의 속성을
찾고, 그런 속성이 없으면 아무것도 반환하지 않습니다.
한 문장, 두 언어#
SQL이 테이블을 기대하는 자리에 Cypher 쿼리가 올 수 있습니다:
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이 올 수 있습니다:
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"
위 둘은 모두 예제 데이터셋에서 실행됩니다.
이번 릴리스에서 “GQL 지원”이 뜻하는 것#
GQL은 두 번째 언어로서가 아니라 기존 문법에 추가된 문장으로 AgensGraph에 들어왔습니다. 여기서 분명히 말해 둘 만한 결과가 두 가지 따라옵니다.
GQL 문장은 한 쿼리 안에서 Cypher와 섞일 수 있습니다 — MATCH … LET … RETURN도 유효한 문장이고
MATCH … FILTER … NEXT RETURN …도 그렇습니다. 어떤 쿼리를 “GQL”이라고 표시하는 것은 없습니다.
그리고 적합성은 부분적이며, 모드 단위가 아니라 기능 단위입니다. GQL 적합성이 ISO/IEC 39075:2024의 하위 조항에 대해 기능별로 그것을 나열하며, 레퍼런스의 각 절 페이지도 그 절에 대한 같은 내용을 자기 호환성 제목 아래에 반복해 둡니다.