LabHub

그래프 데이터베이스 — Neo4j 와 Cypher · 그래프 모델과 적재 · 퀴즈

퀴즈: 그래프 모델과 적재

LabHub 에서 이어서 보기

문항 8개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.

  1. 관계형에서 '세 다리 건너' 질의가 깊이에 따라 느려지는데 그래프 데이터베이스에서는 그렇지 않은 이유는?

    1. 그래프는 모든 질의 결과를 미리 계산해 캐시에 두기 때문
    2. 그래프는 조인 대신 해시 테이블로 상대 행을 한 번에 찾기 때문
    3. 관계가 노드에 붙은 포인터로 저장돼 다음 노드로 건너갈 때 인덱스 조회가 없기 때문
    4. 그래프는 데이터를 전부 메모리에 올려 두어 디스크를 읽지 않기 때문
  2. `LOAD CSV WITH HEADERS ... AS row` 로 읽은 `row.id` 를 그대로 넣었더니 개수는 맞는데 `MATCH (p:Person {id: 42})` 가 비어 있다. 이유는?

    1. CSV 의 값은 전부 문자열이라 id 가 "42" 로 저장됐고 정수 42 와 같지 않다
    2. HEADERS 옵션이 첫 행을 데이터로 읽어 id 가 한 칸씩 밀렸다
    3. 유일성 제약이 없으면 속성으로 MATCH 를 할 수 없다
    4. LOAD CSV 는 노드를 만들 뿐 속성은 SET 으로 따로 붙여야 한다
  3. `MERGE` 와 `CREATE` 의 차이를 가장 정확히 말한 것은?

    1. MERGE 는 노드에만, CREATE 는 관계에만 쓴다
    2. MERGE 는 제약이 있어야 동작하고 CREATE 는 제약이 없어야 동작한다
    3. MERGE 는 속성을 갱신하고 CREATE 는 속성을 갱신하지 못한다
    4. MERGE 는 적은 패턴 전체가 이미 있으면 그것을 쓰고 없을 때만 만들며, CREATE 는 무조건 만든다
  4. 유일성 제약을 적재 **전에** 만들라고 하는 이유로 옳은 것은?

    1. 제약이 있어야 LOAD CSV 가 파일을 열 수 있기 때문
    2. 제약이 인덱스를 함께 만들어 MERGE 가 행마다 라벨 전체를 훑지 않게 되기 때문
    3. 제약을 나중에 만들면 기존 노드에는 적용되지 않기 때문
    4. 제약이 없으면 관계를 만들 때 방향을 정할 수 없기 때문
  5. `MATCH (a:Account {id: ...}) MATCH (b:Account {id: ...}) CREATE (a)-[:TRANSFER]->(b)` 로 6,000행을 적재했는데 관계가 5,988개다. 무슨 일이 있었나?

    1. 12행이 같은 두 계좌 사이라 CREATE 가 중복을 합쳤다
    2. 트랜잭션 크기 한도에 걸려 마지막 12행이 잘렸다
    3. 12행의 양끝 중 하나가 없어 MATCH 가 비었고 그 행은 오류 없이 건너뛰었다
    4. 12행의 금액이 문자열이라 관계 생성이 거부됐다
  6. 송금을 관계 `[:TRANSFER]` 가 아니라 노드 `(:Transfer)` 로 승격시켜야 하는 경우는?

    1. 한 송금에 승인자·환불·신고처럼 다른 것을 이어 붙여야 할 때
    2. 송금 건수가 많아 관계로 두면 저장 공간이 부족할 때
    3. 송금 금액을 정수가 아니라 소수로 저장해야 할 때
    4. 두 계좌 사이에 송금이 두 번 이상 있을 때
  7. Neo4j 에서 라벨(Label)의 역할로 옳은 것은?

    1. 라벨은 노드의 기본 키이며 한 노드에 하나만 붙는다
    2. 라벨은 관계의 방향을 정하는 표시다
    3. 라벨은 속성의 자료형을 선언하는 스키마다
    4. 라벨은 노드를 종류별로 묶는 이름이며 인덱스와 제약이 걸리는 단위다
  8. id 가 1 인 Person 이 이미 있는데 `MERGE (p:Person {id: 1, name: 'Kim'})` 을 실행했더니 노드가 하나 더 생겼다. 왜?

    1. MERGE 는 문자열 속성이 있으면 항상 새 노드를 만들기 때문
    2. MERGE 는 패턴 전체로 찾는데 기존 노드의 name 이 달라 못 찾았고, 그래서 새로 만들었다
    3. 유일성 제약이 id 가 아니라 name 에 걸려 있었기 때문
    4. 같은 트랜잭션 안에서는 MERGE 가 기존 노드를 보지 못하기 때문