DBMS/활용 사례

GDB&Cypher 소개

(주)비트나인 2023. 9. 4. 18:14

GDB 

GDB는 Graph Database의 약자로 위키피디아에서 

"데이터를 표현하고 저장하기 위해 노드, 에지 및 속성이 있는 시맨틱 쿼리에 그래프 구조를 사용하는 데이터베이스"라고 설명한다. (출처: https://en.wikipedia.org/wiki/Graph_database) 

쉽게 말하자면 노드와 에지(노드( 간의 관계)로 표현한 그래프의 형태로 데이터를 저장하고 관리하는 데이터베이스이며 

보통 객체에 대한 정보를 노드에 저장하고, 객체 간의 관계를 에지에 저장하게 된다.

이해를 돕기 위해 일상생활에서의 대표적인 관계, 소셜네트워크(sns)를 이용하여 간단한 예시를 들어보자. 

sns에는 다음과 같은 정보들이 존재한다. 

● 사용자 김OO은 성별은 남자이며 나이는 27, 거주지는 서울이다. 

● 사용자 이OO은 성별은 여자이며 나이는 22, 거주지는 인천이다. 

● 사용자 박OO은 성별은 여자이며 나이는 30, 거주지는 부산이다. 

● 김OO은 이 OO을 팔로우하며 게시글에 남긴 좋아요 수는 3개, 댓글수는 5개이다. ● 이 OO 또한 김 OO을 팔로우하며 게시글에 남긴 좋아요 수는 2개, 댓글수는 5개이다. 

● 박OO은 이 OO을 팔로우하며 게시글에 남긴 좋아요 수는 0개, 댓글수는 1개이다.

위의 정보를 테이블 형태로 나타내면 다음과 같다. 

<사용자 정보>

 

<팔로우 정보>

 

위의 테이블 정보는 RDB(Relational Database), 관계형 데이터베이스의 형태와 같다. 여기서 객체 정보인 사용자 정보가 노드의 정보가 되고 객체 간의 관계 정보인 팔로우 정보가 에지의 정보가 된다. 

<사용자 정보 -> 노드 정보 >

 

<팔로우 정보 -> 엣지 정보>

 

노드와 엣지의 Label(레이블), Property(속성) GDB가 무엇인지 알았으니 다음으로 노드와 에지의 레이블, 속성에 대해 간단히 알아보자. Label(레이블) 

레이블은 유사한 객체끼리의 묶음을 표현하는 단위이다. 사람, 동물, 사물 등과 같이 각 객체를 공통으로 정의할 수 있는 레이블 명을 이용하여 표현한다. 

위의 예시에서 각 객체인 노드들은 sns 사용자라는 공통의 속성을 가진다. 따라서, 위의 그래프에서 노드의 레이블은 '사용자'라고 정의할 수 있다. 

다음으로 객체 간의 관계 엣지들은 팔로우 관계라는 공통의 속성을 가진다. 따라서, 엣지의 레이블은 '팔로우'라고 정의할 수 있다. 

이와 같이 레이블을 이용해서 노드나 에지의 역할이나 타입을 정의할 수 있다. Property(속성) 

레이블을 정의했으니 다음으로 속성에대해 알아본다.

속성은 정보(데이터)이다. 객체인 노드, 객체 간의 관계인 엣지는 각각의 정보를 가질 수 있다

위의 노드들중 첫 번째 노드(객체)는 이름이 김 OO, 성별이 남자, 나이가 27, 거주지가 서울이라는 객체의 정보(데이터)를 갖는다. 이러한 이름, 성별, 나이, 거주지와 같은 정보(데이터)를 속성이 된다. 

마찬가지로 엣지에서는 좋아요, 댓글 수와 같은 정보(데이터)가 속성이 된다. 이와 같이 속성을 이용하여 노드와 에지에 각각의 정보를 부여한다

 

 

예제 

이해를 돕기위해 간단한 예시를 추가해 보자.

위의 sns 사용자 중 이름이 "이 OO"인 사용자가 인플루언서이고 광고사로부터 광고를 받는다고 가정해 보자. 

이를 위해 다음과 같은 광고사와 광고 계약과 관련된 정보를 추가한다. 

● 광고사 '회사 A'는 화장품 제품을 보유하고 제품명은 OO수분크림이다. ● 광고사 '회사 B'는 전자기기 제품을 보유하고 제품명은 OO이어폰이다. ● 광고사 '회사 A'는 인플루언서 sns 사용자 '이 OO'에게 광고비 30만 원을 주고 광고계약을 했다. 

● 광고사 '회사 B'는 인플루언서 sns 사용자 '이OO'에게 광고비 50만 원을 주고 광고계약을 했다. 

추가한 정보를 포함하여 RDB와 GDB로 나타낸 결과는 다음과 같다.

여기서 광고사 정보 테이블은 광고사라는 레이블을 가지는 노드가 되고 광고계약 정보 테이블은 광고계약이라는 레이블의 에지가 된다. 

이와 같이 레이블은 여러 개가 존재할 수 있으며 레이블 안의 속성 정보(데이터)는 다르게 들어갈 수 있다는 것을 알 수 있다. 

GDB의 특징 

그렇다면 GDB는 왜 사용해야 하며 어떤 장점을 가지고, 어떠한 상황에 사용해야 하는 것일까

이를 GDB의 특징을 통해 알아보도록 한다. 

 

특징 1. GDB는 직관적이다.

RDB테이블을 봤을 때는 각 객체 간의 관계를 한눈에 파악하기 쉽지 않다. 예시에서는 데이터가 많지 않아 이러한 점이 덜해 보일 수 있지만 데이터가 많아지면 많아질수록 이러한 점은 더 심해질 것이다. 

반면에, GDB로 데이터를 표현했을 때는 객체 간의 관계를 직관적으로 보고 파악할 수 있다.

 

특징 2. GDB는 유연하다. 

RDB 같은 경우에는 원래의 테이블에서 새로운 속성(컬럼)을 추가하는 것이 굉장히 복잡하다는 특징을 갖고 있다.

 

<사용자 정보 속성 추가 >

 

반면 GDB는 다른 속성을 가진 데이터가 추가되어도 각각의 노드가 별개의 객체이기 때문에 속성의 추가가 매우 자유롭다

<GDB에서의 속성 추가 >

 

특징 3. 관계를 탐색할 때 조회가 빠르다. 

RDB는 검색하는 관계의 depth가 깊어지고 복잡할수록, 데이터가 많아질수록 join연산이 많아져 조회의 시간이 느려지는 특징을 갖고 있다. 

반면 GDBjoin 연산이 없어 관계의 depth가 깊어지고 복잡해도 조회의 시간이 매우 빠르다.

위와 같이 회사 B에서 사용자 김 OO까지의 관계를 조회할 때 RDB는 여러 번의 join을 거쳐야 하는 반면 GDB는 바로 에지를 통해 탐색할 수 있어 더 빠르다. 

이는 데이터가 많아지고 관계가 복잡해질수록 조회 시간의 차이가 기하급수적으로 늘어나게 된다

결론 

이와 같이 GDB는 관계 정보(데이터)를 표현하고 저장하고 조회를 하는 것에 큰 강점을 두고 있다. 

세상은 점점 데이터가 방대해지고 데이터들 간의 관계가 복잡해지고 있다. 이러한 점에서 GDB는 어떻게 사용하는지에 따라 앞으로 큰 강점을 가질 수 있을 것이다.

 

Cypher 

Cypher는 그래프 데이터를 대상으로 질의를 수행하는 그래프 질의 언어이다. 쉽게 말하면 RDB에서의 질의 언어 Oracle, PostgreSQL 등과 같이 GDB를 대상으로 하는 질의 언어가 Cypher라고 생각하면 된다. 

Cypher 특징 

Cypher의 주요 특징은 다음과 같다. 

1. Cypher는 선언형(Declarative) 언어이다. 

명령형은 어떤 일을 어떻게 할것인가에 관한 HOW의 접근이고, 선언형은 무엇을 할 것인가에 관한 What의 접근이다. 

명령형 언어는 실행될 알고리즘을 명시하는 반면 선언형 언어는 목적을 명시한다.

예시(출처: https://medium.com/@kimdohun0104/사람들은-왜-선언형-ui에-열광할까-1440d03f4e49)

 

Cypher는 선언형 언어이다. 명령형 언어와는 대조적으로 목표를 명시하므로 사용자가 질의를 함에 있어 세부적인 구현에 대한 부담을 덜어준다. 

 

2. Cypher는 패턴 일치(Pattern Matching)한다.

Cypher는 찾고자 하는 그래프 데이터를 그리듯 표현하는 언어이다. 찾고자 하는 그래프 패턴을 ASCII Art처럼 괄호와 대시 등을 사용하여 표현하며 해당 패턴과 일치하는 그래프 데이터를 찾는다

찾고자 하는 형태를 직접 그리기 때문에 직관적으로 질의문을 작성할 수 있다. 3. Cypher는 표현력(Expressive)이 좋다. 

Cypher는 표현이 풍부한 질의를 위해 다양한 처리 방식들을 차용하였다. SQL에서 WHERE와 ORDER BY 같은 대부분의 키워드, SPARQL에서 패턴 매칭, Haskell & Python에서 collection 개념을 빌려오는 등 다양한 언어에서 방식들을 차용해 익숙하면서도 간단하게 질의를 표현할 수 있다

 

Cypher의 기본 요소 

Cypher의 기본 요소로는 node, edge, vlabel, elabel, property, variable이 있다.  

노드(Node)는 그래프를 구성하고 있는 가장 기본적인 요소이며 객체를 나타낸다.

 

Cypher에서는 위와 같이 괄호()를 이용하여 표현한다. 

엣지(Edge)는 각 노드 사이의 관계를 나타내며 엣지 단독으로 존재할 수 없다.

 

Cypher에서는 위와 같이 대괄호[]와 하이픈-을 이용하여 표현하며 방향성을 나타낼 때 화살표를 추가한다. 

노드 레이블(Vlabel)은 노드들을 분류하는 기준이 되도록 사용자가 부여한 특정 이름이다.

 

Cypher에서는 위와 같이 노드를 나타내는 괄호() 안에 콜론:을 붙이고 노드레이블을 입력하는 형태로 표현한다. 

에지 레이블(Elabel)은 에지의 이름으로 노드사이의 관계를 나타내는 역할을 한다.

 

Cypher에서는 위와 같이 에지를 나타내는 형태 안에 콜론:을 붙이고 엣지레이블을 입력하는 형태로 표현한다. 

속성(Property)은노드 혹은 엣지에 개별적, 차별적으로 부여할 수 있는 속성이다.

 

Cypher에서는 위와 같이 노드의 경우 괄호(), 엣지의 경우 대괄호[] 안에 중괄호{}를 이용하여 속성명:속성값의 형태로 표현한다. 

 

Variable 

변수(Variable)는 노드나 엣지에 임의로 부여되는 식별자이다. 

 

Cypher에서는 위와 같이 콜론:앞에 노드나 에지의 이름에 해당하는 레이블을 임의로 나타내는 식별자 형태로 표현한다.

 

 

 

글 : 김무성 전임 ( 비트나인 Product 기획팀 )