그래프 데이터베이스 — Neo4j 와 Cypher · 그래프 모델과 적재 · 퀴즈
퀴즈: 그래프 모델과 적재
문항 8개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
관계형에서 '세 다리 건너' 질의가 깊이에 따라 느려지는데 그래프 데이터베이스에서는 그렇지 않은 이유는?
- 그래프는 모든 질의 결과를 미리 계산해 캐시에 두기 때문
- 그래프는 조인 대신 해시 테이블로 상대 행을 한 번에 찾기 때문
- 관계가 노드에 붙은 포인터로 저장돼 다음 노드로 건너갈 때 인덱스 조회가 없기 때문
- 그래프는 데이터를 전부 메모리에 올려 두어 디스크를 읽지 않기 때문
`LOAD CSV WITH HEADERS ... AS row` 로 읽은 `row.id` 를 그대로 넣었더니 개수는 맞는데 `MATCH (p:Person {id: 42})` 가 비어 있다. 이유는?
- CSV 의 값은 전부 문자열이라 id 가 "42" 로 저장됐고 정수 42 와 같지 않다
- HEADERS 옵션이 첫 행을 데이터로 읽어 id 가 한 칸씩 밀렸다
- 유일성 제약이 없으면 속성으로 MATCH 를 할 수 없다
- LOAD CSV 는 노드를 만들 뿐 속성은 SET 으로 따로 붙여야 한다
`MERGE` 와 `CREATE` 의 차이를 가장 정확히 말한 것은?
- MERGE 는 노드에만, CREATE 는 관계에만 쓴다
- MERGE 는 제약이 있어야 동작하고 CREATE 는 제약이 없어야 동작한다
- MERGE 는 속성을 갱신하고 CREATE 는 속성을 갱신하지 못한다
- MERGE 는 적은 패턴 전체가 이미 있으면 그것을 쓰고 없을 때만 만들며, CREATE 는 무조건 만든다
유일성 제약을 적재 **전에** 만들라고 하는 이유로 옳은 것은?
- 제약이 있어야 LOAD CSV 가 파일을 열 수 있기 때문
- 제약이 인덱스를 함께 만들어 MERGE 가 행마다 라벨 전체를 훑지 않게 되기 때문
- 제약을 나중에 만들면 기존 노드에는 적용되지 않기 때문
- 제약이 없으면 관계를 만들 때 방향을 정할 수 없기 때문
`MATCH (a:Account {id: ...}) MATCH (b:Account {id: ...}) CREATE (a)-[:TRANSFER]->(b)` 로 6,000행을 적재했는데 관계가 5,988개다. 무슨 일이 있었나?
- 12행이 같은 두 계좌 사이라 CREATE 가 중복을 합쳤다
- 트랜잭션 크기 한도에 걸려 마지막 12행이 잘렸다
- 12행의 양끝 중 하나가 없어 MATCH 가 비었고 그 행은 오류 없이 건너뛰었다
- 12행의 금액이 문자열이라 관계 생성이 거부됐다
송금을 관계 `[:TRANSFER]` 가 아니라 노드 `(:Transfer)` 로 승격시켜야 하는 경우는?
- 한 송금에 승인자·환불·신고처럼 다른 것을 이어 붙여야 할 때
- 송금 건수가 많아 관계로 두면 저장 공간이 부족할 때
- 송금 금액을 정수가 아니라 소수로 저장해야 할 때
- 두 계좌 사이에 송금이 두 번 이상 있을 때
Neo4j 에서 라벨(Label)의 역할로 옳은 것은?
- 라벨은 노드의 기본 키이며 한 노드에 하나만 붙는다
- 라벨은 관계의 방향을 정하는 표시다
- 라벨은 속성의 자료형을 선언하는 스키마다
- 라벨은 노드를 종류별로 묶는 이름이며 인덱스와 제약이 걸리는 단위다
id 가 1 인 Person 이 이미 있는데 `MERGE (p:Person {id: 1, name: 'Kim'})` 을 실행했더니 노드가 하나 더 생겼다. 왜?
- MERGE 는 문자열 속성이 있으면 항상 새 노드를 만들기 때문
- MERGE 는 패턴 전체로 찾는데 기존 노드의 name 이 달라 못 찾았고, 그래서 새로 만들었다
- 유일성 제약이 id 가 아니라 name 에 걸려 있었기 때문
- 같은 트랜잭션 안에서는 MERGE 가 기존 노드를 보지 못하기 때문