JK
>LADEN // LADEN
WEERGAVE INITIALISEREN
Benchmarksuite die latentie, geheugen en queryprestaties analyseert tussen graaf- en relationele databases.
Het kiezen van de juiste database voor complexe sociale netwerken en aanbevelingssystemen.
| Technologie | Versie | Doel | Waarom gekozen |
|---|---|---|---|
| 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 |
| Methode | Route | Doel |
|---|---|---|
| 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 |
| Kolom | Type | Notities |
|---|---|---|
| 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.
| Kolom | Type | Notities |
|---|---|---|
| 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.
Beslissing: Use neo4j-go-driver/v6 for CognoDB, Neo4j, and Memgraph
Waarom: All three support Bolt protocol; Cypher is logically equivalent
Voordelen: Code reuse, consistent behavior across databases, adapter pattern isolates DB-specific behavior
Afwegingen: Cannot test database-specific optimizations; Memgraph has its own Go driver
Beslissing: Single connection per benchmark run despite constant defining 10
Waarom: Measure single-connection latency; avoid connection pool effects
Voordelen: Clean latency measurement without pool contention
Afwegingen: Doesn't test connection pooling behavior
Beslissing: One JSON object per line, append-only output
Waarom: Stream results without loading all into memory; easy to append across runs
Voordelen: Resilient to crashes (partial results preserved)
Afwegingen: Requires full file scan for aggregation
Beslissing: Zero retries for benchmark queries to capture true latency
Waarom: Network blips and failures are part of real-world performance
Voordelen: Honest performance measurement including failure modes
Afwegingen: Network blips cause false negatives
Beslissing: Each concurrent client creates its own database connection
Waarom: Simulates real-world multi-client scenarios; avoids shared connection contention
Voordelen: Realistic concurrency testing with independent connections
Afwegingen: Higher resource usage; connection limits become the bottleneck
Beslissing: Use MERGE (upsert) instead of CREATE for node loading
Waarom: Makes loading idempotent — running multiple times doesn't create duplicates
Voordelen: Safe re-runs, consistent dataset state
Afwegingen: MERGE is slightly slower than CREATE due to existence checks