Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

GraphDB

그래프데이터베이스(GDB)는 시맨틱 쿼리를 위해서 노드와 엣지로 구성되는 그래프 구조를 사용하여 데이터를 표현하고 저장하는 데이터베이스다.

데이터의 관계를 직접 연결하기 때문에 서로 연결된 데이터들을 한번의 작업으로 검색 할 수 있다. 그래프 데이터베이스에서는 관계가 가장 중요하다. 이들 관계는 데이터베이스에 직접 저장되기 때문에 매우 빠르다.(RDBMS의 경우에는 이러한 관계가 직접 저장되지 않는다.) 관계가 직접 저장 되기 때문에 시각화하기가 쉽고, 소셜 네트워크와 같은 상호 연결된 데이터에 유용하다.

GDB는 NoSQL 유형으로 RDBMS의 (관계 데이터를 저장하고 질의하기 어려운)한계를 해결하기 위해서 만들어졌다. RDBMS는 암시적으로 데이터를 연결하지만 GDB는 명시적으로 데이터를 연결한다. 그래서 GDB는 데이터의 관계에 레이블의 지정, 방향의 지정, 속성을 지정 할 수 있다. 이러한 관계가 암시되고 런타임에 수정되어야 하는 관계형 데이터베이스의 접근 방식과 비교된다.

그래프 데이터베이스의 저장 매커니즘은 다를 수 있다. 일부는 관계형 데이터베이스 엔진에 의존하고 어떤 RDB는 Key-Value 저장소 혹은 문서지향 데이터베이스를 사용하여 본질적으로 NoSQL 구조를 만들기도 한다.

그래프 데이터베이스는 그래프 컴퓨터 엔진과는 다르다. 그래프 데이터베이스는 OLTP 데이터베이스로 사용되며, 그래프 컴퓨팅 엔진은 OLAP를 위해서 사용한다.

2000년대 중반 ACID를 지원하는 Neorj와 Oracle Spatial 과 같은 사용 데이터베이스들이 개발되었다. 이후 OrientDB, ArangoDB, MarkLogic, Neptune(AWS) 등의 데이터베이스들이 개발된다. 이들 데이터베이스는 특히 소셜네트워크 분석에서 널리 사용하고 있다.

개념

 그래프 DB 개념

GDB는 노드(Node)와 엣지(Edge)로 구성된다. 노드는 사람, 회사, 브랜드, 상품, 위치와 같은 추적할 엔티티 또는 인스턴스를 나타낸다. 관계형 데이터베이스의 레코드, 문서지향 데이터베이스의 문서와 유사하다.

엣지는 노드와 노드를 연결하며 둘 간의 관계를 표현한다. 연결은 방향을 가질 수 있다.

노드와 엣지는 속성을 가질 수 있다. 이 속성을 이용해서 카테고리로 묶을 수 있다. 예를 들어 상품명, 회사, 직원, 고객 등이 속성이 될 수 있다.

Neo4j

개념은 이 정도로 하고 대표적인 GDB인 Neo4j를 설치해서 테스트해보자. AWS를 주로 사용하기 때문에 Neptune을 사용해보고 싶었으나 비용 문제도 있고 해서 일단 Neo4j로 시작하기로 했다.

Docker Neo4j 설치

# docker run --name myNeo4j -p7474:7474 -p7687:7687 -e NEO4J_AUTH=neo4j/s3cr3t neo4j
  • 7474 : 웹 콘솔 포트
  • 7687 : Bolt 포트. Bolt는 명령문 방식의 연결지향 네트워크 프로토콜이다. PostgreSQL에서 파생된 데이터 교환 방식에서 영감을 받아 만들었다. Neo4j와 함께 개발된 프로토콜이다.
http://localhost:7474 로 접근해보자.

 neo4j 웹콘솔

웹콘솔에 로그인하면, 쿼리를 실행하고 시각화된 결과를 확인 할 수 있다.

Example 실행

Neroj 를 설치하면 Movie Graph와 Northwind Graph 스크립트를 로컬에서 테스트 할 수 있다. Neo4j 쿼리를 테스트하는데 유용하게 사용 할 수 있다.

 Example 실행

Movie 예제를 실행해보자.

 예제

간단한 쿼리를 실행했다. 대충 어떤 쿼리인지 감이 올 것이다.
MATCH (movie:Movie) WHERE movie.title='The Matrix Reloaded' RETURN movie
title이 "The Matrix Reloaded"인 Movie 노드를 가져오라는 쿼리다.

 예제-2

이 스크린 샷은 몇 가지 중요한 정보를 포함하고 있으니 분석해보자.
  • Labels : 각 노드는 라벨을 가질 수 있다. 이 데이터베이스는 Movie와 Person 두개의 라벨을 가지고 있다.
  • Relationship : 노드는 서로 연결되기 전에는 독립적으로 존재한다. Relationship(관계)를 이용해서 노드를 연결 해서 노드들의 그래프를 만들 수 있다. 여기에는 ACTED_IN, DIRECTED, FOLLOWS, PRODUCED, REVIEWED, WROTE 의 관계가 있다.
쿼리를 좀 더 확대해보자. "The Matrix Reloaded"에 참여한 배우 정보를 가져와 보자.

MATCH (m:Movie)<-[r]-(n) WHERE m.title='The Matrix Reloaded' RETURN m, n

 예제

Neo4j는 cypher이라는 쿼리언어를 제공하는데, 제법 SQL과 유사한 면이 있다. 관계는 화살표를 이용해서 나타낼 수 있다. 위의 쿼리를 분석해보자.

MATCH : SQL의 SELECT와 유사하다. 일치하는 것을 찾으라는 의미다.

(m:Movie) : 여기에서 찾고자 하는 노드는 Movie 다. Cypher는 변수를 지원하는데 "m"을 변수로 사용했다. 프로그래밍언어에서의 변수처럼 Movie노드를 참조 할 수 있다.

<-[r]- : 화살표를 이용해서 관계를 표현한다. 꽤 직관적이다. 대괄호([])를 이용해서 어떤 관계를 가져올지 지정 할 수 있다. 여기에서는 모든 과정을 가져온다. 관계는 변수 r로 참조 할 수 있다. 예제에서는 relation label을 따로 지정하지 않았기 때문에, 모든 relation을 출력했다.

WHERE : SQL의 WHERE와 유사하다. 검색조건을 설정 할 수 있다. m.title='The Matrix Reloaded' 즉, Movie의 제목(title)인 The Matrix Reloaded인 Node를 찾는다.

RETURN : 검색 결과를 리턴한다. 결과적으로 "The Matrix Reloaded"와 관계를 맺은 모든 노드들을 출력하게 될 것이다.

The Matrix Reloaded에 출연한 배우들만 가져오도록 쿼리를 수정했다.
MATCH (m:Movie)<-[r:ACTED_IN]-(n) WHERE m.title='The Matrix Reloaded' RETURN m,n

 예제

cypher 쿼리

현재 산업에서는 Gremlin, SQPRQL과 같은 그래프 쿼리 언어를 주로 사용한다. Neo4j는 cypher이라는 쿼리언어를 제공한다. 위의 간단한 예제에서 처럼 Cypher는 ASCII-Art 구문을 사용해서 시각적 패턴을 질의어로 쉽게 표현 할 수 있다. openCypher에서 chpher를 표준으로 하기 위한 작업이 진행되고 있다.

이 문서는 cypher 메뉴얼이 아니므로 이 쯤에서 넘어간다. 자세한 내용은 cypher 쿼리언어 개발자 가이드문서를 참고하자. SQL 사용자라면 필요 할 때 메뉴얼 찾아가면서 작업해도 될 것이다.

그래프 데이터 모델링

그래프 데이터 모델링에 대해서 간단히 살펴보려 한다.

데이터 모델링이란 개발자가 애플리케이션의 도메인을 분석하여 데이터베이스를 효과적으로 사용 할 수 있는 최적의 모델을 찾는 작업이라고 정의 할 수 있다. 그래프 데이터 모델링도 이와 마찬가지다. 데이터 모델링을 수행하는 엔지니어는 모델링을 위해서 이해 당사자에게 필요한 정보를 수집해야 한다. 이해 당사자는 아래와 같다.
  • 비즈니스 분석가
  • 아키텍트
  • 프로젝트 관리자
  • 프로젝트 리더
Neo4j에서 그래프 모델링의 지원 요소는 아래와 같다.
  • 속성 그래프를 생성하기 위한 완전한 그래프 데이터베이스 기능의 제공
  • 비즈니스 요구사항에 따라서 그래프를 탐색 & 검색하기 위한 기능들

Neo4j 속성 그래프 모델

Neo4j의 속성 그래프 모델의 구성요소는 아래와 같다.
  • 노드(Nodes 엔티티)
  • 관계(Relationships)
  • 속성(Properties)
  • 라벨(Labels)
 Neo4j Property

노드와 관계는 그래프의 핵심 구성요소다. 라벨은 노드 항목을 분류하기 위해서 사용한다. 관계는 노드와 노드를 연결하는데 방향과 유형을 가진다. 노드와 관계는 속성을 가질 수 있는데, 속성을 이용해서 노드와 관계에 값을 설정 할 수 있다.

그래프의 순회

 그래프 순회

MATCH (r:Residence)<-[:OWNS]-(p:Person)
WHERE r.address = '475 Broad Street'
RETURN p
순회는 속성 값을 기반으로 원하는 노드를 찾기 위해서 그래프를 순회하는 것을 의미한다. 이 예제에서 Residence 노드의 address 속성은 쿼리를 시작할 위치를 결정하기 위해서 사용한다. 그런 다음 OWNS 관계를 가지는 노드를 검색한다. 관계는 노드에서 한번만 순회 한다.

그래프 데이터 모델링 도구

 그래프 데이터 모델링 도구

그래프 데이터 모델링 도구는 협업시 특히 중요하다. 화이트보드에 그리는 방법도 있기는 한데, 권장할 만한 방법은 아니다. https://arrows.app 같은 툴을 사용해보자. 간단하게 모델링 할 수 있으며, 모델링 결과를 이미지와 cypher 로 export 할 수 있다.

그래프 데이터 모델링을 위한 워크 플로

 그래프 데이터 모델링 워크 플로우

정리

  • 그래프 데이터 모델링은 neo4j graphacademy 문서가 훌륭하다. 그래프 데이터베이스가 아닌 관계형 데이터베이스 모델링에 관점에서도 참고할 내용들이 많다.
  • 그래프 데이터 모델링만 따로 정리해야 겠다.