🎮60분
조회형과 결합형
Cypher 로 답하는 CQ
조회형과 결합형
Cypher 로 답하는 CQ > Cypher 로 답하는 CQ
학습 목표
- 1-hop 조회는 SQL 과 다르지 않음을 확인한다
- 두 원천을 교차하는 2-hop 질의를 작성한다
Interactive Simulator
조회형과 결합형
클릭하여 시뮬레이터를 실행하세요
수확의 순서 — 1-hop 에서 경로 분석까지
이 모듈의 쿼리들은 전부 앞 코스 GD에 등록된(=검증 통과한) 것들입니다. **"통과한 CQ만 말한다"**는 다짐이 여기서부터 적용됩니다. 난이도 순서로 수확합니다.
계층 1: 조회형 (1-hop) — 워밍업
// OP-03(스냅숏판): 최근 적재분 기준 접안 중 선박과 예상 출항
MATCH (v:Vessel)-[:MAKES_CALL]->(pc:PortCall {status:"BERTHED"})-[:ALLOCATED_TO]->(b:Berth)
RETURN v.name, b.berthCode, pc.etdBerth
ORDER BY pc.etdBerth;
여기까지는 SQL과 차이가 없습니다. 그래프를 쓸 이유는 다음 계층부터 시작됩니다. 이 점을 솔직히 짚고 갑니다 — 1-hop 조회만 하는 프로젝트라면 관계형 DB가 맞습니다.
계층 2: 결합형 (2-hop) — 두 원천의 교차
// AN-01 정식판: 신고(계획) vs 관제(실적) 교차로 지연 산출
MATCH (v:Vessel)-[:MAKES_CALL]->(pc:PortCall)
MATCH (pc)<-[:PART_OF_CALL]-(be:BerthingEvent)
WHERE be.actualTime > be.plannedTime + duration({hours: 2})
RETURN v.name, v.imoNumber,
duration.between(be.plannedTime, be.actualTime).hours AS delayHours,
be.source
ORDER BY delayHours DESC LIMIT 20;
// CO-07: 재항시간 초과 — 입항·출항 이벤트의 쌍 결합
MATCH (a:ArrivalEvent)-[:PART_OF_CALL]->(pc:PortCall)<-[:PART_OF_CALL]-(d:DepartureEvent)
MATCH (v:Vessel)-[:MAKES_CALL]->(pc)
WITH v, pc, duration.between(a.actualTime, d.actualTime) AS stay
WHERE stay > duration({hours: 72})
RETURN v.name, pc.callId, stay.hours AS stayHours
ORDER BY stayHours DESC;
실습
- 두 쿼리를 실행하고 결과에
be.source가 함께 나오는지 확인하세요 — 코스 2에서 전 이벤트에 강제한 속성이 답에 근거를 붙입니다. - 지연 임계값(2시간)을 바꿔 가며 건수 변화를 봅니다. 임계값이 곧 업무 정의라는 점을 체감하세요.
- ⚠️ 결과가 비면 데이터가 없는 것인지 패턴이 틀린 것인지 먼저 가릅니다. 조건을 하나씩 빼며 어디서 결과가 나타나는지 보면 됩니다.