2.2. Cypher 쿼리 언어 소개
2.2.1. Cypher의 철학과 문법 특징: 데이터를 그리는 언어
데이터베이스를 선택한다는 것은 단순히 데이터를 저장할 공간을 고르는 것이 아니라, 데이터를 바라보는 ‘관점’을 선택하는 것과 같습니다. 관계형 데이터베이스(RDB)의 SQL이 데이터를 ‘표(Table)’와 ‘집합(Set)’의 논리로 다룬다면, Neo4j의 Cypher(싸이퍼)는 데이터를 ‘연결(Connection)’과 ‘흐름(Flow)’의 관점에서 해석합니다.
IT 의사결정자와 개발자에게 Cypher를 이해하는 것은 단순한 기술 습득 그 이상입니다. 이는 복잡하게 얽힌 현대의 데이터(AI 지식 그래프, 실시간 사기 탐지, 복잡한 공급망 등)에서 비즈니스 맥락(Context)을 읽어내는 새로운 문해력을 갖추는 것과 같습니다. 기술적 성능뿐만 아니라, 데이터와 인간의 사고방식을 일치시키는 Cypher만의 독특한 철학을 심층 분석해 보겠습니다.
핵심 철학 1: 화이트보드 그대로 코드가 되다 (ASCII-Art 문법)
회의실 화이트보드에 동그라미(대상)와 화살표(관계)를 그리며 비즈니스 로직을 설명해 본 경험이 있으실 겁니다. Cypher의 가장 혁신적인 점은 이 ‘화이트보드 스케치’를 그대로 코드로 옮겨 적을 수 있다는 것입니다.
이를 기술적으로는 ‘ASCII-아트(ASCII-Art)’ 문법이라고 부릅니다. 그림을 글자로 형상화하듯, Cypher는 데이터의 구조를 시각적으로 표현합니다.
- 직관성의 극대화: 예를 들어
짐(Jim)이이안(Ian)을 알고,이안이에밀(Emil)을 아는 관계를 SQL로 생각하면,Person테이블을 두 번JOIN하는 복잡한 수식을 떠올려야 합니다. 하지만 Cypher에서는 아래와 같이 표현합니다.
- 선언적 언어(Declarative Language)의 진화: SQL과 Cypher 모두 ‘어떻게(How)’가 아니라 ‘무엇(What)’을 원하는지 명시하는 선언적 언어입니다. 하지만 차이가 있습니다.
-
- SQL: 결과물로 원하는 ‘표’의 형태를 정의합니다.
-
- Cypher: 결과물로 원하는 ‘패턴(그림)’을 정의합니다.
사용자는 그저 데이터 속에서 찾고 싶은 모양을 그려주기만 하면 됩니다. (“이런 모양으로 연결된 데이터를 찾아줘!”) 복잡한 연산 절차는 데이터베이스 엔진이 알아서 처리합니다. 덕분에 개발자와 현업 담당자가 같은 코드를 보며 소통할 수 있는 ‘공통 언어(Ubiquitous Language)’의 역할을 수행할 수 있습니다.
핵심 철학 2: 관계를 ‘계산’하지 않고 ‘기억’한다 (관계 중심 설계)
전통적인 관계형 데이터베이스(RDB)라는 이름에는 역설이 있습니다. 사실 RDB는 데이터 간의 ‘관계’를 저장하는 데 서 툽니다. RDB에서 관계를 확인하려면, A테이블과 B테이블을 억지로 연결하는 고비용의 JOIN 연산을 수행해야 합니다. 즉, 조회할 때마다 관계를 매번 다시 ‘계산’해내는 셈입니다.
반면, Cypher가 작동하는 그래프 데이터베이스 환경은 ‘관계 우선(Relationship First)’ 철학을 따릅니다.
- 인덱스 프리 인접성(Index-Free Adjacency)의 구현: Cypher는 수학적 그래프 이론에 기반하여 설계되었습니다. 데이터가 저장될 때부터 “누가 누구와 연결되어 있는지”에 대한 주소(포인터)를 물리적으로 함께 저장합니다.
- 탐색(Traversal)의 효율성: SQL이 거대한 도서관 목록을 뒤져 책을 찾는 방식(Index Scan)이라면, Cypher는 이미 연결된 실을 따라가며 책을 집어 드는 방식(Graph Traversal)입니다.
-
- 예시: “친구의 친구의 친구”를 찾는 경우, SQL은 데이터 양이 늘어날수록 성능이 기하급수적으로 떨어집니다(JOIN 폭발). 반면 Cypher는
(me)-[:FRIEND*3]->(fofof)와 같이 단순한 패턴으로, 데이터 크기와 무관하게 연결된 만큼만 빠르게 이동하여 결과를 가져옵니다.
- 예시: “친구의 친구의 친구”를 찾는 경우, SQL은 데이터 양이 늘어날수록 성능이 기하급수적으로 떨어집니다(JOIN 폭발). 반면 Cypher는
이처럼 Cypher는 관계를 데이터 모델의 ‘부가 정보’가 아닌 ‘일급 시민(First-class Citizen)‘으로 대우함으로써, 연결된 데이터에서 압도적인 성능과 표현력을 제공합니다.
문법적 특징 상세: GQL 표준의 기반
Cypher의 문법은 이제 Neo4j만의 전유물이 아닙니다. 그 직관성과 효율성을 인정받아, 2024년 제정된 국제 표준 그래프 쿼리 언어인 ISO GQL(Graph Query Language)의 핵심 기반이 되었습니다. Cypher의 주요 문법적 구성 요소는 다음과 같습니다.
노드 (Nodes): ()
-
- 데이터의 주체(엔티티)를 나타냅니다. 괄호
()모양이 마치 동그라미(노드)를 그린 것과 같습니다.
- 데이터의 주체(엔티티)를 나타냅니다. 괄호
-
- 예:
(p:Person)→ ‘Person’이라는 라벨을 가진 노드를 변수p로 지칭.
- 예:
관계 (Relationships): ->, <--, -
-
- 노드 간의 연결을 나타냅니다. 화살표 모양으로 방향성을, 대괄호
[]로 관계의 디테일을 표현합니다.
- 노드 간의 연결을 나타냅니다. 화살표 모양으로 방향성을, 대괄호
-
- 예:
[:LOVES]->→ ‘LOVES’라는 유형의 관계가 오른쪽으로 향함.
- 예:
레이블 (Labels): :Label
-
- 노드나 관계의 역할을 정의합니다. RDB의 테이블 이름과 유사한 역할을 하지만 훨씬 유연합니다. 하나의 노드가
:Person,:Developer,:Father등 여러 레이블을 동시에 가질 수 있습니다.
- 노드나 관계의 역할을 정의합니다. RDB의 테이블 이름과 유사한 역할을 하지만 훨씬 유연합니다. 하나의 노드가
속성 (Properties): (key: 'value')
-
- 노드와 관계 내부에 저장되는 실제 데이터입니다. JSON이나 파이썬의 딕셔너리(Dictionary) 구조와 유사하여 개발자에게 매우 친숙합니다.
-
- 예:
(name: 'Alice', age: 30)
- 예:
요약하자면, Cypher는 복잡한 수식이 난무하는 쿼리 언어가 아닙니다. “괄호로 노드를 감싸고, 화살표로 관계를 연결한다”는 단순한 원칙 아래, 비즈니스의 복잡한 로직을 직관적인 그림으로 환원시키는 강력한 도구입니다. 이것이 바로 전 세계 수많은 개발자와 데이터 과학자가 데이터 분석의 도구로 Cypher를 선택하는 이유입니다.
2.2.2. 기본 구문 요소: 질문의 시작과 끝, MATCH와 RETURN
외국어를 배울 때 ‘주어’와 ‘동사’만 알아도 기본적인 의사소통이 가능하듯, Cypher 쿼리 언어에서도 MATCH와 RETURN 두 가지 핵심 키워드만 이해하면 그래프 데이터베이스와 대화할 수 있습니다.
이 두 절(Clause)은 Cypher의 알파이자 오메가입니다. 복잡한 알고리즘이나 경로 탐색도 결국은 이 기본 구조 위에서 작동합니다. 따라서 이 섹션의 내용을 확실히 익히는 것은 그래프 데이터 조회라는 새로운 세계로 진입하는 가장 빠른 지름길이 될 것입니다.
MATCH 절 분석: 데이터의 ‘패턴’을 그리는 붓
MATCH 절은 Cypher 쿼리의 진입점(Entry Point)입니다. 데이터베이스에게 “내가 찾고 싶은 데이터의 모양(Pattern)은 이렇게 생겼어”라고 그림을 그려 설명하는 단계입니다.
RDB(관계형 데이터베이스)에 익숙한 분들을 위해 비유하자면, MATCH는 SQL의 FROM 절과 WHERE 절을 합친 것과 유사합니다. 하지만 테이블 이름을 명시하고 조건을 나열하는 SQL과 달리, Cypher는 데이터 간의 ‘연결 구조‘를 시각적으로 묘사한다는 점에서 결정적인 차이가 있습니다.
1. 가장 단순한 패턴: 특정 노드(엔티티) 찾기
가장 기본적인 MATCH는 특정 레이블(Label, RDB의 테이블 개념)을 가진 모든 노드를 찾는 것입니다.
- SQL 비유:
SELECT * FROM Product - Cypher 구문:
- 해설:
(): 노드(Node)를 의미합니다. 동그라미를 그린 것과 같습니다.:Product: 찾고자 하는 노드의 레이블(유형)입니다.p: 변수(Variable)입니다. 찾은 노드들을 잠시 담아두는 ‘바구니’ 역할을 하며, 이후RETURN절에서 이 이름을 사용하여 데이터를 호출합니다.
2. 관계가 포함된 패턴: 문맥(Context) 찾기
Cypher의 진가는 관계를 다룰 때 발휘됩니다. JOIN 문을 복잡하게 작성할 필요 없이, 화살표를 사용하여 관계의 흐름을 묘사하면 됩니다. 예를 들어, 영화 ‘매트릭스(The Matrix)’의 감독을 찾는 상황을 가정해 보겠습니다.
- Cypher 구문:
패턴 해부:
- (m:Movie [title: ‘The Matrix’]):
Movie레이블을 가진 노드 중,title속성이 ‘The Matrix’인 것만 찾습니다.- 중괄호
[]는 JSON 객체처럼 속성 조건(Filter)을 정의합니다. SQL의WHERE title = 'The Matrix'와 같습니다.
- <-[d:DIRECTED]-:
- 화살표
<-는 관계의 방향을 나타냅니다. (영화가 감독을 향하는 것이 아니라, 사람이 영화를 향해 연출했다는 의미) - 대괄호
[]는 관계(Relationship)를 의미하며,:DIRECTED는 관계의 유형입니다.
- 화살표
- (p:Person):
- 관계의 시작점에 있는
Person레이블을 가진 노드를 찾아 변수p에 담습니다.
- 관계의 시작점에 있는
이처럼 (노드)-[관계]->(노드)의 형태는 데이터베이스 쿼리라기보다는, 화이트보드에 그린 다이어그램을 그대로 텍스트로 옮긴 아스키 아트(ASCII Art)에 가깝습니다.
RETURN 절 분석: 원하는 결과만 쏙 뽑아내기
MATCH가 데이터를 ‘찾는’ 과정이라면, RETURN은 찾은 데이터 중 사용자에게 ‘보여줄’ 데이터를 선별(Projection)하는 과정입니다. SQL의 SELECT
절과 기능적으로 완벽히 동일합니다.
1. 전체 노드/관계 반환 (객체 반환)
찾아낸 노드나 관계가 가진 모든 정보(ID, 레이블, 모든 속성)를 통째로 반환합니다. 개발 단계에서 데이터 구조를 확인할 때 유용합니다.
- 구문:
RETURN p - 결과:
["id": 1, "labels": ["Product"], "properties": ("name": "Laptop", "price": 1000, ...)](JSON 형태)
2. 특정 속성 반환 (값 반환)
보고서 작성이나 UI 표출을 위해 필요한 데이터만 콕 집어 가져옵니다. 네트워크 트래픽을 줄이는 효율적인 방식입니다. 객체지향 프로그래밍처럼 점(Dot, .) 표기법을 사용합니다.
- 구문:
RETURN p.name, p.price - 결과:
| p.name | p.price |
|---|---|
| “Laptop” | 1000 |
종합 예시와 해설: “누가 어디에 사나요?”
이제 MATCH와 RETURN을 결합하여, 실제 비즈니스 질문을 해결하는 완전한 쿼리를 분석해 보겠습니다.
목표: “특정 도시에 거주하는 사람들의 이름과 도시 이름을 목록으로 뽑아주세요.”
- Cypher 쿼리:
- 상세 구문 해설 (Line-by-Line Breakdown):
| 구문 요소 | 상세 설명 | 비즈니스/기술적 의미 |
|---|---|---|
MATCH |
패턴 매칭 시작 | “지금부터 그릴 그림과 일치하는 데이터를 그래프에서 찾아라.” |
(p:Person) |
시작 노드 정의 | :Person이라는 꼬리표(Label)가 붙은 모든 노드를 찾아서, 잠시 p라는 변수명으로 부르겠다. |
-[:LIVES_IN]-> |
관계 및 방향 정의 | p노드에서 출발하여 :LIVES_IN이라는 관계를 타고 나가는 (-> 연결선을 따라가라. |
(c:City) |
도착 노드 정의 | 그 관계가 도착하는 곳에 있는 노드가:City레이블이라면, 이를 c라는 변수에 담아라. |
RETURN |
결과 반환 시작 | 매칭된 패턴 중에서 다음 항목들만 결과 테이블로 출력하라. |
p.first_name, ... |
속성 투영(Projection) | p노드(사람)의 이름 성/이름과, 연결된 c노드(도시)의 이름을 선택하여 반환. |
요약하자면:
Cypher는 “MATCH로 패턴을 그리고, RETURN으로 데이터를 가져온다”는 단순한 철학을 가지고 있습니다. 이 직관적인 구문 덕분에 IT 비전문가도 쿼리를 읽고 “사람이 도시에 살고 있구나”라는 비즈니스 로직을 즉시 이해할 수 있습니다.
이 탄탄한 기초 위에서 다음 장에서는 데이터를 생성(CREATE), 수정(SET), 삭제(DELETE)하는 방법과, 복잡한 그래프를 자유자재로 여행하는 고급 경로 탐색 기술을 다루어 보겠습니다.
