안녕하세요, 린치핀소프트 한광희입니다.

이번 포스트에서는 그래프 데이터베이스(Grpah Database)의 한 종류인 Neo4j 에 대한 소개입니다. 최근 프로젝트를 진행하며 사용한 RDBMS인 MySQL에 대해서 약간의 불만스러움이나 귀찮음을 느끼고 있었습니다. 프로젝트가 계속 진행됨에 따라서 그때그때 발견된 내용을 새로이 데이터베이스에 적용하려면 기존의 테이블 스키마(Schema)를 수정하거나 워드프레스의 메타 테이블처럼 “Key” / “Value” 기반으로 테이블을 설계해서 운용을 하곤 했지만, 각 테이블간의 Join 관계와 같이 참조관계가 복잡해질때는 조직 내에서 MySQL에 기반해서만 운용하기에는 조금 어려움이 많다는 생각이 들곤 했습니다.

그래서 오늘 소개하는 RDMBS가 아닌 그래프 데이터베이스(Graph Database) 의 대표 솔루션 중 하나인 Neo4j 에 대해서 사용해보고 간략히 그 특징을 소개해보고자 합니다.

 

<https://neo4j.com/ Neo4j 공식 사이트>

Neo4j 는 현재 Community Edition 을 통해 PC에 로컬로 설치하거나 클라우드 PC등에서 설치하여 이용할 수 있습니다. 저같은 경우도 Edtion 버전을 아마존 AWS EC2 의 클라우드 서버에 설치해서 원격으로 접속하여 이용하고 있습니다.  저와 같이 클라우드 환경에서 설치하여 이용하실때에는 조금 더 몇가지 설정을 해야 합니다. 우선 클라우드 보안환경에서 Neo4j가 이용하는 7474번 기본 포트가 열려있는지 확인해야 하며, 몇가지 환경설정 파일에서 옵션들을 주석해제 해주어야 합니다.(Ubuntu 16.04 OS 기준 /etc/neo4j/neo4j.conf 파일을 기준으로 몇가지 주석을 해제해주어야 원활히 이용 할 수 있습니다. dbms.connectors.default_listen_address=0.0.0.0 , dbms.connector.http.enabled=true,dbms.connector.http.listen_address=:7474 같은 부분이 주석처리된 경우에는 주석을 해제해주세요.)

Neo4j를 정상적으로 설치하고 나면 로컬PC의 설치의 경우 웹브라우저를 통해 http://localhost:7474 로 접속이 가능하고 클라우드 환경에서는 http://<클라우드 IP주소>:7474 로 접속이 가능합니다.

 

<Neo4j 웹 브라우저 화면>

상기 스크린샷처럼 Neo4j의 웹브라우저 관리화면으로 접속하게 되면 보이는 화면입니다. 우리가 MySQL과 PHP를 설치하고 phpMyadmin 을 통해 MySQL 내의 데이터베이스와 테이블,레코드를 확인할수 있는 웹 브라우저 프로그램이 존재하는것처럼 Neo4j의 경우는 기본으로 데이터베이스를 확인 및 쿼리(Query)를 질의할 수 있는 위 웹 브라우징 프로그램을 제공합니다.
그래프 데이터베이스와 MySQL과 같은 종래의 RDMBS(Relational Database Management System) 과 상이한 점이 많지만, 가장 두드러진 특징이라고 생각되는 특징은 테이블과 같은 “스키마(Scheam)”가 명시적이지 않다는 점과 데이터가 노드(Node)와 관계(Relationship)으로 구성되며 RDBMS에서 사용했던 SQL(Structured Query Language)를 이용하는게 아닌 Neo4j 에서는 Cypher Query를 이용하여 데이터를 질의해야 합니다.

<Cypher Query 예시>

위 예시는 “a”, “b” 라는 두 노드(node)와 a->b 간에 “LIKES” 라는 관계가 성립된다는 “데이터베이스 쿼리”입니다. Neo4j 에서는 노드는 “( )”로 표현되고 관계(relationship)은 ” [ ]”로 보통 표현됩니다. 그래서 위 예시처럼 ” (a) – [:LIKES] -> (b) “와 같이 Cypher Query를 작성하면 Neo4j 데이터베이스에서 (a),(b) 노드가 “LIKES”라는 관계를 가지고 표현된다고 관계를 규정할수 있습니다.

<Node과 Relationship 을 통해 데이터를 네트워크 그래프로 표현되는 Neo4j 예시>

이렇듯 Cypher Query를 통해 노드를 정의하고 노드와 노드간의 관계(Relationship)을 정의하면 위처럼 데이터베이스를 네트워크 그래프로 시각화하여 표현하여 줍니다. 단연 이런 시각화에 기반하여 데이터베이스를 확인할수 있다는 점이 Neo4j가 종래의 RDMBS와 다른 차별점이라고 생각합니다.(기존 RDBMS에서 모든 데이터를 테이블기반으로 표현해주었다면, Neo4j 와 같은 그래프 데이터베이스는 “그래프”로 데이터를 표현하는데 그 핵심이 있다고 생각합니다.)

<Neo4j 로 표현한 서점 – 구매자 정보 데이터베이스 시각화>

위는 Neo4j 의 Cypher Query 를 이용하여 Bookstore / Person 이라는 2개의 노드를 생성하고 “buy_book” 이라는 관계를 생성하여 Neo4j상의 데이터베이스 시각화로 조회한 모습입니다. 해당 쿼리를 작성하고 데이터입력후 확인하는데 까지 1시간 내외의 시간이 소요되는 점에서 그래프 데이터베이스 Neo4j 의 효율성을 체감했습니다.

<Person / Bookstore 2 노드와 buy_book 관계로 설정된 데이터베이스의 그래프 시각화>

현재는 PHP와 Python 같은 다양한 프로그래밍 언어 환경에서도 Neo4j 데이터베이스를 이용할 수 있는 다양한 패키지와 라이브러리가 제공되고 있습니다. 이어 연재되는 포스트에서는 이 Neo4j 를 활용한 실제 프로젝트에 있어서의 활용 방안과 그 효과에 대해서 소개해보도록 하겠습니다.