그래프DB 언어는 크게 2가지로 나뉩니다.
1. Property Graph 계열
- Gremlin -> 오늘의 주제!
- Cypher (Neo4j)
- PGQL
- SQL/PGQ
- GQL
2. RDF / Knowledge Graph 계열
- SPARQL
오라클은 2계열 다 가능 합니다.
Oracle Property Graph → PGQL, SQL/PGQ
Oracle RDF / Knowledge Graph → SPARQL
언어 주 사용처 그래프 모델 성격 대표 제품
| 언어 | 주 사용처 | 그래프 모델 | 성격 | 대표 제품 |
| Gremlin | TinkerPop 계열 | Property Graph | 순회 중심 traversal language | JanusGraph, DSE Graph, Amazon Neptune, Cosmos DB Gremlin API |
| Cypher | Neo4j 계열 | Property Graph | 선언형 pattern matching language | Neo4j, Memgraph, openCypher 계열 |
| PGQL | Oracle Graph 계열 | Property Graph | SQL 비슷한 그래프 패턴 질의 언어 | Oracle Graph Server, Oracle Database Property Graph |
| SQL/PGQ | SQL 표준 그래프 질의 | Property Graph | SQL 안에 포함된 표준 그래프 질의 기능 | Oracle Database 23ai 이상 |
| GQL | ISO 표준 그래프 질의 언어 | Property Graph | 독립형 표준 그래프 질의 언어 | 향후 표준 기반 그래프 DB |
| SPARQL | RDF / Semantic Web | RDF Graph | RDF triple 질의 표준 | Oracle RDF Graph, GraphDB, Stardog, RDF store |
# Gremlin
Gremlin은 Apache TinkerPop의 그래프 traversal language입니다. TinkerPop은 그래프 DB와 그래프 분석 시스템을 위한 graph computing framework이고, Gremlin은 그 안에서 property graph를 질의하고 순회하는 언어입니다.
예:
g.V().
has('Customer', 'customer_id', 'customer_0').
out('uses').
values('cc_num')
의미:
Customer 정점에서 시작해서
uses 간선을 따라가고
도착한 정점의 cc_num 값을 가져온다.
Gremlin의 핵심은 그래프 위를 어떻게 이동할지 단계별로 적는 것입니다.
V() → has() → out() → values()
그래서 Gremlin은 복잡한 경로 탐색, 반복 탐색, 조건부 이동, depth 제한 탐색에 강합니다. TinkerPop 문서도 Gremlin이 “write once, run anywhere” 철학으로 설계되어 TinkerPop 지원 그래프 시스템에서 실행될 수 있고, OLTP 질의와 OLAP 분석 모두에 사용할 수 있다고 설명합니다.
# Cypher
Cypher는 Neo4j에서 시작한 선언형 그래프 질의 언어입니다. Neo4j 문서는 Cypher를 Neo4j의 declarative query language라고 설명합니다.
예:
MATCH (:Customer {customer_id: 'customer_0'})-[:uses]->(card)
RETURN card.cc_num
Gremlin과 같은 의미지만 표현 방식이 다릅니다.
Gremlin은:
어디서 시작해서 어느 방향으로 이동할지 단계별로 적는다.
Cypher는:
찾고 싶은 그래프 모양을 그림처럼 적는다.
즉, Cypher는 이런 패턴을 직접 표현합니다.
(Customer)-[:uses]->(card)
그래서 Cypher는 SQL에 익숙한 사람, 분석가, 업무 담당자가 읽기 쉽습니다. Neo4j, Memgraph, openCypher 계열 DB에서 많이 씁니다.
# Oracle PGQL
오라클에서 전통적으로 property graph를 질의할 때 많이 쓰는 언어가 PGQL입니다.
PGQL은 Property Graph Query Language의 약자입니다. Oracle 공식 문서는 PGQL을 “vertices와 edges로 구성되고 key-value property를 가진 property graph 구조를 위한 SQL-like query language”라고 설명합니다. 또한 graph pattern matching 개념을 기반으로 한다고 설명합니다.
예:
SELECT card.cc_num
FROM MATCH (c:Customer)-[:uses]->(card)
WHERE c.customer_id = 'customer_0'
제품/버전에 따라 문법 차이는 있을 수 있지만, 핵심 느낌은 이렇습니다.
SQL처럼 SELECT / FROM / WHERE를 쓰면서
FROM 안에서 그래프 패턴을 매칭한다.
Oracle PGQL의 장점은 Oracle SQL 사용자에게 친숙하다는 점입니다.
SQL 개발자가 그래프 질의를 비교적 쉽게 배울 수 있다.
Oracle Database 안의 테이블 데이터를 property graph로 바라볼 수 있다.
Oracle Graph Server / PGX와 연결된다.
PGQL 공식 사이트는 PGQL이 Oracle Database 12.2부터 standalone language로 포함되었고, Oracle Database 23ai에서는 property graph가 SQL 안에 더 직접적으로 통합되었지만 PGQL도 계속 사용 가능하다고 설명합니다.
# Oracle SQL/PGQ
Oracle Database 23ai부터 더 중요해진 것이 SQL/PGQ입니다.
SQL/PGQ는 SQL Property Graph Queries의 약자입니다. Oracle은 Oracle Database 23ai에서 SQL/PGQ를 제공한다고 설명합니다. SQL/PGQ는 SQL:2023 표준의 Part 16으로 추가된 기능이며, property graph를 만들고 질의할 수 있게 합니다.
핵심은 이것입니다.
SQL 안에서 property graph를 직접 만들고 질의한다.
예시 형태:
SELECT *
FROM GRAPH_TABLE (
simple_c360
MATCH (c IS Customer)-[e IS uses]->(card)
WHERE c.customer_id = 'customer_0'
COLUMNS (card.cc_num AS cc_num)
);
정확한 문법은 Oracle 버전과 graph 정의 방식에 따라 달라질 수 있지만, 개념은 다음과 같습니다.
GRAPH_TABLE 안에서 그래프 패턴을 매칭하고,
결과를 SQL 테이블처럼 반환한다.
Oracle이 SQL/PGQ를 밀고 있는 이유는 분명합니다.
기존 Oracle 테이블 데이터를 복제하지 않고 graph view처럼 질의할 수 있다.
SQL 도구, 권한, 보안, 트랜잭션과 자연스럽게 통합된다.
기존 SQL 개발자가 별도 그래프 전용 언어를 새로 배우는 부담이 줄어든다.
Oracle 블로그도 property graph in SQL이 기존 테이블 위의 view-like object로 작동하므로 데이터를 복제할 필요가 없고, SQL 생태계와 통합된다고 설명합니다.
# GQL
GQL은 Graph Query Language입니다.
이건 특정 회사 제품 언어가 아니라 ISO 표준 그래프 질의 언어입니다.
관계형 DB에 SQL이 있다면, property graph 쪽에는 GQL이 표준 언어 역할을 하려는 위치입니다.
SQL → relational database 표준 언어
GQL → property graph database 표준 언어
다만 현장에서 당장 많이 쓰는 것은 아직 제품별 언어입니다.
Neo4j → Cypher
TinkerPop 계열 → Gremlin
Oracle → PGQL, SQL/PGQ
GQL은 Cypher, PGQL, SQL/PGQ 등 여러 흐름의 영향을 받은 표준화 결과로 보면 됩니다. Oracle 문서도 ISO/IEC GQL을 property graph 표준 언어로, SPARQL을 RDF graph 표준 언어로 구분해 언급합니다.
# SPARQL
SPARQL은 위 언어들과 조금 다릅니다.
Gremlin, Cypher, PGQL, SQL/PGQ, GQL은 보통 property graph 계열입니다.
반면 SPARQL은 RDF graph 질의 언어입니다.
RDF는 데이터를 보통 triple로 표현합니다.
subject - predicate - object
예:
customer_0 uses card_1234
card_1234 cc_num "1234-5678"
SPARQL 예:
SELECT ?cc_num
WHERE {
?customer :customer_id "customer_0" .
?customer :uses ?card .
?card :cc_num ?cc_num .
}
W3C SPARQL 문서는 RDF를 directed labeled graph data model이라고 설명하고, SPARQL을 RDF를 질의하기 위한 언어라고 정의합니다.
Oracle도 RDF Graph / Knowledge Graph 기능에서 SPARQL query와 SPARQL update를 지원합니다. Oracle 문서에는 Oracle RDF objects에서 SPARQL query를 사용할 수 있다고 나옵니다.
# Oracle 기준으로 정리
오라클에서 “그래프 DB 언어”라고 하면 하나만 있는 게 아닙니다.
Oracle Property Graph
├─ PGQL
└─ SQL/PGQ
Oracle RDF / Knowledge Graph
└─ SPARQL
## Oracle Property Graph
업무 데이터가 보통 이런 식이면 property graph가 맞습니다.
고객 - 카드 - 거래 - 가맹점 - 계좌 - 주소 - 기기
이때는:
PGQL 또는 SQL/PGQ
를 씁니다.
Oracle 23ai 이후 신규 구축이면 개인적으로는 SQL/PGQ 우선으로 보는 게 맞습니다. 이유는 SQL 표준과 Oracle Database 내부 기능으로 통합되는 방향이기 때문입니다.
다만 Oracle Graph Server / PGX, 기존 Oracle Graph 예제, 기존 프로젝트와 맞춰야 한다면 PGQL도 여전히 중요합니다.
## Oracle RDF / Knowledge Graph
데이터가 온톨로지, 의미망, RDF triple, linked data 중심이면:
SPARQL
을 씁니다.
예:
공공데이터 지식그래프
온톨로지
표준 어휘
메타데이터 관계
시맨틱 검색
추론 기반 질의
# 같은 질의로 비교해 보기
질문에서 봤던 Gremlin:
g.V().
has('Customer', 'customer_id', 'customer_0').
out('uses').
values('cc_num')
Cypher
MATCH (:Customer {customer_id: 'customer_0'})-[:uses]->(card)
RETURN card.cc_num
Oracle PGQL
SELECT card.cc_num
FROM MATCH (c:Customer)-[:uses]->(card)
WHERE c.customer_id = 'customer_0'
Oracle SQL/PGQ
SELECT cc_num
FROM GRAPH_TABLE (
simple_c360
MATCH (c IS Customer)-[e IS uses]->(card)
WHERE c.customer_id = 'customer_0'
COLUMNS (card.cc_num AS cc_num)
);
SPARQL
SELECT ?cc_num
WHERE {
?customer :customer_id "customer_0" .
?customer :uses ?card .
?card :cc_num ?cc_num .
}
같은 “고객이 사용하는 카드 번호 조회”라도 언어별 사고방식이 다릅니다.
| 언어 | 사고방식 |
| Gremlin | 정점에서 출발해서 간선을 따라 이동 |
| Cypher | 노드-관계 패턴을 그림처럼 매칭 |
| PGQL | SQL 스타일로 그래프 패턴 매칭 |
| SQL/PGQ | SQL 안의 GRAPH_TABLE로 그래프 질의 |
| SPARQL | RDF triple 패턴 매칭 |
# 최종 요약
Gremlin
- TinkerPop 계열
- 순회 중심
- JanusGraph, DSE Graph, Neptune 등
Cypher
- Neo4j 계열
- 패턴 매칭 중심
- 가독성 좋음
PGQL
- Oracle property graph 전용/중심 언어
- SQL과 비슷한 그래프 패턴 질의
SQL/PGQ
- SQL:2023 표준의 property graph 질의
- Oracle Database 23ai에서 중요
- SQL 안에서 GRAPH_TABLE로 그래프 질의
GQL
- ISO 표준 property graph 질의 언어
- 장기적으로 표준 방향
SPARQL
- RDF graph 표준 질의 언어
- Oracle RDF / Knowledge Graph에서 사용
# 추가설명 RDF
RDF는 Resource Description Framework의 약자입니다.
한국어로 풀면 대략:
자원 설명 프레임워크
입니다.
뜻
RDF는 웹이나 데이터베이스 안의 “대상”을 주어-술어-목적어 형태로 표현하는 데이터 모델입니다.
Subject - Predicate - Object
주어 - 관계/속성 - 목적어
예를 들면:
customer_0 uses card_1234
card_1234 cc_num "1234-5678"
kim livesIn Chuncheon
이런 식입니다.
쉽게 말하면
RDF는 데이터를 이런 문장들의 집합으로 저장합니다.
A는 B와 관계가 있다.
A의 속성은 C이다.
예:
김철수는 춘천에 산다.
김철수는 춘천시청에서 일한다.
춘천시는 강원특별자치도에 속한다.
RDF식으로 보면:
김철수 - 거주지 - 춘천
김철수 - 근무지 - 춘천시청
춘천시 - 소속광역단체 - 강원특별자치도
RDF에서 중요한 단위: Triple
RDF의 기본 단위는 트리플(triple)입니다.
주어 + 술어 + 목적어
예:
<customer_0> <uses> <card_1234>
이 트리플들이 많이 모이면 그래프가 됩니다.
customer_0 ──uses──> card_1234 ──cc_num──> "1234-5678"
RDF는 보통 지식그래프, 온톨로지, 시맨틱 웹, 표준 용어 체계, 공공데이터 연결 같은 곳에서 많이 씁니다.
예:
사람-기관-지역-법령-사업-문서-개념 사이의 의미 관계 표현