G·Graph Daily Lab
DAY 34 / 100
내 학습 기록
DAY 34개념·실험Cypher와 GQL

쓰기와 집계

그래프에 데이터를 넣는 두 방식 CREATE와 MERGE의 차이, 그리고 결과를 묶어 세는 집계를 봅니다.

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

이번 회차, 내 속도로.

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

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

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

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

  1. 출발 · DAY 34CREATE·MERGE·count
  2. 1. 관심 주제OPTIONAL MATCH·null추가 13 · 새 추가 수업
  3. 복귀 · DAY 34원래 회차 이어가기
  • OPTIONAL MATCH·null · DAY 31·32에서 MATCH와 WHERE를 배운 뒤, 관계가 없는 노드가 결과에서 조용히 사라지는 문제를 다루러 옵니다.

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

복귀: DAY 34 → 본과정 다음 회차: DAY 35

핵심 개념

CREATE는 실행할 때마다 새 노드와 관계를 만듭니다. CREATE (:Person {name:'민수'})를 두 번 실행하면 이름이 같은 노드가 두 개 생깁니다. MERGE는 주어진 패턴 전체가 이미 있으면 MATCH처럼 찾아 쓰고, 없으면 CREATE처럼 패턴 전체를 만듭니다. MERGE (:Person {name:'민수'})는 몇 번을 실행해도 노드가 하나입니다.

MERGE가 ‘패턴 전체’ 단위로 판단한다는 점이 함정입니다. MERGE (:Person {name:'민수'})-[:WORKS_AT]->(:Lab {name:'그래프연구실'})는 그 관계가 없으면 이미 있는 민수와 그래프연구실을 쓰지 않고 두 노드까지 새로 만듭니다. 안전한 순서는 노드를 각각 MERGE한 뒤, 묶인 변수로 관계를 MERGE하는 것입니다. ON CREATE SET과 ON MATCH SET으로 만들 때와 찾았을 때 다른 값을 넣을 수도 있습니다.

여러 요청이 동시에 같은 노드를 MERGE할 수 있는 환경에서는 업무 키에 유일성 제약(DAY 29)을 함께 두는 편이 안전합니다. 제약이 있으면 중복을 만드는 쓰기가 오류로 드러나고, 키로 노드를 찾을 때 제약에 딸린 인덱스도 쓰입니다. MERGE는 편리한 문법이지 데이터 품질 규칙을 대신하지 않습니다.

집계는 RETURN에 count(), collect(), avg() 같은 집계 함수를 쓰면 됩니다. SQL의 GROUP BY 없이도 집계 함수가 아닌 열이 자동으로 그룹 키가 됩니다. MATCH (p:Person)-[:WORKS_AT]->(l:Lab) RETURN l.name, count(p) AS members, collect(p.name) AS names는 연구실마다 인원과 이름 목록을 돌려줍니다. count(*)는 행을 세고, count(식)은 null을 건너뜁니다.

CREATE는 항상 새로 만들고 MERGE는 패턴 전체를 찾거나 만들며, 집계 함수 밖의 열은 그룹 키가 됩니다.

작은 예제로 따라가기

01

빈 DB에서 CREATE (:Person {name:'민수'})를 두 번 실행한 뒤 MATCH (p:Person {name:'민수'}) RETURN count(*)를 보면 2입니다.

02

같은 빈 DB에서 MERGE (:Person {name:'민수'})를 두 번 실행하면 count(*)는 1입니다.

03

연구실별 집계에서 그래프연구실(민수·지아·서준)은 3, 언어연구실(하린·도윤·유나)은 3이 나옵니다.

직접 실험해 보기

CREATE와 MERGE 문장을 각각 여러 번 실행하며 노드 목록과 하단 count(*) 집계 표에 중복이 생기는지 비교하고, 초기화한 뒤 실행 순서를 바꿔 다시 확인하세요.

LIVE EXPERIMENT · CREATE VS MERGE

같은 문장을 두 번 실행해 중복 확인하기

문장을 고르고 실행해 보자CREATE는 항상 새로 만들고, MERGE는 패턴 전체가 일치하는 노드가 있으면 찾고 없으면 만든다.
#1 민수 · 연구원#2 지아 · 교수#3 서준 · 박사과정#4 하린 · 엔지니어#5 도윤 · 연구원#6 유나 · 석사과정
MATCH (p:Person)
RETURN p.name AS name, count(*) AS cnt
ORDER BY name
namecnt
도윤1
민수1
서준1
유나1
지아1
하린1

MERGE를 쓸 키(예: name)에는 유일성 제약을 함께 두는 것이 안전하다(DAY 29). role이 다른 MERGE는 패턴 전체가 맞지 않아 새 노드를 만든다.

이번에는 직접 풀어 보세요

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

문제 1
힌트 보기

MERGE는 패턴 전체가 있는지 봅니다. 노드를 먼저 변수에 묶으세요.

풀이와 비교하기

관계가 없으므로 패턴 전체가 새로 만들어져 민수 노드와 그래프연구실 노드가 하나씩 더 생깁니다. 고친 쿼리는 MERGE (p:Person {name:'민수'}) MERGE (l:Lab {name:'그래프연구실'}) MERGE (p)-[:WORKS_AT]->(l)입니다.

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

YOUR NOTES

오늘 이해한 것과 다시 볼 것

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

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

오늘의 이해 확인

빈 DB에서 MERGE (:Person {name:'민수'})를 세 번 실행한 뒤 :Person 노드는 몇 개인가요?

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

FURTHER READING

더 깊이 읽기

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

Cypher Manual: MERGENeo4jCypher Manual: Aggregating functionsNeo4jCypher Manual: ConstraintsNeo4j

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