반응형
Neo4j 그래프아카데미의 'Graph Data Modeling Fundamentals'의 내용을 정리한 내용입니다.
관계 모델링
절차
- 좋은 이름 짓기
- 관계 생성
- 관계명, 방향이 선언되어야 한다
- 방향 Direction
- 관계는 통상적으로 2개 노드 사이에 형성됨
- (재귀적) 그러나 하나의 노드에도 형성할 수 있음
- 속성 Properties
노드/관계 생성
MERGE (:Label) - [:RELATION] - (:Label)
//alias 선언
MATCH (sandy:User {name: 'Sandy Jones'})
MATCH (sleep:Movie {title: 'Sleepless in Seattle'})
//관계 생성
MERGE (sandy)-[:RATED {rating:4}]->(sleep)
위 문장과 동일한 문장
MERGE (:User {name: 'Sandy Jones'})-[:RATED {rating:5}]->(:Movie {title: 'Sleepless in Seattle'})
테스트
count(*)
Apollo 13 영화를 평가한 유저의 수
MATCH (u:User)-[:RATED]-(m:Movie)
WHERE m.title = 'Apollo 13'
RETURN count(*) AS `Number of reviewers`
//위와 동일
MATCH (u:User)-[r:RATED]-(m:Movie)
WHERE m.title = 'Apollo 13'
RETURN count(r) AS `Number of reviewers`
Order by, Limit
최고령 찾기
MATCH (p:Person)-[:ACTED_IN]-(m:Movie)
WHERE m.title = 'Hoffa'
RETURN p.name AS Actor, p.born as `Year Born` ORDER BY p.born DESC LIMIT 1
리팩토링
- 데이터 모델 및 그래프 수정 절차
- TO-BE 데이터 모델 설계
- AS-IS 그래프 수정을 위한 Cypher 코드 작성
- 유스케이스 리테스트 및 Cypher 코드 업데이트
- 목적
- 모델링 목적은 쿼리가 탐색하는 그래프의 사이즈를 최소화하는 데 있음
- 고려사항
- 레이블을 과용해서는 안 됨
- 속성 사용이 Cypher 코드를 더 유연하게함
- 속성 사용만으로 노드 구성이 충하다면 레이블 추가를 하지 않는 것이 유리함
- Neo4j는 노드당 4개까지의 레이블을 최적으로 제시함
실행순서
PROFILE
- 쿼리를 실행하면서 실행 순서 및 오퍼레이터별 일량을 체크하고 싶을 때 사용
- 각 오퍼레이터가 몇 개의 로우를 통과하는지
- 각 오퍼레이터가 필요한 데이터 탐색을 위해 스토리지 계층과 얼마나 interact하는지
- 리소스를 더 많이 사용함
PROFILE MATCH (p:Person)-[:ACTED_IN]-()
WHERE p.born < '1950'
RETURN p.name*``*
- NodeByLabelScan (p:Person)
- 이때, Person labeled nodes가 많으면 속도가 저하될 수 있다.
- 따라서, 탐색 레이블 범위가 줄도록 리팩토링을 고려할 수 있다.
- Filter p.born < '1950'
- Expand -[:ACTED_IN]->
- Projection
- Produce Results RETURN
EXPLAIN
- 실제 수행은 하지 않고 실행계획만 확인하고 싶을 때 사용
- EXPLAIN 구문을 실행하는 경우, 쿼리는 항상 빈 결과값을 리턴하며, 데이터베이스에 변화를 가하지 않음
리팩토링
위 예시에서 Person 노드들 중에서 연기자(Movie 노드들과 ACTED_IN 관계가 있는)만 따로 탐색을 자주 한다면, Actor label을 추가할 수 있다.
Label 추가
SET n:Label
MATCH (p:Person)
WHERE exists ((p)-[:ACTED_IN]-())
SET p:Actor
Labeling 주의점
- “Semantically orthogonal” 의미상 직교
- 레이블은 다른 레이블과 영향을 주지 않아야 함
- 같은 종류의 레이블을 다른 상황에서 사용하지 않도록 주의해야 함 contexts
- “inheritance” or “IS-A” 관계
- 노드들이 여러 레이블을 가지고 있으면서 서로 상하관계가 있도록 해서는 안됨
- 상하관계가 있을 때 라벨 모델링 예시
<구조>
<그래프 모델링 예시>
참고자료: Neo4j 그래프아카데미, Graph Data Modeling Fundamentals
https://graphacademy.neo4j.com/courses/modeling-fundamentals/
반응형
'데이터베이스 Database > 그래프DB_Neo4j' 카테고리의 다른 글
[Neo4j 기초] CSV 파일 임포트해오기 (1) | 2023.02.21 |
---|---|
[Neo4j 기초] 그래프 DB 모델링 - 중복 데이터 생성/삭제 (1) | 2023.02.14 |
[Neo4j] 기본적인 표기법과 기초 함수 (노드, 관계, MERGE, CREATE, DELETE, SET) (0) | 2023.02.06 |