Cypher 쿼리 가이드
Cypher는 그래프 데이터베이스의 선언적 쿼리 언어입니다. SQL이 관계형 데이터베이스를 다루듯, Cypher는 그래프의 노드와 관계를 직관적인 패턴 문법으로 조회하고 조작할 수 있게 해줍니다.
D.Hub의 Graph Explorer에서 Cypher 쿼리를 직접 실행하여 온톨로지 데이터를 탐색할 수 있습니다.
기본 문법
MATCH — 패턴 매칭
그래프에서 특정 패턴에 해당하는 데이터를 찾습니다.
MATCH (n)
RETURN n
LIMIT 25
WHERE — 조건 필터링
MATCH로 찾은 결과에 조건을 적용합니다.
MATCH (p:Person)
WHERE p.age >= 30
RETURN p.name, p.age
RETURN — 결과 반환
조회할 데이터의 형태를 지정합니다. 별칭(AS)을 사용할 수 있습니다.
MATCH (p:Person)
RETURN p.name AS 이름, p.age AS 나이
ORDER BY — 정렬
결과를 특정 속성 기준으로 정렬합니다.
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC
LIMIT — 결과 수 제한
반환되는 결과의 개수를 제한합니다. 대량 데이터 조회 시 반드시 사용을 권장합니다.
MATCH (n)
RETURN n
LIMIT 100
노드 패턴
노드는 소괄호 ()로 표현합니다. 라벨과 속성을 지정할 수 있습니다.
| 패턴 | 설명 |
|---|---|
(n) | 임의의 노드 |
(p:Person) | Person 라벨을 가진 노드 |
(p:Person {name: "Alice"}) | 특정 속성값을 가진 노드 |
(n:Person:Employee) | 복수 라벨을 가진 노드 |
관계 패턴
관계는 대괄호 []와 화살표 ->, <-로 표현합니다.
| 패턴 | 설명 |
|---|---|
(a)-[r]->(b) | a에서 b로의 관계 |
(a)<-[r]-(b) | b에서 a로의 관계 |
(a)-[r]-(b) | 방향 무관 |
(a)-[:BOUGHT]->(b) | BOUGHT 타입 관계 |
(a)-[*1..3]->(b) | 1~3 홉 거리의 가변 길이 관계 |
자주 사용하는 쿼리 패턴
1. 모든 노드 조회
MATCH (n)
RETURN n
LIMIT 100
2. 특정 라벨의 노드 조회
MATCH (p:Person)
RETURN p
LIMIT 50
3. 속성 조건으로 필터링
MATCH (p:Product)
WHERE p.price > 10000 AND p.category = "Electronics"
RETURN p.name, p.price
ORDER BY p.price DESC
4. 관계를 통한 연결 탐색
MATCH (c:Customer)-[:PURCHASED]->(p:Product)
RETURN c.name, p.name
LIMIT 50
5. 다중 관계 경로 탐색
MATCH (a:Person)-[:WORKS_FOR]->(company:Organization)-[:LOCATED_IN]->(city:City)
RETURN a.name, company.name, city.name
6. 최단 경로 찾기
MATCH path = shortestPath(
(a:Person {name: "Alice"})-[*]-(b:Person {name: "Bob"})
)
RETURN path
7. N-hop 이웃 조회
MATCH (start:Person {name: "Alice"})-[*1..2]-(neighbor)
RETURN DISTINCT neighbor
LIMIT 50
8. 집계 — 노드 개수 세기
MATCH (n)
RETURN labels(n) AS label, count(*) AS count
ORDER BY count DESC
9. 집계 — 관계별 통계
MATCH ()-[r]->()
RETURN type(r) AS relationship, count(*) AS count
ORDER BY count DESC
10. 그룹별 상위 N건 조회
MATCH (c:Customer)-[:PURCHASED]->(p:Product)
RETURN c.name, count(p) AS purchase_count
ORDER BY purchase_count DESC
LIMIT 10
11. 패턴 존재 여부 확인
MATCH (p:Person)
WHERE EXISTS {
MATCH (p)-[:PURCHASED]->(:Product {category: "Books"})
}
RETURN p.name
12. 리스트 수집 및 활용
MATCH (c:Customer)-[:PURCHASED]->(p:Product)
RETURN c.name, collect(p.name) AS purchased_products
LIMIT 20
유용한 내장 함수
| 함수 | 설명 | 예시 |
|---|---|---|
count() | 개수 세기 | count(n) |
collect() | 결과를 리스트로 수집 | collect(n.name) |
labels() | 노드의 라벨 조회 | labels(n) |
type() | 관계 타입 조회 | type(r) |
properties() | 모든 속성을 맵으로 조회 | properties(n) |
size() | 리스트 크기 | size(collect(n)) |
coalesce() | NULL일 때 대체값 반환 | coalesce(n.name, "Unknown") |
toUpper() | 대문자 변환 | toUpper(n.name) |
toString() | 문자열 변환 | toString(n.age) |
date() | 날짜 생성 | date("2025-01-01") |
Graph Explorer에서 사용 시 팁
결과 뷰 활용
Graph Explorer에서 쿼리 결과는 그래프, 테이블, 텍스트 3가지 뷰로 확인할 수 있습니다. 구조 파악에는 그래프 뷰, 데이터 분석에는 테이블 뷰, 디버깅에는 텍스트 뷰가 적합합니다.
LIMIT사용 습관화: 대량의 노드가 반환되면 시각화 성능이 저하됩니다. 항상LIMIT을 붙여주세요.- 메타데이터 패널 활용: 왼쪽 패널에서 라벨이나 관계 타입을 클릭하면 해당 타입의 데이터를 바로 조회할 수 있습니다.
- 확장 탐색: 그래프 뷰에서 노드를 더블클릭하면 연결된 이웃 노드를 추가로 조회합니다.
성능 주의
MATCH (n) RETURN n처럼 전체 그래프를 조회하는 쿼리는 데이터가 많을 경우 브라우저 성능에 영향을 줄 수 있습니다. 반드시 LIMIT을 지정하거나 라벨 조건을 추가하세요.