그래프 데이터베이스 — Neo4j 와 Cypher · 순회와 경로 · 실습
그래프를 걷는다 — 경로, 방향, 집계, PROFILE
목표
실습 1 에서 세운 그래프를 걷습니다. 가변 길이 경로, 최단 경로, 방향, OPTIONAL MATCH,WITH 파이프라인, 그리고 PROFILE 로 인덱스 전후의 db hits 를 직접 잽니다.
왜 중요한가
그래프 질의의 실수는 문법이 아니라 뜻에서 납니다. 경로를 센 것인지 노드를 센
것인지, 보낸 것인지 받은 것인지, 관계가 없는 노드가 결과에서 사라졌는지 — 답은
나오는데 뜻이 다른 답입니다. 그리고 "그래프라서 빠르다" 는 말은 걷기에만 해당합니다.
첫 노드를 찾는 일은 여전히 인덱스의 몫이고, 그 차이를 숫자로 재 보는 것이 이 실습의
마지막 절반입니다.
환경
이 파드는 postgres 계정으로 돕니다. Neo4j 5.26 Community 가 /opt/neo4j 에 있고
기본으로 꺼져 있습니다. 1단계에서 직접 켭니다.
/opt/lab/engines.sh start neo4j # 15~30초 걸립니다export PATH=/opt/neo4j/bin:$PATHcypher-shell -u neo4j -p labhub # 대화형. 문장은 ; 로 끝냅니다. :exit 로 나갑니다cypher-shell -u neo4j -p labhub --format plain "MATCH (n) RETURN count(n);" # 한 줄 실행--format plain 은 첫 줄에 열 이름, 그다음 줄부터 값을 냅니다. 문자열은 큰따옴표로
감싸 나오고 숫자는 그대로 나옵니다. 파일로 남길 때 이 출력을 그대로 써도 됩니다.
픽스처 CSV 는 /opt/lab/fixtures/graph/ 에 있고, Cypher 의 `LOAD CSV WITH HEADERS
FROM 'file:///people.csv'` 가 그 디렉터리로 풀립니다. 읽기 전용이라 생각하고,
산출물은 전부 /root/graph/ 아래에 둡니다.
이 실습은 실습 1 의 결과에 기대지 않습니다. 1단계의 reload.cypher 가 같은 그래프를
처음부터 다시 세웁니다.
단계
1. Neo4j 를 켜고 /opt/lab/fixtures/graph/reload.cypher 로 그래프를 세운 뒤 /root/graph/paths/01-counts.txt 에 nodes= · rels= 를 남깁니다.
2. 계좌 8 에서 송금 방향으로 1·2·3걸음 안에 닿는 서로 다른 계좌 수와 3걸음까지의 경로 수를 /root/graph/paths/02-reach.txt 에 reach_1= · reach_2= · reach_3= · paths_3= 으로 남깁니다.
3. 사람 1 과 1991 사이의 최단 경로를 /root/graph/paths/03-shortest.txt 에 hops= · directed_hops= · path= 로 남깁니다.
4. /root/graph/paths/04-optional.txt 에 people= · with_device= · no_device= · no_purchase= 를 남깁니다.
5. 결제 총액 상위 5개 업종을 category, total 두 열로 /root/graph/paths/05-categories.txt 에 남깁니다.
6. 계좌 1481 의 송금을 sent= · received= · both= 로 /root/graph/paths/06-direction.txt 에 남깁니다.
7. 이메일 조회의 db hits 를 인덱스 전후로 재어 /root/graph/paths/07-profile.txt 에 dbhits_before= · dbhits_after= 로 남깁니다.
8. 합이 가장 큰 두 단계 송금 사슬을 /root/graph/paths/08-chain.txt 에 max_total= · path= 로 남깁니다.
참고
- 가변 길이 패턴에는 늘 상한을 둡니다.
*만 적으면 그래프 끝까지 걷습니다. - 한 경로 안에서 같은 관계는 두 번 밟지 않습니다(관계 유일성). 노드는 다시 지나갈 수 있습니다.
shortestPath는 가장 짧은 길 하나입니다. 같은 길이가 여럿이면 어느 것이--format plain에서 PROFILE 의 요약은DbHits:줄입니다. 연산자별로 보려면
나올지 정해져 있지 않습니다 — 채점기는 길이만 봅니다.
--format verbose.
단계 8개
- Neo4j 를 켜고 그래프를 다시 세운다
- 가변 길이 — 몇 걸음에 어디까지 닿나
- 최단 경로 — 방향을 무시할 때와 따를 때
- OPTIONAL MATCH — 관계가 없는 노드를 세다
- WITH · 집계 · ORDER BY · LIMIT
- 방향의 의미
- PROFILE — 인덱스 전후의 db hits
- 경로 위에서 계산하기 — reduce