Data & ML & AI/GraphDB(Neo4j)

Neo4j 제약조건 생성하기(CONSTRAINT: unique, Not Null)

뇌님 2022. 7. 7. 01:08
반응형

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

제약조건을 만든 후 실수로 title을 빠뜨리면 에러가 발생합니다

 

 

이때, 당연히 기존 데이터가 가지고 있지 않은 항목/속성을 Not Null로 설정하려고 하면 에러가 나타납니다.

'Cloud Atlas'는 year를 가지고 있지 않았으니 당연히 not null 설정이 불가능합니다.

 

뒤늦게라도 year 데이터를  채워주면 이제는 year를 not null로 제한할 수 있게 됩니다.

 

 

 

위와 같은 제약조건설정은 Node 뿐 아니라 Edge(Relationship)에도 설정 가능합니다.

반응형