관계로 둘까, 속성으로 둘까
같은 정보를 속성·노드·관계 중 어디에 둘지 정하는 기준을, 모델이 답해야 할 질문에서 출발해 세웁니다.
이번 회차, 내 속도로.
기초를 더 짚거나 궁금한 주제로 잠깐 넓혀 보세요. 최대 3단계를 거쳐 DAY 41로 돌아옵니다.
난이도·관심 주제 고르기
1/2개 선택 · 새 보충·심화 수업과 본과정 다시 읽기를 선택할 수 있어요.
이렇게 다녀와요 1단계 · 약 12분
- 출발 · DAY 41노드·관계·속성 선택
- 1. 관심 주제다중 레이블·레이블 선택추가 17 · 새 추가 수업
- 복귀 · DAY 41원래 회차 이어가기
- 다중 레이블·레이블 선택 · DAY 41에서 값의 자리를 고르는 법을 배운 뒤, 레이블이라는 또 하나의 선택지를 언제 쓰는지 보충하러 옵니다.
선택과 경로 기록은 이 브라우저에 저장됩니다. 본과정의 회차 완료와는 별도입니다.
핵심 개념
‘민수는 대전에 산다’는 (:Person {name:'민수', city:'대전'})처럼 속성으로도, (:Person {name:'민수'})-[:LIVES_IN]->(:City {name:'대전'})처럼 노드와 관계로도 적을 수 있습니다. 어느 쪽이 맞는지는 데이터가 아니라 질문이 정합니다. 그래서 모델링은 ‘이 그래프가 답해야 할 질문 목록’을 먼저 적는 데서 시작합니다.
경험칙은 이렇습니다. 여러 노드가 공유하고, 그 값을 거쳐 다른 대상으로 이동하거나, 그 값 자체에 정보(도시의 인구·지역)가 붙는다면 노드로 둡니다. 한 노드를 보여 주거나 거를 때만 쓰는 값(나이, 쪽수)은 속성으로 둡니다. ‘같은 도시에 사는 사람은?’은 노드 모델에서는 도시를 거쳐 한 번에 찾지만, 속성 모델에서는 사람 쌍의 문자열을 비교해야 합니다.
속성 문자열은 표기 흔들림에 약합니다. ‘대전’과 ‘대전시’는 다른 값이라 같은 도시 질문에서도, 도시별 집계에서도 따로 셉니다. 노드로 두면 도시 하나에 노드 하나라 이런 오류가 줄어듭니다. 반대로 모든 값을 노드로 만들면 노드와 관계가 크게 늘고, 국가처럼 값 종류가 적고 연결이 몰리는 노드는 슈퍼노드(DAY 44)가 됩니다.
관계 타입과 관계 속성 사이에도 선택이 있습니다. 자주 구분해 따라가는 차이라면 [:WORKS_AT {kind:'겸임'}]보다 [:ADJUNCT_AT]처럼 타입을 나누는 편이 순회 중에 거르기 쉽습니다. 마지막 점검은 질문마다 Cypher를 직접 써 보는 것입니다. 질의가 짧고 전체 스캔 없이 시작점에서 출발한다면 모델이 질문과 잘 맞는 것입니다.
작은 예제로 따라가기
질문 ‘같은 도시에 사는 사람은?’: 노드 모델은 MATCH (a:Person)-[:LIVES_IN]->(c:City)<-[:LIVES_IN]-(b:Person) RETURN a.name, b.name으로 도시를 거쳐 찾습니다.
질문 ‘민수의 나이는?’: p.age 속성 하나면 충분하고, 나이를 노드로 만들 이유가 없습니다.
질문 ‘도시별 인원은?’: 속성 모델에 ‘대전’과 ‘대전시’가 섞여 있으면 RETURN p.city, count(*)가 같은 도시를 두 그룹으로 나눠 셉니다.
직접 실험해 보기
질문 세 개마다 모델을 ‘도시를 속성으로’와 ‘도시를 노드로’로 바꿔 보며 Cypher Code와 장단점 Result를 비교하고, 질문별로 어느 모델을 고를지 근거와 함께 적으세요.
도시를 속성으로 둘까, 노드로 둘까
MATCH (:Person {name: '하린'})-[:LIVES_IN]->
(c:City)<-[:LIVES_IN]-(b:Person)
RETURN b.name| b.name |
|---|
| 도윤 |
| 유나 |
질문에서 출발한다. 자주 따라가거나 여럿이 공유하는 값(도시)은 노드로, 그 대상만의 단순 조회 값(나이)은 속성으로. 유나의 city는 일부러 대전시로 적었다.
이번에는 직접 풀어 보세요
정답을 보기 전에 계산과 이유를 적어 보세요. 해설과 비교하고 확인 표시를 남기면 완료할 수 있습니다.
힌트 보기
어떤 값이 여러 논문에 공유되고, 그 값을 거쳐 다른 논문으로 이동해야 하는지 봅니다.
풀이와 비교하기
학회는 여러 논문이 공유하고 그것을 거쳐 다른 논문으로 이동하므로 (:Paper)-[:PUBLISHED_IN]->(:Venue {name:'KDD'})처럼 노드로 둡니다. 쪽수는 그 논문을 볼 때만 쓰므로 pages 속성으로 둡니다.
풀이와 확인 표시는 이 브라우저에 저장됩니다.
오늘 이해한 것과 다시 볼 것
계산이 달라진 이유, 헷갈린 개념, 다음에 확인할 질문을 남겨 보세요.
메모는 이 브라우저에 저장됩니다. 홈에서 전체 기록을 내려받을 수 있습니다.오늘의 이해 확인
다음 중 노드로 두는 것이 가장 자연스러운 값은?
완료 조건: 확인 퀴즈 정답 · / 직접 풀기 0/1
더 깊이 읽기
예제와 실험 데이터는 이 과정을 위해 만든 것입니다. 원문은 선택 자료이며, 강의와 직접 풀기만으로도 다음 회차를 이어갈 수 있습니다.
What is graph data modeling?Neo4j Getting StartedWhat is a graph databaseNeo4j Getting Started이 자료는 개념 학습용입니다. 실제 데이터베이스·라이브러리·플랫폼의 동작과 설정은 제품과 버전마다 다를 수 있습니다.