2 minute read

🕸️ Cypher Query Language (CQL) 완벽 가이드: 그래프 DB와 대화하는 법

GraphDB(특히 Neo4j)를 쓰려면 데이터를 넣고, 찾고, 수정할 언어가 필요함. 우리가 관계형 DB(RDB)에서 SQL을 쓰는 것처럼, GraphDB에서는 Cypher(사이퍼)라는 쿼리 언어(CQL)를 사용함.

SQL이 표(테이블)를 다루는 텍스트 위주의 딱딱한 언어라면, Cypher는 아스키 아트(ASCII-Art)처럼 직관적으로 데이터를 그림 그리듯 표현하는 것이 가장 큰 특징임. 처음 보는 사람도 기호의 모양을 보면 직관적으로 형태를 유추할 수 있음.


1. Cypher의 기본 문법 (그림 그리듯 이해하기)

Cypher에서는 노드(데이터 개체)와 엣지(관계)를 괄호 기호로 재미있게 표현함.

Cypher Node and Edge Concepts

  • 노드(Node): () 괄호 사용
    • 동그라미 모양을 형상화함. 데이터를 담는 주체.
    • 예: (p:Person) -> Person이라는 라벨(종류)을 가진 노드 변수 p
  • 관계(Relationship): [] 대괄호와 -> 화살표 사용
    • 두 노드 사이를 이어주는 선과 방향을 형상화함. 화살표 방향으로 관계가 뻗어나감.
    • 예: -[r:KNOWS]-> -> KNOWS라는 이름의 관계(엣지) r
  • 속성(Property): {} 중괄호 사용
    • 노드나 관계가 가진 상세 스펙들 (JSON 형식 구조와 똑같음).
    • 예: {name: '김철수', age: 30}

이를 합쳐보면 아주 직관적인 한 줄의 그림이 완성됨:

(p1:Person {name: '김철수'})-[:KNOWS]->(p2:Person {name: '이영희'})

해석: 이름이 ‘김철수’인 사람(Person) 노드가 이름이 ‘이영희’인 사람 노드를 ‘안다(KNOWS)’.


2. 필수 Cypher 명령어 4가지 (CRUD 연산)

DB를 다룰 때 필수인 생성, 조회, 수정, 삭제를 어떻게 하는지 SQL과 비교하며 알아보겠음.

① 데이터 생성하기 (CREATE) - SQL의 INSERT

새로운 노드를 만들거나, 노드들 사이의 관계를 맺어줄 때 사용함.

// 1. 단순한 노드 하나 생성하기
CREATE (u:User {name: '손흥민', team: '토트넘'})

// 2. 노드 두 개와 그 사이의 관계를 한 번에 생성하기 (방향성 주의)
CREATE (p1:Person {name: '스티브 잡스'})-[r:FOUNDED]->(c1:Company {name: 'Apple'})

② 데이터 조회하기 (MATCH & RETURN) - SQL의 SELECT

GraphDB에서 가장 많이, 그리고 가장 중요하게 쓰이는 탐색 명령어임. 내가 찾고 싶은 그림(패턴)을 MATCH로 그리고, 결과물을 RETURN으로 꺼내옴.

// 1. 조건 검색: 스티브 잡스가 창립한 회사 찾기
MATCH (p:Person {name: '스티브 잡스'})-[r:FOUNDED]->(c:Company)
RETURN c.name
// 결과로 'Apple' 이라는 값을 뱉어냄.

// 2. 전체 노드 조회 (테이블 전체 스캔과 비슷함. 실무에선 제한 조건을 둬야 안전함)
MATCH (n)
RETURN n LIMIT 10

③ 데이터 수정하기 (SET) - SQL의 UPDATE

기존 노드나 관계를 찾아내서 속성(Property) 값을 변경하거나 새로 추가할 때 사용함.

// 손흥민 노드를 찾아서 나이(age) 속성을 32로 추가/수정하기
MATCH (u:User {name: '손흥민'})
SET u.age = 32
RETURN u

④ 데이터 삭제하기 (DELETE & DETACH) - SQL의 DELETE

노드나 관계를 삭제함. 🌟매우 중요한 주의점: GraphDB에서는 선(관계)이 연결된 노드를 함부로 지울 수 없음! (노드가 사라지면 허공에 뜨는 고아 선이 생기기 때문)

// 1. 특정 관계(선)만 똑! 끊어서 삭제하기
MATCH (p1:Person {name: '스티브 잡스'})-[r:FOUNDED]->(c:Company {name: 'Apple'})
DELETE r

// 2. 노드를 지울 때, 연결된 모든 선까지 한꺼번에 싹 다 철거하기 (DETACH 옵션)
MATCH (u:User {name: '손흥민'})
DETACH DELETE u

3. 실전 쿼리 맛보기: “내 친구의 친구가 좋아하는 영화 찾기”

RDB(관계형 DB)에서 이 질문을 해결하려면, 유저 테이블, 친구 매핑 테이블, 영화 테이블, 좋아요 매핑 테이블 등등 JOIN을 3~4번 이상 떡칠해야 해서 쿼리도 길어지고 속도도 매우 느려짐.

하지만 GraphDB(Cypher)는 그저 화살표만 쭉쭉 이어나가면 됨.

Cypher Node and Edge Concepts

// 나(김철수) -> 나의 친구 -> 그 친구가 LIKES(좋아요)하는 -> 영화(Movie)
MATCH (me:Person {name: '김철수'})-[:FRIEND_WITH]-(friend:Person)-[:LIKES]->(m:Movie)
RETURN m.title, friend.name

해석: 이 한 줄의 쿼리로 “내 친구 ‘누구누구’가 무슨 영화를 좋아하는지”를 즉시, 그리고 연산 부하 거의 없이 초고속으로 추출할 수 있음.

마무리 요약:
Cypher 쿼리 작성의 핵심은 MATCH로 내가 원하는 형태의 그림(패턴)을 화살표로 슥슥 그리고, RETURN으로 쏙 뽑아오는 것임! 직관적이라는 점만 기억하면 SQL보다 훨씬 재밌게 짤 수 있음.

Comments