EN-Think
그래프 생성 비교 (Neo4j vs TigerGraph)
- 작성일2023/02/22 13:02
- 조회 2,173
그래프 생성 비교 (Neo4j vs TigerGraph)
- DSC 송서원 전임 -
안녕하세요, 엔코아 DSC에서 그래프 데이터베이스 관련 3번째 블로그 글을 게시합니다.
Neo4j, TigerGraph는 대표적인 그래프데이터베이스社로 이번 글에서는 대표적인 그래프 DB에서 그래프를 생성하고 데이터를 로드하는 과정을 비교해보려고 합니다.
그래프 데이터를 위한 데이터베이스인 Neo4j와 TigerGraph는 그래프 구성 요소는 같으나 명칭은 살짝 다르고 SQL-Like라는 특징을 가진 그래프 질의어이지만 각 언어별로 다른 구조와 특징을 갖습니다. 그래프 데이터베이스 구축을 위해 그래프 데이터모델링을 하고 그래프를 생성/데이터 로드를 하게 되는데요, 여기서도 두 DB는 비슷하지만 다른 단계로 구성되어 있습니다.
아래 그림은 Neo4j의 그래프생성 및 데이터 로드 과정을 나타낸 그림 자료입니다.
[그림1] Neo4j의 그래프 생성 과정
Neo4j 의 경우에는 (DB생성) >> 노드생성 >> 관계생성 >> 그래프 쿼리 순서로 이루어져 있습니다. Neo4j는 동일한 DBMS 내에서 여러 데이터베이스 관리를 지원합니다(Multiple databases). 처음 Neo4j를 설치하면 ‘Neo4j (home)’과 ‘system’ 데이터베이스가 생성되는데, 목적에 따라 추가적으로 데이터베이스를 생성하여 사용할 수 있습니다.
Multiple databases는 Enterprise Edition에서만 가능합니다.
새로운 데이터베이스 생성은 필수가 아니므로, 사용하시는 Neo4j 환경에 따라 생성/생략하시고 다음 단계로 넘어가시면 될 것 같습니다. 혹시 Multiple database를 구성하셨다면 사용할 DB를 확인한 후에 데이터를 로드해야 합니다.
Neo4j에서 데이터를 생성할 때에는 CREATE/MERGE문을 CSV를 로드할 때에는 LOAD CSV 문을 많이 사용합니다. 데이터 양이 적은 경우에는 최근에 생긴 Importer도 편리할 것 같습니다. (1M rows 이하)
데이터를 생성할 때 관계의 경우 노드와 노드 사이에 존재하므로 노드를 먼저 생성한 후 생성해야 합니다. (시작점 – 끝점 명시 필요)
노드, 관계를 생성한 후, cypher를 이용하여 로드한 데이터, 연결된 형태의 그래프를 확인해보실 수 있습니다.
CREATE (a:Person {name: ‘Harry’, title: ‘Student’}), (b:Person {name: ‘Ron’, title: ‘sorcerer’}) (a)-[:KNOWS]->(b) |
CREATE 문을 이용한 노드, 관계 생성 예시
LOAD CSV WITH HEADERS FROM “file:/// ... ” AS row |
LOAD CSV 문을 이용한 노드 생성 예시
그리고 위 예시에서는 LOAD CSV, CREATE문을 이용한 생성이 예시로 나와있지만, MERGE, apoc, Neo4j importer, ETL 툴 이용 등 다양한 import 방법들이 존재합니다!
다음으로 TigerGraph의 그래프 생성과정을 살펴보도록 하겠습니다.
[그림2] TigerGraph의 그래프 생성과정
TigherGraph의 경우에는 VERTEX 정의 >> EDGE 정의 >> GRAPH 정의 >> 데이터 로드 >> 그래프 쿼리 순서로 이루어져 있습니다.
TigherGraph의 데이터 로드 과정은 크게 3단계로 볼 수 있습니다.
- 1단계: Create Schema
- 2단계: Load Data
- 3단계: Run Queries
그림 상의 DROP ALL 명령어는 모든 그래프 데이터, 그래프 스키마, 모든 로드작업 및 쿼리를 삭제합니다. 필요한 경우에만 사용하시기 바랍니다.
TigerGraph 에서는 데이터를 로드하기 위해서 그래프스키마를 먼저 생성해주어야 합니다.
스키마 생성은 Vertex 생성 (정의) → Edge 생성(정의) → 그래프 생성(정의) 단계로 구성됩니다.
Neo4j와 같은 CREATE 문을 사용하지만 Neo4j 와 다르게 데이터가 있는 vertex나 edge가 생성되는 것이 아니고 각 vertex/edge의 “유형”이 정의됩니다. 그리고 그래프를 생성할 때 정의되어 있는 유형중 어떤 vertex/edge 를 포함할 것인지(사용할 것인지) 명시하면 됩니다.
CREATE GRAPH know_network ( Person, KNOWS ) CREATE GRAPH Graph_All (*) CREATE GRAPH Graph_Empty ( ) |
-- ① -- ② -- ③ |
TigerGraph에서의 그래프 정의 예시
①의 경우에는 Person과 KNOWS를 포함하는 ‘know_network’이름의 그래프를 정의하는 코드입니다. ②, ③ GSQL은 정의된 모든 vertex, edge를 포함하는 그래프 Graph_All을, 아무것도 포함하지 않는 그래프 Graph_Empty를 생성하는 코드입니다.
이어서 데이터 로드입니다. 그래프 스키마를 생성하면 비로소 데이터를 로드할 준비가 된 것입니다!
데이터 로드는 LOADING JOB을 생성하고 생성한 JOB을 실행하는 단계로 구성됩니다. TigerGraph에서는 CREATE LOADING JOB 문을 이용하여 특정 그래프에 데이터를 로드하는 작업을 통해서 데이터를 로드할 수 있습니다. 해당 GSQL에는 대상 그래프명, 데이터 파일, 데이터로드 상세설정 등이 포함됩니다.
CREATE LOADING JOB job_1 FOR GRAPH know_network DEFINE FILENAME file1 = "/data/person.csv"; } RUN LOADING JOB job_1 |
TigerGraph LOADING JOB 예시
Neo4j의 CREATE 문이나 LOAD CSV문이 여기에 해당된다고 생각하시면 될 것 같습니다. Neo4j CREATE 문에서는 보통 한 파일단위로 노드나 관계를 생성하는데 TigerGraph 에서는 여러 개의 CSV를 한번에 로드할 수 있다는 차이가 있네요.
에러 없이 LOADING JOB 이 생성되면, 생성된 JOB을 실행시켜 주시면 됩니다. 데이터가 로드된 후 GSQL이나 Graph Studio 상에서 노드, 관계를 생성한 후, cypher를 이용하여 로드한 데이터, 연결된 형태의 그래프를 확인해 보실 수 있습니다.
각 DB에서 그래프를 생성한 후 스키마를 확인하거나 그래프 질의를 하는 방식도 조금 다릅니다.
Neo4j에서는 CALL db.schema.visualization 명령어로 스키마를 확인하고 브라우저나 cypher-shell에 cypher를 입력하여 실행하는 방식입니다. TigerGraph에서는 Graph Studio >> Design Schema 메뉴에서 스키마를 확인할 수 있고 그래프 질의 시 데이터로드 방법과 유사하게 쿼리 작성 → 쿼리 설치 → 쿼리 실행의 단계를 거쳐야 합니다.
이와 같이 Neo4j와 TigerGraph에서의 그래프 생성, 데이터 로드에 대하여 알아보았습니다. 모두 그래프 데이터베이스지만 각각 그래프를 생성하고 데이터를 로드하는 방법은 조금씩 다르며 장단점이 있는 것 같습니다.
보시고 궁금한 사항은 질문 주시기 바랍니다.
감사합니다.
참고
https://docs.TigerGraph.com/gsql-ref/current/appendix/gsql-start-to-end-process
https://docs.TigerGraph.com/gsql-ref/current/tutorials/gsql-101/define-a-schema
https://docs.TigerGraph.com/gsql-ref/current/ddl-and-loading/defining-a-graph-schema#_create_graph