Neo4j 제약조건 생성하기(CONSTRAINT: unique, Not Null)
SQL에서 특정 칼럼에 unique, Not Null 등의 조건을 설정하듯, Neo4j에서도 제약을 생성할 수 있습니다.
CONSTRAINT문을사용하면 가능합니다.
공식문서에 따르면 다음과 같은 제약이 가능하다고 합니다.
- Unique node property constraints
- Node property existence constraints
- Relationship property existence constraints
- Node key constraints
일반화 해서 제약조건을 생성하는 방법은 다음과 같습니다.
CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE n.propertyName IS UNIQUE
[OPTIONS "{" option: value[, ...] "}"]
...
우리는 일반화된 공식보다는 실습을 통해서 더 쉽게 습득합니다.
빠른 실습을 위해 데이터 없이 비어있는 DBMS를 생성해서 실습해보겠습니다.
Create (p:Person {name: 'John Doe'})
Create (m:Movie {title: 'Cloud Atlas'})
return p,m
Unique node property constraints
- 똑같은 이름의 사람을 제한하기 (person의 name을 unique로 제한)
Create CONSTRAINT unique_person_name FOR (p:Person)
REQUIRE p.name IS UNIQUE
이렇게 제약조건을 걸어놓으면 이미 있는 데이터인 'John Doe'라는 사람의 데이터가 중복으로 들어가는 것을 막을 수 있습니다.
IF NOT EXISTS
- 똑같은 제약조건의 존재여부로 인한 에러방지
이미 존재하는 제약조건을 다시 설정한다면 에러가 발생합니다.
(DB를 껐다켰다 하면 은근 발생합니다)
이 경우, if not exists를 추가해주면
1) 제약조건이 없을 경우 조건을 생성하기
2) 이미 제약조건이 존재할 경우 무시하고 넘어가기
가 가능합니다.
이때, 제약조건이 존재하는지 여부를 확인하는 수단은 제약조건의 이름입니다.
(제약의 내용이 달라도 이름이 동일하면 이미 존재하는 것으로 판단합니다.)
Node property existence constraints
- 영화이름 누락방지하기(movie의 title을 not null로 제한)
데이터 업무에 따라 입력시 절대 누락되어서는 안되는 데이터들이 있습니다. 제약조건을 걸어두면 실수를 방지할 수 있습니다.
CREATE CONSTRAINT not_null_movie_title FOR (m:Movie)
REQUIRE m.title IS NOT NULL
이때, 당연히 기존 데이터가 가지고 있지 않은 항목/속성을 Not Null로 설정하려고 하면 에러가 나타납니다.
뒤늦게라도 year 데이터를 채워주면 이제는 year를 not null로 제한할 수 있게 됩니다.
위와 같은 제약조건설정은 Node 뿐 아니라 Edge(Relationship)에도 설정 가능합니다.