G·Graph Daily Lab
DAY 33 / 100
내 학습 기록
DAY 33개념·실험Cypher와 GQL

가변 길이 경로와 최단 경로

몇 홉 떨어진 대상까지 한 번에 찾는 가변 길이 패턴과, 그중 가장 짧은 경로만 고르는 방법을 봅니다.

약 20분조작형 실험 확인 퀴즈
A SMALL DETOUR

이번 회차, 내 속도로.

기초를 더 짚거나 궁금한 주제로 잠깐 넓혀 보세요. 최대 3단계를 거쳐 DAY 33로 돌아옵니다.

난이도·관심 주제 고르기
이번 회차는 어느 속도로 볼까요?
더 살펴볼 주제 1~2개 선택

1/2개 선택 · 새 보충·심화 수업과 본과정 다시 읽기를 선택할 수 있어요.

이렇게 다녀와요 1단계 · 약 12분

  1. 출발 · DAY 33*1..3·shortestPath
  2. 1. 관심 주제OPTIONAL MATCH·null추가 13 · 새 추가 수업
  3. 복귀 · DAY 33원래 회차 이어가기
  • OPTIONAL MATCH·null · DAY 31·32에서 MATCH와 WHERE를 배운 뒤, 관계가 없는 노드가 결과에서 조용히 사라지는 문제를 다루러 옵니다.

선택과 경로 기록은 이 브라우저에 저장됩니다. 본과정의 회차 완료와는 별도입니다.

복귀: DAY 33 → 본과정 다음 회차: DAY 34

핵심 개념

관계 패턴에 별표와 범위를 붙이면 여러 홉을 한 번에 표현합니다. (a:Person {name:'민수'})-[:KNOWS*1..3]->(b:Person)은 민수에서 KNOWS를 1~3번 따라가 닿는 사람을 찾습니다. *2는 정확히 2홉, *..3은 하한을 생략해 1~3홉, *만 쓰면 1홉 이상 상한 없음입니다. Neo4j 5의 새 버전들에서는 GQL식 수량자 -[:KNOWS]->{1,3}으로도 같은 뜻을 씁니다.

가변 길이 패턴의 결과는 노드가 아니라 경로 단위입니다. 같은 사람에게 서로 다른 경로로 닿으면 그 사람이 여러 행에 나옵니다. 고유한 사람만 원하면 RETURN DISTINCT b.name을 씁니다. 홉마다 이웃이 3명씩이면 3홉 안의 경로는 최대 3+9+27=39개이고, 상한이 커질수록 경로 수가 지수적으로 늘어납니다. 그래서 상한을 두는 습관이 중요합니다.

가장 짧은 경로 하나만 필요하면 MATCH p = shortestPath((a:Person {name:'민수'})-[:KNOWS*..6]-(b:Person {name:'유나'})) RETURN length(p)처럼 씁니다. 홉 수 기준 최단이라 DAY 11의 BFS와 같은 의미입니다. 길이가 같은 최단 경로를 모두 원하면 allShortestPaths를 쓰고, Neo4j 5.21부터는 GQL식 SHORTEST 1 문법도 지원합니다.

주의할 점이 있습니다. shortestPath는 관계 속성(거리·시간)을 더하지 않고 홉 수만 셉니다. 가중치 최단 경로에는 다익스트라(DAY 13) 같은 알고리즘을 따로 씁니다. 또 Cypher는 한 경로 일치 안에서 같은 관계를 두 번 지나지 않지만, 그래도 조밀한 그래프에서 상한 없는 패턴은 매우 느려질 수 있습니다.

가변 길이 패턴은 경로 단위로 결과를 내므로 상한을 두고, 필요하면 DISTINCT나 shortestPath로 줄입니다.

작은 예제로 따라가기

01

KNOWS가 민수→지아, 민수→서준, 지아→하린, 서준→하린, 하린→도윤, 도윤→유나일 때 민수에서 *1..2의 경로는 지아, 서준, 하린(지아 경유), 하린(서준 경유) 4개이고 고유한 사람은 3명입니다.

02

*1..3으로 늘리면 도윤에 닿는 3홉 경로 2개가 더해져 경로 6개, 고유한 사람 4명이 됩니다.

03

민수에서 유나까지 shortestPath는 4홉입니다. 지아 경유와 서준 경유가 같은 길이라 그중 하나만 돌려줍니다.

직접 실험해 보기

최대 홉을 1부터 하나씩 올리며 결과 행 수(경로 수)와 고유 노드 수를 기록해 두 값이 처음 갈라지는 홉을 찾고, shortestPath 토글로 최단 경로 하나를 강조해 보세요.

LIVE EXPERIMENT · VARIABLE LENGTH

1..k홉 경로 세기와 최단 경로

민수시작지아1홉서준1홉하린2홉도윤3홉유나
결과 행 = 경로61홉 2 · 2홉 2 · 3홉 2
고유 도달 노드4지아, 서준, 하린, 도윤
shortestPath3홉민수→지아→하린→도윤
MATCH p = (a:Person {name: '민수'})
          -[:KNOWS*1..3]->(b:Person)
RETURN b.name AS name, length(p) AS hops
ORDER BY hops

// 행 수(경로)와 고유 노드 수
MATCH p = (a:Person {name: '민수'})
          -[:KNOWS*1..3]->(b:Person)
RETURN count(p) AS paths,
       count(DISTINCT b) AS people
경로 (짧은 순)
#경로홉
1민수→지아1
2민수→서준1
3민수→지아→하린2
4민수→서준→하린2
5민수→지아→하린→도윤3
6민수→서준→하린→도윤3

같은 사람에게 여러 경로로 닿으면 행이 여러 개다(행 수 ≥ 고유 노드 수). 노드 아래 숫자는 그 노드까지의 최소 홉. 상한 없는 *는 큰 그래프에서 경로 수가 폭발하니 항상 상한을 둔다. shortestPath의 최소 길이는 0 또는 1만 허용되어 *1..k로 쓴다. 노드를 눌러 목표를 바꾼다.

이번에는 직접 풀어 보세요

정답을 보기 전에 계산과 이유를 적어 보세요. 해설과 비교하고 확인 표시를 남기면 완료할 수 있습니다.

문제 1
힌트 보기

2홉과 3홉 경로만 셉니다. 1홉 친구는 빠집니다.

풀이와 비교하기

2홉: 하린(지아 경유), 하린(서준 경유). 3홉: 도윤(지아 경유), 도윤(서준 경유). 경로는 4개, 고유한 사람은 하린과 도윤 2명입니다.

풀이와 확인 표시는 이 브라우저에 저장됩니다.

YOUR NOTES

오늘 이해한 것과 다시 볼 것

계산이 달라진 이유, 헷갈린 개념, 다음에 확인할 질문을 남겨 보세요.

메모는 이 브라우저에 저장됩니다. 홈에서 전체 기록을 내려받을 수 있습니다.

오늘의 이해 확인

-[:KNOWS*1..3]-> 결과에 같은 사람이 두 번 나오는 가장 흔한 이유는?

완료 조건: 확인 퀴즈 정답 · / 직접 풀기 0/1

FURTHER READING

더 깊이 읽기

예제와 실험 데이터는 이 과정을 위해 만든 것입니다. 원문은 선택 자료이며, 강의와 직접 풀기만으로도 다음 회차를 이어갈 수 있습니다.

Cypher Manual: Variable-length pathsNeo4jCypher Manual: Shortest pathsNeo4j

이 자료는 개념 학습용입니다. 실제 데이터베이스·라이브러리·플랫폼의 동작과 설정은 제품과 버전마다 다를 수 있습니다.