JanusGraph/JanusGraph 실습
[실습] Gremlin vs Cypher 상황별 성능 비교 실험 설계
Severus Moriarty
2025. 4. 21. 21:26
✅ 1. 실험 목표 정의
실험 목적 |
비교 기준 |
그래프 쿼리 언어의 실행 성능 비교 |
Latency, Memory usage |
표현력/추상화 수준 비교 |
쿼리 길이, 가독성 |
자동화 및 파이프라인 통합성 |
스크립트화/LLM 연계 가능성 |
확장성 |
노드/엣지 수 증가에 따른 처리 시간 변화 |
📁 2. 실험 구성 요소
📌 데이터셋
- 사용 데이터: ogbl-wikikg2 (2.5M nodes, 16M triples)
- 형식: JSON → Triple(subject, predicate, object) → Gremlin/Cypher 삽입
- 구성: 관계(Pxxx) + 엔티티(Qxxx) 기반 그래프
🧪 실험 시나리오 분류 (작업 유형별)
상황 유형
|
설명 |
목적 |
단일 홉 조회 |
예: Q1 → P31 → Q2 |
기본 트래버설 속도 측정 |
다중 홉 경로 추적 |
예: Q1 → P31 → ... → Qn (depth 3~5) |
경로 탐색 효율성 비교 |
조건 필터 포함 질의 |
예: P31이 Q5인 노드 중 P27이 Q145인 것 |
복잡도 대비 성능 측정 |
하위그래프 추출 |
특정 엔티티 기준 subgraph 반환 |
그래프 생성 및 필터링 성능 |
삽입/삭제 작업 |
노드 및 엣지 추가/제거 |
트랜잭션 처리 성능 |
링크 예측 시뮬레이션 |
특정 관계의 존재 여부 추정 |
ML 모델 연계 가능성 |
📊 Wikidata 기반 그래프 성능 비교 실험 흐름표
단계
|
처리 내용 |
설명 |
결과물 |
[1] Wikidata JSON |
원본 데이터 수집 |
Wikidata에서 전체 JSON 덤프 다운로드 |
latest-all.json.bz2 |
↓ 파싱 및 전처리 |
필터링 및 관계 추출 |
주요 엔티티(Qxxx), 관계(Pxxx) 추출 및 전처리 |
subject, predicate, object 추출 |
[2] Triple 변환 |
그래프 구조로 재정렬 |
(subject, predicate, object) 형태의 삼중항 생성 |
Triple List |
[3-A] Gremlin 삽입 |
JanusGraph 등 삽입 |
각 Triple을 Gremlin 트래버설 문법으로 변환 및 삽입 |
Gremlin 기반 그래프 DB |
[3-B] Cypher 삽입 |
Neo4j 등 삽입 |
동일 Triple을 Cypher 문법으로 변환 및 삽입 |
Cypher 기반 그래프 DB |
[4] 동일 쿼리 실행 |
시나리오 기반 쿼리 실행 |
단일 홉, 다중 홉, 필터 포함 질의 등 동일 실험 조건 적용 |
실행 결과 및 시간 측정 |
[5] 성능 비교 |
분석 및 정리 |
Latency, 표현력, 확장성, 유지보수성 등 비교 |
성능 분석 보고서 / 표 / 그래프 |
🧪 3. 실험 설계 및 평가 지표
🔸 Step 1. 데이터 삽입
- 동일한 JSON → Triple 기반으로 두 개의 그래프 DB 생성(자동 변환 기능 활용)
- Gremlin 기반: JanusGraph, TinkerGraph, Neptune 등
- Cypher 기반: Neo4j
- 삽입 시 각 엔티티는 (:Entity {id: 'Q42'}), 관계는 [:P31]로 표현
🔸 Step 2. 동일 쿼리 작성 및 실행
실험 항목 |
Gremlin 예시 |
Cypher 예시 |
단일 홉 탐색 |
g.V().has('id','Q42').out('P31') |
MATCH (a:Entity {id:'Q42'})-[:P31]->(b) RETURN b |
다중 홉 탐색 |
g.V().has('id','Q42').repeat(out()).times(3) |
MATCH (a:Entity {id:'Q42'})-[:*1..3]->(b) RETURN b |
조건 탐색 |
.has('P27','Q145') |
MATCH (a)-[:P27]->(b {id:'Q145'}) RETURN a |
- 각 쿼리별 실행 시간, 반환 노드 수, 표현 길이, 쿼리 난이도 기록
🔸 Step 3. 성능 측정 항목
지표 |
측정 방법 |
쿼리 Latency |
평균 실행 시간 (ms) |
메모리 사용량 |
실행 중 peak memory (MB) |
쿼리 길이/가독성 |
라인 수, 중첩 구조 분석 |
확장성 |
샘플 그래프 크기 증가 대비 응답 시간 변화 |
에러 발생률 |
예외 발생 여부 (필터 실패, 노드 미탐색 등) |
자동화 연계성 |
API 연동 편의성, LLM이 쿼리 생성 시 정확도 |
쿼리 표현력
|
도메인 별 표현의 쿼리 표현 변환 가능성 |
🎯 결과 정리 및 분석 방식
📈 결과 시각화 예시
- 쿼리별 Latency bar chart
- 그래프 크기 대비 응답 시간 line chart
- 쿼리 길이 대비 표현력 scatter plot
- 쿼리 자동 생성 정확도 비교 표
🔄 반복 실험 조건
조건 |
설명 |
그래프 크기 변화 |
10K → 100K → 1M 노드로 점진적 확장 |
관계 밀도 변화 |
Triple 수 2x/5x/10x 증가 |
캐시 여부 |
cold-start vs warm-cache 구분 |
📌 실험을 통해 알 수 있는 것(예상)
항목
|
Gremlin 우위 |
Cypher 우위 |
경로 탐색/복잡 쿼리 |
✅ 다중 홉 + 조건 처리 |
⚠️ 표현 복잡 |
초보자 친화적 질의 |
⚠️ 문법 난해 |
✅ SQL 유사 |
대규모 분산 환경 |
✅ TinkerPop 기반 확장성 |
⚠️ Neo4j 한정 |
자동화 및 LLM 연계 |
✅ 함수형 쿼리 조합 |
⚠️ 선언적 구조 제한 |