7분
V1 스키마 감사
골든 데이터셋과 검증
V1 스키마 감사
골든 데이터셋과 검증 > 골든 데이터셋과 검증
학습 목표
- 관계 수준 정합성을 감사 쿼리로 점검한다
- 스키마 드리프트를 탐지하는 장치를 만든다
V1 — 스키마 감사
L1(DB 제약)과 L2(ETL 문지기)를 통과했어도 관계 수준의 정합성은 남습니다. 감사 쿼리 묶음을 만들어 매 적재 후 돌립니다. 대표 5종입니다.
// A1. 고아 이벤트 — 기항에 연결 안 된 이벤트 (기대: 0건)
MATCH (e:PortCallEvent) WHERE NOT (e)-[:PART_OF_CALL]->(:PortCall)
RETURN count(e) AS orphanEvents;
// A2. 카디널리티 위반 — 선박 없는 기항, 선박 2척에 걸친 기항 (기대: 0건)
MATCH (pc:PortCall)
WITH pc, count { (pc)<-[:MAKES_CALL]-(:Vessel) } AS n
WHERE n <> 1 RETURN pc.callId, n;
// A3. 시간 순서 위반 — 출항이 입항보다 빠른 기항 (기대: 0건)
MATCH (a:ArrivalEvent)-[:PART_OF_CALL]->(pc:PortCall)<-[:PART_OF_CALL]-(d:DepartureEvent)
WHERE d.actualTime < a.actualTime
RETURN pc.callId, a.actualTime, d.actualTime;
// A4. source 누락 — 원천 없는 이벤트 (기대: 0건, 코스 2 필수 속성)
MATCH (e:PortCallEvent) WHERE e.source IS NULL RETURN count(e);
// A5. 미등재 라벨 — 스펙에 없는 라벨의 출현 (스키마 드리프트 탐지)
CALL db.labels() YIELD label
WHERE NOT label IN $specLabels RETURN label;
A5 가 은근히 중요합니다
LPG는 스키마리스라 오타 라벨(:Vesel)도 조용히 들어갑니다. 코스 2에서 "계층의 진실 원천은 스펙 문서"라고 했으니, 스펙의 라벨 목록과 DB의 실제 라벨을 대조하는 이 쿼리가 문서와 현실의 동기화 감시자입니다.
문서가 진실 원천이라는 말은 문서를 믿으라는 뜻이 아니라, 문서와 어긋나면 경보가 울려야 한다는 뜻입니다.
감사 결과는 이력화합니다
결과를 LoadBatch 노드(앞 모듈)에 속성으로 기록합니다. 위반 건수의 시계열이 쌓이면 "우리 파이프라인이 나아지고 있는가"를 숫자로 답할 수 있습니다.
실습
- 다섯 감사 쿼리를 자기 그래프에 돌립니다. 0건이 아닌 것이 나오면 그것이 오늘의 작업입니다.
- 위반이 나왔을 때 무엇을 고칠지 판단합니다 — 데이터인가, 매핑인가, 스키마인가.
- ⚠️ 위반이 대량으로 나오면 스키마가 현실과 어긋난 것일 수 있습니다. 데이터를 억지로 맞추기 전에 스펙 개정을 검토하고, 개정하면 이력에 남기세요.
- 감사 쿼리를 파이프라인 6번째 단계로 편입합니다.
에디터 로딩 중...