[Neo4j] Graph Database란? RDBMS와 비교, neo4j 도입 이유

1. 개요

RDBMS만 써보던 나에게 Graph Database를 쓸 기회가 찾아왔다. 왜 Graph Database를 도입하기로 했는지에 대해 정리하고자 이 글을 쓴다.

 

4학년이 되었고 나는 졸업 작품 주제로 컨텐츠 정보를 활용한 개인화 POI 추천 서비스 로 선정하였다.

기존의 개인화 POI 추천 시스템은 Collaborative Filterin이 주류이고 이는 행동 데이터에만 의존하고 있어, POI의 다양한 컨텐츠 정보(평점, 리뷰, 사진, 지리적 거리 등)을 전혀 고려하지 못한다. 이런 문제점을 해결하기 위해 프로젝트를 시작하게 되었다. 

 

ai 학습 데이터로 yelp의 오픈 데이터셋을 사용하기로 했다. 웹 관련된 프로젝트만 진행하다 ai, ml과 섞인 프로젝트를 하니 데이터의 크기가 어마무시했다. 

 

정적 파일인 json 데이터를 Cloud DB에 올리고 AI, ML을 담당하는 팀원들이 쿼리를 날려 접근할 수 있도록 해주는게 나의 첫 업무이다. 이제 DB를 선택해야 하는데, 데이터 간 연관관계를 파악해서 추천이 진행되기 때문에 GDB를 써야하나 라는 생각이 들었다. 우선 장단점 비교 후 우리 프로젝트에 어울리는 DB를 도입하기로 하였다. 

 

 

 

 

 

2. Graph Database 란? (GDB)

그래프 데이터베이스는 서로 다른 데이터 엔터티 간의 관계를 강조하는 체계적인 데이터 컬렉션이다. 그래프는 노드, 간선, 속성으로 구성되어 있으며, 이 모든 요소를 활용하여 관계형 데이터베이스에서는 불가능한 방식으로 데이터를 표현하고 저장할 수 있다.

 

노드

노드는 데이터 객체를 저장하는 정점이다. 각 노드에는 수와 유형에 제한이 없는 관계가 포함될 수 있다. 

 

엣지

엣지는 노드 간의 관계를 나타낸다. 예를 들어 엣지는 상위-하위 관계, 작업 및 소유권을 설명할 수 있다. 일대다 관계와 다대다 관계를 모두 나타낼 수 있다. 엣지에는 항상 시작 노드, 종료 노드, 유형 및 방향이 있다.

 

속성

각 노드에는 해당 노드를 설명하는 속성이 있다. 경우에 따라 엣지에도 속성이 포함된다. 속성이 있는 그래프를 속성 그래프라고도 한다.

 

 

 

 

하나의 Node가 가질 수 있는 관계의 수와 종류의 제한은 없다. 또한, GraphDB의 Graph는 특정 Edge의 유형 또는 전체 Graph를 탐색할 수 있다. GraphDB에서 Node간의 관계는 Query시간에 포한되지 않지만 데이터베이스에서 유지되기 때문에 Join 또는 Relationship 추적하는 속도가 매우 빠르다.  

 

 

 

 

 

 

 

3. Graph Database가 RDBMS에 반해 갖는 장점

1. 빅데이터/실시간 데이터 분석에 용이함

기존 관계형데이터베이스가 표(table)로 저장되어 있어 데이터 간의 의미해석을 위해 별도의 데이터 시각화 작업을 필요로 했다면, 그래프데이터는 데이터 자체가 ‘점 — 선’으로 저장되어 있고 특정 속성에 따라 연결관계를 바로 확인할 수 있기 때문에 대량의 빅데이터/실시간 데이터 분석에 용이하다는 장점이 있다.

 

이것은 테이블 형태에 맞춰진 데이터 형식인 관계형 데이터베이스보다 훨씬 현실적인 모형에 가까운 데이터라는 느낌을 주어 데이터의 상관관계에 대한 높은 직관성을 제공한다.

 

 

2. 데이터 저장의 유연성

그래프 데이터베이스는 데이터를 하나의 객체로 저장하기 때문에 데이터의 변화에 유연하게 대응할 수 있다. 만약 데이터가 추가된다면 새로운 데이터가 담긴 노드를 추가하고 다른 데이터들과의 관계를 엣지로 연결하기만 하면 데이터 추가가 완료되기 때문에 데이터 저장에 매우 유연하다는 장점을 가진다.

 

관계형 데이터베이스에선 새로운 속성을 가진 데이터가 등장하면 하나의 row를 위해 컬럼을 새로 만들고, 다른 row들은 불필요하게 null값으로 채우고, 외래키를 적용해야할 테이블을 확인하고, 제약도 추가해야 하는 등 많은 작업이 요구된다.

 

 

3. 빠른 질의(Query) 속도

그래프데이터의 대표적인 예시로 소셜네트워크 데이터를 들 수 있는데, 특정 인물의 친구의 친구 데이터를 조회하거나 이커머스 쇼핑몰에서 한 고객의 여러 쇼핑몰의 주문데이터를 확인해야 하는 등 관계의 복잡성이 올라가는 데이터를 조회해야 할 때, 기존 관계형데이터베이스의 경우 분석가가 전체 데이터베이스 구조를 파악한 다음 조인(Join)쿼리 등을 사용해 데이터를 가져와야 하고 관계가 복잡할수록 쿼리도 복잡해지는 단점을 가지는 반면, 그래프데이터는 데이터 객체(노드)들 간의 관계가 엣지로 이어져있기 때문에 처음 검색 노드와 관련 엣지만 파악하면 연결데이터를 빠르게 찾을 수 있다는 장점이 있다.

 

 

즉, 높은 연관성을 찾고 이를 다루는 서비스들은 그래프 데이터베이스를 사용하는 것이 기존의 관계형 데이터베이스를 사용하는 것 보다는 훨씬 효율적이다. 

 

이런 서비스 기업들은 페이스북, 인스타, 카카오 등이 있다. 

 

 

 

4. 도입 이유

위에서 얘기했지만 다시 언급하자면 나의 프로젝트 주제는 컨텐츠 정보를 활용한 개인화 POI 추천 서비스 이고 도입한 이유는 다음과 같다. 

 

첫번째 이유는 먼저 높은 직관력을 갖고 있어 제3자를 빠르게 이해시킬 수 있다는 것이다. 매주 교수님과의 미팅, 발표 등 우리 프로젝트를 깊게 이해하지 못 하는 제3자에게 이해시켜야할 상황이 1년동안 계속해서 주어질 것이다. node들과 이들을 edge로 연결해서 표현해주는 GDB는 우리의 프로젝트 구조를 보여주기에 적합하다.

 

 

두번째 이유는 확장에 열려있기 때문이다. 당장은 review 데이터를 분석한 결과값, 방문 횟수, poi간 거리 등만 고려하기로 했지만, 더 정확한 추천 모델을 학습하기 위해선 더 많은 요소들이 복합적으로 고려되야 한다. 이때 node를 추가하고, edge와 기존 데이터를 연결만 시켜주면 된다. 

 

 

세번째 이유는 실시간 추천도 가능하다는 것이다. 우리가 설계한 모델의 단점은 새로운 user가 추가되고 review데이터들이 생긴다면 추가된 데이터로 추천 모델을 재학습해야 정확한 추천이 가능하다는 것이다. graph database를 사용한다고 위 문제를 해결할 수 있는건 아니다. 대신 다른 방법으로는 추천을 해줄 수 있다. 

예를 들어 user A와 User B가 있고 POI C에 둘 다 여러번 방문했다 가정하자. A와 B는 비슷한 관심사를 갖기 때문에 B가 자주 방문하는 POI D를 A에게 추천해줄수도 있다. 

 

 

마지막 이유는 빠른 쿼리 속도이다. 현재 학습에 사용하는 데이터 셋만 해도 900만개가 넘는다. 세번째 이유에서 말했던 실시간 추천을 RDBMS에서 한다고 생각해보자. user 정보를 불러오고, user의 친구 목록을 불러오고, user친구의 방문 정보를 불러와야 한다. 더 복잡한 연관관계를 갖는다면 정말 무수히 많은 join이 필요해지고 성능이슈가 발생할 것이다. 그래프 데이터베이스에선 이를 간단히 해결할 수 있다. 

 

 

 

 

프로젝트를 진행하고 완성하는데 있어서는 RDBMS나 GDB나 그렇게 크게 중요하지 않을 수는 있다.

 

하지만 규모가 커지고 여러가지 변경 사항을 고려해보았을 때, 개인화된 POI 추천을 제공하는 서비스 성격상 GDB가 적합하다 판단하여 GDB중 가장 높은 점유율을 보여주는 neo4j를 도입하였다.