LabHub

그래프 데이터베이스 — Neo4j 와 Cypher · 그래프 모델과 적재 · 실습

그래프를 세운다 — 제약, 적재, 첫 MATCH

LabHub 에서 이어서 보기

목표

CSV 열한 개를 Neo4j 의 노드와 관계로 세우고, 첫 MATCH 를 칩니다. 끝나면 사람·계좌·
기기·주소·가맹점·상품과 그 사이의 여섯 관계가 든 그래프가 파드 안에 살아 있습니다.

왜 중요한가

그래프는 적재할 때 모델이 굳습니다. 무엇을 같은 노드로 볼지(제약), 값의 형이
무엇인지(변환), 두 번 돌려도 같은지(MERGE) — 셋 중 하나를 빼면 개수는 맞는데 질의가
안 맞는 그래프가 됩니다. CSV 의 값은 전부 문자열이라 toInteger 를 빼먹으면 나중에
MATCH 가 못 찾고, 관계의 양끝이 없는 행은 오류 없이 사라집니다. 그런 일을 세어 보고
넘어가는 습관이 이 실습의 요점입니다.

환경

이 파드는 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. Neo4j 를 켜고, CALL dbms.components() 로 확인한 버전과 에디션을 /root/graph/model/01-version.txtversion= · edition= 두 줄로 남깁니다.
2. 여섯 라벨(Person Account Device Address Merchant Product)의 id 에 유일성 제약을, Personcity 에 인덱스를 만듭니다.
3. 여섯 CSV 를 LOAD CSV WITH HEADERS 로 여섯 라벨의 노드로 적재합니다. id · balance · price 는 정수로, 나머지 열은 같은 이름의 속성으로.
4. OWNS(accounts.csv 의 person_id) · USES(uses_device.csv, first_seen) · LIVES_AT(lives_at.csv, since) 관계를 만듭니다.
5. people.csvMERGE 로 한 번 더 적재해 수가 그대로인지 보고, CREATE 로 다시 넣었을 때의 오류 전문과 함께 /root/graph/model/05-merge.txtpeople_before= · people_after= 를 남깁니다.
6. TRANSFER(transfers.csv) · PAID(payments.csv) · BOUGHT(purchases.csv) 관계를 만들고 /root/graph/model/06-load.txttransfer_rows= · transfer_loaded= · transfer_skipped= 를 남깁니다.
7. /root/graph/model/07-match.txtaccounts_of_42= · shared_devices= · top_city= · top_city_people= 을 남깁니다.
8. /root/graph/model/08-schema.txtnodes= · rels= · labels= · rel_types= 를 남깁니다.

참고

단계 8개

  1. Neo4j 를 켜고 붙는다
  2. 제약과 인덱스를 먼저 만든다
  3. 노드를 적재한다
  4. 구조 관계를 잇는다
  5. 두 번 돌려도 같은가 — MERGE 와 CREATE
  6. 거래 관계를 잇고, 빠진 행을 센다
  7. 첫 MATCH 네 개
  8. 완성된 그래프의 모양