[Neo4j 기초] 그래프 DB 모델링 - 중복 데이터 생성/삭제

2023. 2. 14. 07:27· 데이터베이스 Database/그래프DB_Neo4j
목차
  1. 중복 속성 만들기
  2. 속성 삭제 후 노드-관계로 대체하기
  3. 관계 OR 쿼리
  4. apoc.merge.relationship
  5. 중간 노드의 필요성
  6. 데이터 공유를 위한 중간 노드
반응형

중복 데이터 

중복 속성 만들기

MATCH (apollo:Movie 
    {
    title: 'Apollo 13', 
    tmdbId: 568, 
    released: '1995-06-30', 
    imdbRating: 7.6, 
    genres: ['Drama', 'Adventure', 'IMAX']
    })
MATCH (sleep:Movie 
    {
    title: 'Sleepless in Seattle', 
    tmdbId: 858, 
    released: '1993-06-25', 
    imdbRating: 6.8, 
    genres: ['Comedy', 'Drama', 'Romance']
    })
MATCH (hoffa:Movie 
    {
    title: 'Hoffa', 
    tmdbId: 10410, 
    released: '1992-12-25', 
    imdbRating: 6.6, 
    genres: ['Crime', 'Drama']
    })
MATCH (casino:Movie 
    {
    title: 'Casino', 
    tmdbId: 524, 
    released: '1995-11-22', 
    imdbRating: 8.2, 
    genres: ['Drama','Crime']
    })
SET apollo.languages = ['English']
SET sleep.languages =  ['English']
SET hoffa.languages =  ['English', 'Italian', 'Latin']
SET casino.languages =  ['English']

속성 삭제 후 노드-관계로 대체하기

  • 다양한 속성 정보를 노드에 저장하는 것은 몇 가지 문제점이 있음
    • 동일한 데이터 중복
    • filter를 위해서 모든 노드를 탐색해야 함
MATCH (m:Movie)
UNWIND m.genres AS genre
MERGE (g:Genre {name: genre})
MERGE (m)-[:IN_GENRE]->(g)
SET m.genres = null

 

MATCH (m:Movie)
UNWIND m.languages AS language
    //=> language 테이블 만들기
WITH  language, collect(m) AS movies
    //=> Movie 노드를 리스트로 전환하기
MERGE (l:Language {name:language})
    //=> Language 테이블 로우를 노드로 만들기
    //?? DISTINCT 안 해도 되는 이유?

WITH l, movies
UNWIND movies AS m
    //?? Movie를 collect했다 UNWIND했다 하는 이유가 뭐지..?
WITH l,m
MERGE (m)-[:IN_LANGUAGE]->(l);
    //=> IN_LANGUAGE 관계 형성

MATCH (m:Movie)
SET m.languages = null
    //=>languages 속성 삭제

 

UNWIND m.languages 의 결과

collect(m) as movie

MATCH (m:Movie)
RETURN collect(m) AS movies

//결과
[
    { "identity": 22,
      "labels": ["Movie"],
      "properties": 
      { "tmdbId": 568,
        "genres": ["Drama", "Adventure","IMAX"],
        "imdbRating": 7.6,
        "title": "Apollo 13",
        "released": "1995-06-30"},
      "elementId": "22"
    }
    , 
    { "identity": 26,
      "labels": ["Movie"],
      "properties": 
      {"tmdbId": 858,
        "genres": ["Comedy", "Drama", "Romance"],
        "imdbRating": 6.8,
        "title": "Sleepless in Seattle",
        "released": "1993-06-25"
      },
      "elementId": "26"
    }
    , 
    { "identity": 27,
      "labels": ["Movie"],
      "properties": 
      { "tmdbId": 10410,
        "genres": ["Crime", "Drama"],
        "imdbRating": 6.6,
        "title": "Hoffa",
        "released": "1992-12-25"
      },
      "elementId": "27"
    }
    , 
    { "identity": 31,
      "labels": ["Movie"],
      "properties": 
      { "tmdbId": 524,
        "genres": ["Drama", "Crime"],
        "imdbRating": 8.2,
        "title": "Casino",
        "released": "1995-11-22"
      },
      "elementId": "31"
    }
]

 

UNWIND movie as m

MATCH (m:Movie)
UNWIND m.languages AS language
WITH  language, collect(m) AS movies
UNWIND movies AS m
RETURN m

 

관계 OR 쿼리

MATCH (p:Person)-[:ACTED_IN_1995|DIRECTED_1995]-()
RETURN p.name as `Actor or Director`

apoc.merge.relationship

apoc.merge.relationship
( startNode,
relType,

identProps:{key:value, …​},
onCreateProps:{key:value, …​},
endNode,
onMatchProps:{key:value, …​})

  • 관계를 다이나믹 타입으로 머지함.
  • ON CREATE or ON MATCH로 속성을 설정함 
  • MATCH (n:Actor)-[r:ACTED_IN]->(m:Movie) CALL apoc.merge.relationship(n, 'ACTED_IN_' + left(m.released,4), {}, m ) YIELD rel RETURN COUNT(*) AS Number of relationships merged
MATCH (n:Actor)-[:ACTED_IN]->(m:Movie)
CALL apoc.merge.relationship(n, 'ACTED_IN_' + left(m.released,4), {}, {}, m , {}) 
YIELD rel
RETURN count(*) AS `Number of relationships merged`;

중간 노드를 활용한 모델 

중간 노드의 필요성

Hyperedges인 경우 (n-ary relationships)

source::https://graphacademy.neo4j.com/courses/modeling-fundamentals/

중간 노드를 생성한 모델

source::https://graphacademy.neo4j.com/courses/modeling-fundamentals/

데이터 공유를 위한 중간 노드

데이터 중복이 있는 경우

source::https://graphacademy.neo4j.com/courses/modeling-fundamentals/

데이터 중복 제거를 위한 중간 노드를 생성한 모델

source::https://graphacademy.neo4j.com/courses/modeling-fundamentals/


참고자료: Neo4j 그래프아카데미, Graph Data Modeling Fundamentals

https://graphacademy.neo4j.com/courses/modeling-fundamentals/

반응형
저작자표시 비영리 변경금지 (새창열림)

'데이터베이스 Database > 그래프DB_Neo4j' 카테고리의 다른 글

[Neo4j 기초] CSV 파일 임포트해오기  (1) 2023.02.21
[Neo4j 기초] 그래프 DB 모델링 - 노드/관계 생성  (0) 2023.02.09
[Neo4j] 기본적인 표기법과 기초 함수 (노드, 관계, MERGE, CREATE, DELETE, SET)  (0) 2023.02.06
  1. 중복 속성 만들기
  2. 속성 삭제 후 노드-관계로 대체하기
  3. 관계 OR 쿼리
  4. apoc.merge.relationship
  5. 중간 노드의 필요성
  6. 데이터 공유를 위한 중간 노드
'데이터베이스 Database/그래프DB_Neo4j' 카테고리의 다른 글
  • [Neo4j 기초] CSV 파일 임포트해오기
  • [Neo4j 기초] 그래프 DB 모델링 - 노드/관계 생성
  • [Neo4j] 기본적인 표기법과 기초 함수 (노드, 관계, MERGE, CREATE, DELETE, SET)
H 에이치
H 에이치
산만과 꾸준이 공존할 수 있다면 혼란해도 괜찮겠다 싶습니다.
H 에이치
H's Blog
H 에이치
  • 분류 전체보기 (102)
    • 데이터베이스 Database (17)
      • 그래프DB_Neo4j (4)
      • RDBMS_Oracle (8)
      • 프로젝트 Project (3)
    • 지식 정보 Knowledge (18)
      • 컴퓨터 Tips (7)
      • 업무 공부 Studies (6)
      • 일상 Daily Life (5)
    • 취미생활 Hobby (35)
      • 책 Book (6)
      • 운동 Workout (20)
      • 공연 전시 Exhibition (5)
      • 언어 Language (4)
    • Random Things (3)
    • 서울 Seoul (25)
      • 식당 Restaurant (16)
      • 술과 커피 Bar & Cafe (9)
    • 경기 고양 Goyang (3)
      • 식당 Restaurant (3)
      • 술과 커피 Bar & Cafe (0)
반응형
전체
오늘
어제

인기 글

hELLO · Designed By 정상우.v4.2.2
H 에이치
[Neo4j 기초] 그래프 DB 모델링 - 중복 데이터 생성/삭제
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.