JK
>로딩 중 // 로딩 중
뷰 초기화 중
그래프 DB와 관계형 DB 간의 탐색 지연 시간, 메모리 사용량 및 쿼리 효율을 비교 분석한 성능 평가 도구.
다단계 소셜 그래프 및 추천 시스템에서 최적의 데이터 저장소를 선정하기 위한 데이터 기반 분석 필요.
| 기술 | 버전 | 목적 | 선택 이유 |
|---|---|---|---|
| Go | 1.25.1 | Primary language | Strong concurrency primitives, fast compilation, good driver ecosystem |
| neo4j-go-driver/v6 | v6.2.0 | Bolt protocol client for CognoDB, Neo4j, Memgraph | Official driver, supports Bolt 5.x, parameterized queries |
| go-echarts/v2 | v2.7.2 | HTML chart generation | Go-native, generates standalone HTML |
| godotenv | v1.5.1 | Environment configuration | Standard .env loading |
| net/http | stdlib | REST client for TigerGraph | No external dependency needed |
| 메서드 | 경로 | 목적 |
|---|---|---|
| Cypher | MATCH (n:Person {id: $id}) RETURN n.id AS id | Point lookup — single node by ID |
| Cypher | MATCH (n:Person {region: $val}) RETURN n.id AS id LIMIT 10 | Indexed lookup — nodes by region |
| Cypher | MATCH (n:Person {id: $id})-[:FRIEND]->(m:Person) RETURN collect(m.id) | 1-hop traversal — direct friends |
| Cypher | MATCH (n:Person {id: $id})-[:FRIEND]->()-[:FRIEND]->(m:Person) RETURN collect(DISTINCT m.id) | 2-hop traversal — friends of friends |
| Cypher | MATCH (n:Person {id: $id})-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->(m:Person) RETURN collect(DISTINCT m.id) | 3-hop traversal — extended network |
| Cypher | MATCH (n:Person) RETURN n.region AS region, count(n) AS cnt ORDER BY cnt DESC LIMIT 10 | Aggregation — region distribution |
| Cypher | CREATE (n:Person {id: $id, region: $region, ...}) | Write — create new node |
| 컬럼 | 유형 | 비고 |
|---|---|---|
| idPK | STRING | Unique constraint, indexed |
| region | STRING | Indexed |
| gender | STRING | Not indexed |
| age | STRING | Indexed (CognoDB, Neo4j, Memgraph only) |
| completion_percentage | STRING | Not indexed |
49,683 nodes extracted from SNAP soc-Pokec dataset. All properties are strings.
| 컬럼 | 유형 | 비고 |
|---|---|---|
| source_id | STRING | Person.id (from) |
| target_id | STRING | Person.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.
결정: 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
결정: 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
결정: 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
결정: 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
결정: 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
결정: 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