JK
プロジェクト
JK
>読み込み中 // 読み込み中
ビューを初期化中
制作・デザイン:JK
JK
>読み込み中 // PROJECT DETAILS
PARSING ARCHITECTURE, DIAGRAMS & API ENDPOINTS
プロジェクト一覧に戻る
GitHubで見る
グラフデータベース性能ベンチマーク
完了goneo4jmemgraphtigergraphdocker

グラフデータベース性能ベンチマーク

グラフDBとRDBMS間における探索速度、メモリ消費、クエリ効率を多角的に検証した分析基盤。

課題と解決策

多層ソーシャルグラフや推薦機能において、どのデータストアが最適であるかを客観的データに基づき選定すること。

機能

  • 深さごとの探索自動ベンチマークスイート
  • レイテンシパーセンタイル(p50, p95, p99)の詳細比較
  • メモリ使用量およびCPU負荷の可視化
  • Dockerによる完全再現可能な検証環境

技術スタック

技術バージョン目的採用理由
Go1.25.1Primary languageStrong concurrency primitives, fast compilation, good driver ecosystem
neo4j-go-driver/v6v6.2.0Bolt protocol client for CognoDB, Neo4j, MemgraphOfficial driver, supports Bolt 5.x, parameterized queries
go-echarts/v2v2.7.2HTML chart generationGo-native, generates standalone HTML
godotenvv1.5.1Environment configurationStandard .env loading
net/httpstdlibREST client for TigerGraphNo external dependency needed

アーキテクチャ

Benchmark CLI

Go 1.25.1

Dataset Extractor

Data Loader

Summary Generator

Chart Generator

raw/

SNAP soc-Pokec .gz

processed/

nodes.csv, relationships.csv

results/

JSONL, CSV, HTML

CognoDB Cloud

Bolt 5.x, US-East-4

Neo4j AuraDB

Bolt, US-East-1

Memgraph Cloud

Bolt, US East

TigerGraph Savanna

REST/OpenCypher
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

Benchmark Engine

  • Adapter pattern with common GraphDatabase interface (16 methods)
  • 5 database adapters (4 active, FalkorDB disabled due to OOM)
  • Sequential workload executor with warm-up and measured iterations
  • Concurrent workload executor with N goroutines and sync.WaitGroup
  • Factory function for adapter creation from configuration

CLI Pipeline

  • 10 CLI entry points: benchmark, captest, charts, cleanup, dataset, load, runall, summary, verify, verify-load
  • JSONL append-only result output for crash resilience
  • CSV summary aggregation with percentile calculation
  • HTML chart generation via go-echarts
  • Pipeline automation via runall (verify → load → benchmark → report)

プロジェクト構成

cmd
benchmark
captest
charts
cleanup
dataset
load
runall
summary
verify
verify-load
internal
benchmark
concurrent.goConcurrent workload executor
measurement.goMeasurement struct + ResultWriter
runner.goSequential workload executor
safe.goPanic-recovery wrapper
database
cognodb
memgraph
neo4j
tigergraph
types
factory.goDatabase factory/registry
dataset
parser.goCSV node/relationship loader

APIエンドポイント

Query Workloads (ポート 0)

メソッドルート目的
CypherMATCH (n:Person {id: $id}) RETURN n.id AS idPoint lookup — single node by ID
CypherMATCH (n:Person {region: $val}) RETURN n.id AS id LIMIT 10Indexed lookup — nodes by region
CypherMATCH (n:Person {id: $id})-[:FRIEND]->(m:Person) RETURN collect(m.id)1-hop traversal — direct friends
CypherMATCH (n:Person {id: $id})-[:FRIEND]->()-[:FRIEND]->(m:Person) RETURN collect(DISTINCT m.id)2-hop traversal — friends of friends
CypherMATCH (n:Person {id: $id})-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->(m:Person) RETURN collect(DISTINCT m.id)3-hop traversal — extended network
CypherMATCH (n:Person) RETURN n.region AS region, count(n) AS cnt ORDER BY cnt DESC LIMIT 10Aggregation — region distribution
CypherCREATE (n:Person {id: $id, region: $region, ...})Write — create new node

データベース設計

PERSON

5 cols
idPK
string
region
string
gender
string
age
string
completion_percentage
string

FRIEND_EDGE

2 cols
from_id
string
to_id
string
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

Person (node label)

カラム型備考
idPKSTRINGUnique constraint, indexed
regionSTRINGIndexed
genderSTRINGNot indexed
ageSTRINGIndexed (CognoDB, Neo4j, Memgraph only)
completion_percentageSTRINGNot indexed

49,683 nodes extracted from SNAP soc-Pokec dataset. All properties are strings.

FRIEND (relationship type)

カラム型備考
source_idSTRINGPerson.id (from)
target_idSTRINGPerson.id (to)

100,000 directed relationships. No properties on edges. Many-to-many cardinality.

Directed graph: Person --[FRIEND]--> Person. Many-to-many via graph relationships (no junction table). Relationships are first-class citizens in the graph model.

主要な設計判断

Single Bolt Driver for 3 Databases

判断: Use neo4j-go-driver/v6 for CognoDB, Neo4j, and Memgraph

理由: All three support Bolt protocol; Cypher is logically equivalent

利点: Code reuse, consistent behavior across databases, adapter pattern isolates DB-specific behavior

トレードオフ: Cannot test database-specific optimizations; Memgraph has its own Go driver

MaxPoolSize = 1

判断: Single connection per benchmark run despite constant defining 10

理由: Measure single-connection latency; avoid connection pool effects

利点: Clean latency measurement without pool contention

トレードオフ: Doesn't test connection pooling behavior

JSONL for Raw Results

判断: One JSON object per line, append-only output

理由: Stream results without loading all into memory; easy to append across runs

利点: Resilient to crashes (partial results preserved)

トレードオフ: Requires full file scan for aggregation

No Retries on Measured Queries

判断: Zero retries for benchmark queries to capture true latency

理由: Network blips and failures are part of real-world performance

利点: Honest performance measurement including failure modes

トレードオフ: Network blips cause false negatives

Goroutine-Per-Client Concurrency

判断: Each concurrent client creates its own database connection

理由: Simulates real-world multi-client scenarios; avoids shared connection contention

利点: Realistic concurrency testing with independent connections

トレードオフ: Higher resource usage; connection limits become the bottleneck

MERGE for Idempotent Node Loading

判断: Use MERGE (upsert) instead of CREATE for node loading

理由: Makes loading idempotent — running multiple times doesn't create duplicates

利点: Safe re-runs, consistent dataset state

トレードオフ: MERGE is slightly slower than CREATE due to existence checks

テスト

None (no _test.go files)•ユニットテスト 0 件

テスト内容

  • Capability test matrix (cmd/captest/) — tests all 8 workload types against all databases with small 10-node graph
  • Connection verification (cmd/verify/) — tests basic connectivity and parameterized queries
  • Data integrity verification (cmd/verify-load/) — verifies node/relationship counts (49,683 nodes, 100,000 relationships)

不足しているカバレッジ

  • No unit tests for individual functions (_test.go files do not exist)
  • No tests for statistical functions (percentile, mean, stddev calculation)
  • No tests for CSV parsing edge cases (empty datasets, malformed CSVs)
  • No tests for concurrent behavior
  • No tests for chart generation correctness
  • No test framework installed (no testify, gomock)

主な課題

  • 異なるデータモデル間で公平かつ同一な負荷条件を再現すること
  • 深層探索時におけるメモリ枯渇の防止

学んだこと

  • ネイティブグラフエンジンとRDBMSの長所短所の実測比較
  • 高負荷下におけるレイテンシパーセンタイルの測定手法