Neo4j는 가장 인기 있는 그래프 데이터베이스 중에 하나입니다. 상용버전 뿐만이 아니라 오픈소스 버전도 존재합니다. Neo4j는 ‘4j’가 자바 언어(Java Language)로 구현되었음을 의미하며, 이들 생태계는 기본적으로 JVM(Java Virtual Machine) 기반위에서 동작합니다. Neo4j 클라이언트는 루비(Ruby)와 파이썬(Python)과 같은 다른 언어를 지원합니다.
루비(Ruby)
루비 프로그래밍 언어는 간결하면서도 표현력이 막강한 객체지향형 스크립트 언어로 마츠모토 유키히로가 1995년에 만들었습니다. 웹 개발을 위한 오픈 소스 프레임워크인 루비 온 레일즈에 이어서 시스템 관리 부문의 오픈 소스에서도 많이 사용되면서 인기를 끌고 있습니다.
루비는 기존에 스크립트 형식의 프로그래밍 언어인 파이썬(Python) 이나 펄(Perl)에 익숙한 개발자이거나 함수형 언어를 이해하는 개발자에게는 이해하기 쉬울지 모르지만 처음으로 스크립트 언어를 배우는 사람이 읽기에는 구성과 설명이 다소 어렵습니다.
루비는 인터프리터 형식으로 실행되는 고기능 언어이자 뛰어난 객체 지향적 언어입니다. 이러한 특성을 가지면서 루비와 같이 가독성이 뛰어난 대표적인 스크립트 언어는 파이썬(Python)입니다.
파이썬이 정형화된 들여쓰기를 요구하는 반면 루비는 정형화된 서식을 요구하지는 않습니다. 사용자 수와 구현 시스템의 수와 질 등을 비교해 보면, 세계적으로 파이썬이 인기가 더 많습니다. 루비는 개발자가 일본인이기 때문에 일본에서는 루비의 인기가 높습니다. |
Neo4J의 특징
① JTA(Java Transaction API) 지원
② REST(Representational State Transfer) 방식 지원.
③ 이중화를 통한 고가용성을 지원(Zookeeper)
④ 인덱스(Index) 및 노드 탐색 지원
⑤ 백업 / 복구 지원
JTA(Java Transaction API) 자바 트랜잭션 API(Java Transaction API, JTA)는 XA 리소스(예: 데이터베이스) 간의 분산 트랜잭션을 처리하는 자바 API입니다. 하나의 데이터베이스나 여러 개의 데이터베이스에서 발생하는 트랜잭션을 제어하기 위한 목적으로 사용합니다.
REST(Representational State Transfer) 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식(Style)입니다. 이 용어는 로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개되었습니다.
REST는 웹 2.0의 패러다임으로 등장했던 Open API을 보다 간단하게 제공하기 위해서 사용되었던 방식입니다. 발표 당시에는 대규모의 네트워크 시스템을 위한 방법이라는 뜻으로 발표한 것이지만 현재는 HTTP와 XML을 이용하여 데이터를 주고 받은 웹 서비스를 이용하는 것으로 사용되고 있습니다.
다음은 SOAP(Simple Object Access Protocol) 방식과 REST 방식의 웹 서비스를 비교한 그림입니다. SOAP 방식은 복잡한 형태의 메시지 구조를 가지고 있으며, 데이터를 전송하기 위해서 TCP와 UDP 같은 네트워크의 전송 프로토콜을 이용합니다. REST 방식은 간단하게 URL을 통해서 서비스를 호출하게 되며, URI를 통해서 다양한 조작이 가능합니다. 아래의 그림에서 URL은 “http://localhost:9002”를 말하며, URI는 “moviewservice/movies/001” 을 의미합니다. 결과는 XML이나 JSON 형식으로 반환이 됩니다.
[ SOAP 방식과 REST 방식의 비교 ] |
Neo4J의 데이터의 표현
그래프 모델(Graph Model)에서 그래프(Graph)는 정점(Vertex)과 간선(Edge) 그리고 프로퍼티(Property)로 구성이 되어 있습니다. 이러한 데이터 표현은 관계형 데이터베이스의 객체-관계(Entity-Relationship) 모델과 일치합니다. 정점(Vertex)은 노드(Node) 의미하며 완전히 동일하지는 않지만 관계형 데이터베이스의 객체(Entity)와 유사합니다. 간선(Edge)은 관계(Relationship)를 나타냅니다.
아래의 그림은 그래프를 구성하는 3대요소(노드, 관계, 프로퍼티)를 도식화한 것입니다. 노드(Node)는 정점(Vertex)를 의미하며, 관계(Relationship)은 간선(Edge)를 의미합니다. 마지막으로 프로퍼티(Properties)는 노드와 관계에 대한 속성 값을 의미합니다.
[ 그래프의 구성요소 ]
Neo4j의 데이터 구조
노드(Node)와 관계(Relationship)은 각각의 데이터 구조를 가지고 있습니다. 아래의 표는 노드와 관계에 대한 데이터구조를 나타낸 것입니다.
노드(Node)
ID | 식별자 |
inUse | 존재하면 ‘1’, 아니면 ‘0’ |
nextRelID | 노드에 연결된 첫번째 관계의 식별자 |
관계(Relationship)
ID | 식별자 |
inUse | 존재하면 ‘1’, 아니면 ‘0’ |
firstNode | 간선(Edge)의 시작노드(Source node) 식별자 |
secondNode | 간선(Edge)의 목적노드(Destination node) 식별자 |
firstPrevRelID | 시작노드(Source node)의 이전 관계(Relationship) 식별자 |
firstNextRelID | 시작노드(Source node)의 다음 관계(Relationship) 식별자 |
secondPrevRelID | 목적노드(Destination node) 이전 관계(Relationship) 식별자 |
secondNextRelID | 목적노드(Destination node) 다음 관계(Relationship) 식별자 |
아래의 그림은 노드(N1, N2, N3, N4)와 관계(E1, E2, E3, E4, E5)를 그래프로 도식화한 것입니다. 관계는 두 노드 사이의 연결을 표현하는 것으로 단방향 또는 양향일수 있으며, 노드로 들어오는 관계인 ‘incoming’ 과 노드에서 나가는 관계인 ‘outgoing’을 가집니다.
[ Neo4j의 데이터 표현 ]
상단의 그래프를 노드와 관계로 표현을 하면 아래처럼 정리할 수 있습니다.
Neo4j의 활용 분야
소셜 네트워크 서비스는 태생적으로 그래프로 데이터를 표현하기에 적합한 구조를 가지고 있습니다. 트위터(Twitter)를 보면 글을 게시하는 특정 사용자를 다른 사람이 팔로우(follow)하는 구조를 보면, 한 노드와 다른 노드와의 관계(Relationship)를 그래프로 표현할 수 있습니다.
다음 그림은 매트릭스에 나오는 인물들에 대한 관계도를 나타내고 있습니다. 이러한 구조를 페이스북(Facebook)에서도 이용하고 있으며, 두 노드간의 관계들을 계속 확장하여 이전에는 몰랐던 새로운 인간 관계를 발견할 수 있습니다. 또한 인간관계들을 더욱 확장하여 이들 관계에서 가장 영향력을 발휘하는 사용자들을 찾아내어 마케팅에 활용할 수도 있습니다.
[ 매트릭스의 인물 관계도 ]
Neo4j 라이선스(Licenses)
Neo4J는 3가지의 라이선스를 가지고 있습니다. ‘Community’는 MySQL처럼 자유롭게 사용할 수 있으며, GPL 라이선스여서 프로그램에 포함하는 경우가 아니라면 소스를 공개할 의무가 없습니다. ‘Advanced’는 모니터링과 운영 지원이 포함되어 있습니다. 이 버전에서는 소스 코드는 무료로 이용이 가능하지만 소스 코드에 대한 수정사항은 커뮤니티의 이익을 우해서 공개되어야 하는 AGPL 라이선스 규정을 준수해야 합니다. 만약 소스 코드에 대한 공개를 하지 않기 위해서는 상용 라이선스를 구매해야 합니다. 마지막으로 ‘Enterprise’는 Auto Replication과 전체적인 모니터링을 지원하며 24시간 운영 지원이 포함되어 있습니다.
'빅데이터 > No SQL' 카테고리의 다른 글
NoSQL 7종 비교 (0) | 2017.09.10 |
---|---|
H베이스(HBase) (0) | 2017.08.04 |
카산드라(Cassandra) (0) | 2017.08.04 |
카우치DB(Couch DB) (0) | 2017.08.04 |
몽고DB(Mongo DB) (0) | 2017.08.04 |