G·Graph Daily Lab
DAY 43 / 100
내 학습 기록
DAY 43개념·실험그래프 모델링 패턴

시간이 흐르는 그래프

소속이 바뀌어도 과거를 잃지 않도록, 관계에 유효 기간을 두고 특정 시점 기준으로 질의하는 방법을 봅니다.

약 20분조작형 실험 확인 퀴즈
A SMALL DETOUR

이번 회차, 내 속도로.

기초를 더 짚거나 궁금한 주제로 잠깐 넓혀 보세요. 최대 3단계를 거쳐 DAY 43로 돌아옵니다.

난이도·관심 주제 고르기
이번 회차는 어느 속도로 볼까요?
더 살펴볼 주제 1~2개 선택

1/2개 선택 · 새 보충·심화 수업과 본과정 다시 읽기를 선택할 수 있어요.

이렇게 다녀와요 1단계 · 약 12분

  1. 출발 · DAY 43유효 시간·버전
  2. 1. 관심 주제다중 레이블·레이블 선택추가 17 · 새 추가 수업
  3. 복귀 · DAY 43원래 회차 이어가기
  • 다중 레이블·레이블 선택 · DAY 41에서 값의 자리를 고르는 법을 배운 뒤, 레이블이라는 또 하나의 선택지를 언제 쓰는지 보충하러 옵니다.

선택과 경로 기록은 이 브라우저에 저장됩니다. 본과정의 회차 완료와는 별도입니다.

복귀: DAY 43 → 본과정 다음 회차: DAY 44

핵심 개념

민수는 2018년부터 언어연구실에 있다가 2021년에 그래프연구실로 옮겼습니다. 기존 WORKS_AT 관계를 지우고 새로 만들면 현재는 맞지만 ‘2019년의 언어연구실 소속은?’ 같은 질문에는 답할 수 없습니다. 시간이 중요한 도메인에서는 사실이 언제 참이었는지도 데이터로 남겨야 합니다.

가장 단순한 방법은 관계에 유효 기간을 두는 것입니다. [:WORKS_AT {from:2018, to:2021}], [:WORKS_AT {from:2021}]처럼 적고, 아직 끝나지 않은 관계는 to를 비워 둡니다. 특정 연도 $y 기준 소속은 MATCH (p:Person)-[r:WORKS_AT]->(l:Lab) WHERE r.from <= $y AND (r.to IS NULL OR r.to > $y) RETURN p.name, l.name으로 찾습니다. 시작은 포함하고 끝은 빼는 반열린 구간이라, 옮긴 해에 두 곳이 동시에 잡히지 않습니다.

다른 방법도 있습니다. 직함이나 주소처럼 노드 속성 자체가 바뀌면 현재 상태 노드에서 이전 상태 노드로 [:PREVIOUS]를 잇는 상태 노드 체인을 쓰고, 기간에 정보가 많으면 :Employment 같은 이벤트 노드(DAY 42)를 씁니다. 또 ‘세상에서 참이었던 시간’(유효 시간)과 ‘DB에 기록된 시간’(트랜잭션 시간)을 함께 남기는 이중 시간(bitemporal) 모델도 있습니다.

한계도 분명합니다. 모든 질의에 시간 조건을 붙여야 하고, 하나라도 빠뜨리면 과거와 현재가 섞인 답이 나옵니다. 데이터가 크면 from·to에 인덱스가 필요합니다. 예제에서는 연도를 정수로 썼지만, 실제로는 date('2021-03-01') 같은 Cypher의 시간 타입을 쓰는 편이 정확합니다.

관계에 유효 기간을 두고 반열린 구간 조건으로 질의하면, 같은 그래프에서 과거와 현재를 모두 답할 수 있습니다.

작은 예제로 따라가기

01

민수의 관계: 언어연구실 {from:2018, to:2021}, 그래프연구실 {from:2021}.

02

$y=2020: 첫 관계는 2018≤2020이고 2021>2020이라 유효, 둘째는 2021≤2020이 거짓이라 제외되어 언어연구실이 나옵니다.

03

$y=2021: 첫 관계는 2021>2021이 거짓이라 제외, 둘째는 유효하여 그래프연구실 하나만 나옵니다.

직접 실험해 보기

연도 Range를 2015에서 2025까지 움직이며 강조되는 관계가 바뀌는 연도를 기록하고, Code의 조건에서 r.to IS NULL을 빼면 어떤 관계가 결과에서 빠질지 예상해 적으세요.

LIVE EXPERIMENT · VALID TIME

연도를 옮기며 그때 유효한 관계만 보기

C기업그래프실언어실민수서준지아하린도윤유나
201520172019202120232025민수→C기업민수→그래프실지아→그래프실서준→C기업서준→그래프실하린→그래프실하린→언어실도윤→언어실유나→C기업유나→언어실
// $y = 2019
MATCH (p:Person)-[r:WORKS_AT]->(o)
WHERE r.from <= $y
  AND (r.to IS NULL OR r.to > $y)
RETURN p.name, o.name, r.from, r.to
2019년 결과 5행
p.nameo.namer.fromr.to
민수C기업20172021
지아그래프연구실2015null
서준C기업20182022
하린언어연구실2019null
도윤언어연구실2016null

관계에 from/to(유효 기간)를 두면 관계를 지우지 않고 이력을 남긴다. to는 그 해부터 무효(반열린 구간). 점선은 끝난 관계. 다른 방법으로 상태 노드를 시간순으로 잇는 체인도 있다.

이번에는 직접 풀어 보세요

정답을 보기 전에 계산과 이유를 적어 보세요. 해설과 비교하고 확인 표시를 남기면 완료할 수 있습니다.

문제 1
힌트 보기

시작 연도는 포함하고 끝 연도는 포함하지 않습니다.

풀이와 비교하기

$y=2014: 그래프연구실(2012≤2014, 2016>2014)만 유효합니다. $y=2016: 그래프연구실은 2016>2016이 거짓이라 빠지고, 언어연구실(2016≤2016, to 없음)만 유효합니다.

풀이와 확인 표시는 이 브라우저에 저장됩니다.

YOUR NOTES

오늘 이해한 것과 다시 볼 것

계산이 달라진 이유, 헷갈린 개념, 다음에 확인할 질문을 남겨 보세요.

메모는 이 브라우저에 저장됩니다. 홈에서 전체 기록을 내려받을 수 있습니다.

오늘의 이해 확인

WHERE r.from <= $y AND (r.to IS NULL OR r.to > $y)에서 r.to IS NULL이 필요한 이유는?

완료 조건: 확인 퀴즈 정답 · / 직접 풀기 0/1

FURTHER READING

더 깊이 읽기

예제와 실험 데이터는 이 과정을 위해 만든 것입니다. 원문은 선택 자료이며, 강의와 직접 풀기만으로도 다음 회차를 이어갈 수 있습니다.

What is graph data modeling?Neo4j Getting StartedCypher Manual: WHERENeo4jCypher Manual: Working with nullNeo4j

이 자료는 개념 학습용입니다. 실제 데이터베이스·라이브러리·플랫폼의 동작과 설정은 제품과 버전마다 다를 수 있습니다.