JK
>CARGANDO // CARGANDO
INICIALIZANDO VISTA
Suite de pruebas que analiza latencia, consumo de memoria y rendimiento en consultas relacionales y de grafos.
Determinar la arquitectura de base de datos óptima para consultas con múltiples niveles de anidamiento en redes y recomendaciones.
| Tecnología | Versión | Propósito | Por qué se eligió |
|---|---|---|---|
| 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 |
| Método | Ruta | Propósito |
|---|---|---|
| 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 |
| Columna | Tipo | Notas |
|---|---|---|
| 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.
| Columna | Tipo | Notas |
|---|---|---|
| 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.
Decisión: Use neo4j-go-driver/v6 for CognoDB, Neo4j, and Memgraph
Motivo: All three support Bolt protocol; Cypher is logically equivalent
Beneficios: Code reuse, consistent behavior across databases, adapter pattern isolates DB-specific behavior
Compensaciones: Cannot test database-specific optimizations; Memgraph has its own Go driver
Decisión: Single connection per benchmark run despite constant defining 10
Motivo: Measure single-connection latency; avoid connection pool effects
Beneficios: Clean latency measurement without pool contention
Compensaciones: Doesn't test connection pooling behavior
Decisión: One JSON object per line, append-only output
Motivo: Stream results without loading all into memory; easy to append across runs
Beneficios: Resilient to crashes (partial results preserved)
Compensaciones: Requires full file scan for aggregation
Decisión: Zero retries for benchmark queries to capture true latency
Motivo: Network blips and failures are part of real-world performance
Beneficios: Honest performance measurement including failure modes
Compensaciones: Network blips cause false negatives
Decisión: Each concurrent client creates its own database connection
Motivo: Simulates real-world multi-client scenarios; avoids shared connection contention
Beneficios: Realistic concurrency testing with independent connections
Compensaciones: Higher resource usage; connection limits become the bottleneck
Decisión: Use MERGE (upsert) instead of CREATE for node loading
Motivo: Makes loading idempotent — running multiple times doesn't create duplicates
Beneficios: Safe re-runs, consistent dataset state
Compensaciones: MERGE is slightly slower than CREATE due to existence checks