LabHub

그래프 데이터베이스 — Neo4j 와 Cypher · 순회와 경로 · 실습

그래프를 걷는다 — 경로, 방향, 집계, PROFILE

LabHub 에서 이어서 보기

목표

실습 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.txtnodes= · rels= 를 남깁니다.
2. 계좌 8 에서 송금 방향으로 1·2·3걸음 안에 닿는 서로 다른 계좌 수와 3걸음까지의 경로 수를 /root/graph/paths/02-reach.txtreach_1= · reach_2= · reach_3= · paths_3= 으로 남깁니다.
3. 사람 1 과 1991 사이의 최단 경로를 /root/graph/paths/03-shortest.txthops= · directed_hops= · path= 로 남깁니다.
4. /root/graph/paths/04-optional.txtpeople= · 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.txtdbhits_before= · dbhits_after= 로 남깁니다.
8. 합이 가장 큰 두 단계 송금 사슬을 /root/graph/paths/08-chain.txtmax_total= · path= 로 남깁니다.

참고

단계 8개

  1. Neo4j 를 켜고 그래프를 다시 세운다
  2. 가변 길이 — 몇 걸음에 어디까지 닿나
  3. 최단 경로 — 방향을 무시할 때와 따를 때
  4. OPTIONAL MATCH — 관계가 없는 노드를 세다
  5. WITH · 집계 · ORDER BY · LIMIT
  6. 방향의 의미
  7. PROFILE — 인덱스 전후의 db hits
  8. 경로 위에서 계산하기 — reduce