본문 바로가기
IT/oracle

그래프DB의 언어 정리 ( Oracle 중심 )

by 가능성1g 2026. 5. 14.
반응형

그래프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

RDFResource 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는 언제 많이 쓰나?
 

RDF는 보통 지식그래프, 온톨로지, 시맨틱 웹, 표준 용어 체계, 공공데이터 연결 같은 곳에서 많이 씁니다.

예:

사람-기관-지역-법령-사업-문서-개념 사이의 의미 관계 표현
 
 
반응형