neo4j - 스키마 정의
1. 그래프의 예
CREATE (forrestGump:Movie {title: 'Forrest Gump', released: 1994})
CREATE (robert:Person:Director {name: 'Robert Zemeckis', born: 1951})
CREATE (tom:Person:Actor {name: 'Tom Hanks', born: 1956})
CREATE (tom)-[:ACTED_IN {roles: ['Forrest']}]->(forrestGump)
CREATE (robert)-[:DIRECTED]->(forrestGump)
다음 결과는 아래와 같다.
2. 인덱스 사용
그래프 데이터베이스에서 인덱스를 사용하는 주된 이유는 그래프 탐색의 시작점을 찾기 위해서다.
시작점이 발견되면, 순회(traversal)는 고성능을 달성하기 위해서 그래프 내의 구조에 의존한다.
데이터베이스에 기존 데이터가 있는 경우 인덱스가 온라인 상태가 되는 데 시간이 걸린다.
다음 쿼리는 데이터베이스에서 이름으로 Actor(레이블)를 찾는 속도를 높이기 위해 인덱스를 생성한다.
CREATE INDEX example_index_1 FOR (a:Actor) ON (a.name)
데이터를 쿼리를 통해 요청할 때 대부분의 경우 적절한 인덱스가 자동으로 사용되므로 인덱스를 지정할 필요가 없다.
예시로 다음 쿼리는 자동으로 example_index_1을 사용한다.
MATCH (actor:Actor {name: 'Tom Hanks'})
RETURN actor
복합 인덱스는 특정 레이블이 있는 모든 노드에 대한 여러 속성에 대한 인덱스다. 예시로, 다음 쿼리는 Actor 레이블에 있는 name 및 born이 있는 모든 노드에 복합 인덱스를 생성한다. "Keanu Reeves"라는 노드는 born이 없기 때문에 해당 노드에는 Actor name born의 복합 인덱스가 추가 되지 않는다.
CREATE INDEX example_index_2 FOR (a:Actor) ON (a.name, a.born)
Show Indexes는 데이터 베이스에 정의 된 인덱스를 찾을 수 있다.
SHOW INDEXES YIELD name, labelsOrTypes, properties, type
3. 제약 조건 사용
제약 조건은 데이터가 도메인의 규칙을 준수하는지 확인하는 데 사용된다. 예를 들어:
노드에 Actor 레이블이 있고 name 속성이 있다면 name의 값은 Actor 레이블의 모든 노드에서 유일한 값이어야만 한다.
예 1. unique 제약 조건
이 예에서는 Movie 레이블과 title 속성이 있는 노드에 대한 제약 조건을 만드는 방법을 보여준다. 제약 조건은 title 속성이 고유해야 함을 지정한다.
unique 제약 조건을 추가하면 해당 속성에 대한 인덱스가 암시적으로 추가된다. 만약 제약 조건이 삭제되었지만 인덱스가 여전히 필요한 경우 인덱스를 생성해야 한다.
CREATE CONSTRAINT constraint_example_1 FOR (movie:Movie) REQUIRE movie.title IS UNIQUE
※ neo4j 4.4에서 구문이 변경 되었으며 이전 구문은 다음과 같다.CREATE CONSTRAINT constraint_example_1 ON (movie:Movie) ASSERT movie.title IS UNIQUE Deprecated
이미 데이터가 있는 데이터베이스에 제약 조건을 추가할 수 있다. 이를 위해서는 기존 데이터가 추가될 제약 조건을 준수해야 한다.
SHOW CONSTRAINTS Cyper 구문으로 데이터베이스에 정의된 제약 조건을 찾을 수 있다.
예 2. 제약 조건 쿼리
이 예는 데이터베이스에 대해 정의된 제약 조건을 반환하는 Cyper 쿼리를 보여준다.
SHOW CONSTRAINTS YIELD id, name, type, entityType, labelsOrTypes, properties, ownedIndexId
참고
https://neo4j.com/docs/getting-started/current/cypher-intro/schema/