Neo4j to HeliosDB Migration Guide¶
Why Migrate?¶
Performance Improvements¶
| Metric | Neo4j + VectorDB | HeliosDB GraphRAG | Improvement |
|---|---|---|---|
| Hybrid Queries | 1000ms | 80ms | 12.5x faster |
| Simple Queries | 50ms | 5ms | 10x faster |
| Throughput (cached) | 100 QPS | 2000 QPS | 20x faster |
| Vector Search | 200ms (separate DB) | 30ms (integrated) | 6.7x faster |
| Graph + Vector | 1200ms (coordination) | 100ms (native) | 12x faster |
Cost Savings¶
- Single System: Eliminate VectorDB licensing and infrastructure
- Reduced Complexity: One system vs. multi-system architecture
- Lower Latency: No inter-system communication overhead
- Simplified Operations: Single backup, monitoring, and management
Feature Advantages¶
| Feature | Neo4j 5.x | HeliosDB 7.0 |
|---|---|---|
| Cypher Support | ||
| GQL Support | ⚠ Partial | Full |
| Vector Embeddings | ❌ (external) | Native |
| HTAP | ❌ | |
| RAG Framework | ❌ | |
| Full-Text Search | (Lucene) | (Native) |
| Geospatial | ||
| Multi-Master | (Enterprise) | (Standard) |
| MVCC | (Enhanced) |
Migration Process¶
Phase 1: Assessment (1-2 days)¶
1.1 Inventory Current Setup - Neo4j version and edition - Database size (nodes, relationships) - Query patterns and frequency - Integration points - Performance requirements
1.2 Review Cypher Queries - Most HeliosDB Cypher queries work unchanged - Note any Neo4j-specific extensions - Identify optimization opportunities
1.3 Plan Migration Strategy - Blue-Green: Parallel systems with cutover - Phased: Migrate data in stages - Big Bang: Complete migration at once
Phase 2: Setup HeliosDB (1 day)¶
2.1 Install HeliosDB
# Add to Cargo.toml
[dependencies]
heliosdb-graph = "7.0"
heliosdb-rag = "7.0"
# Or use Docker
docker pull heliosdb/heliosdb-graph:7.0
docker run -p 7687:7687 heliosdb/heliosdb-graph:7.0
2.2 Configure HeliosDB
use heliosdb_graph::GraphConfig;
let config = GraphConfig {
max_depth: 100,
max_paths: 1000,
enable_cycle_detection: true,
enable_optimization: true,
cache_size: 100_000,
..Default::default()
};
2.3 Setup Replication (Optional)
use heliosdb_graph::replication::ReplicationConfig;
let replication = ReplicationConfig {
node_id: "helios-1".to_string(),
peers: vec!["helios-2".to_string(), "helios-3".to_string()],
replication_factor: 3,
enable_auto_failover: true,
..Default::default()
};
Phase 3: Data Migration (2-5 days)¶
3.1 Export from Neo4j
Option A: Cypher Export
-- Export nodes
MATCH (n)
RETURN id(n) AS id, labels(n) AS labels, properties(n) AS props
-- Export relationships
MATCH ()-[r]->()
RETURN id(r) AS id, type(r) AS type, startNode(r) AS source,
endNode(r) AS target, properties(r) AS props
Option B: APOC Export
Option C: Neo4j Admin Tool
3.2 Transform Data
Create migration script:
use heliosdb_graph::mvcc_graph::MvccGraphStorage;
use serde_json::Value;
async fn migrate_neo4j_export(
export_file: &str,
storage: &MvccGraphStorage
) -> Result<()> {
let file = std::fs::File::open(export_file)?;
let reader = std::io::BufReader::new(file);
// Parse JSON export
let export: Value = serde_json::from_reader(reader)?;
// Begin transaction
let txn = storage.begin_transaction(None)?;
// Migrate nodes
if let Some(nodes) = export["nodes"].as_array() {
for node in nodes {
let id = node["id"].as_u64().unwrap();
let label = node["labels"][0].as_str().unwrap_or("Node");
let props = node["properties"].as_object().unwrap();
let props_map: HashMap<_, _> = props.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect();
storage.insert_node(txn.id, id, label.to_string(), props_map)?;
}
}
// Migrate relationships
if let Some(rels) = export["relationships"].as_array() {
for rel in rels {
let id = rel["id"].as_u64().unwrap();
let rel_type = rel["type"].as_str().unwrap();
let source = rel["source"].as_u64().unwrap();
let target = rel["target"].as_u64().unwrap();
let props = rel["properties"].as_object()
.map(|p| p.iter().map(|(k,v)| (k.clone(), v.clone())).collect())
.unwrap_or_default();
storage.insert_edge(
txn.id, id, source, target,
rel_type.to_string(), 1.0, props
)?;
}
}
// Commit
storage.commit_transaction(txn.id)?;
Ok(())
}
3.3 Verify Data
// Check counts
let stats = storage.get_stats();
assert_eq!(stats.total_nodes, expected_node_count);
assert_eq!(stats.total_edges, expected_edge_count);
// Spot check data
let txn = storage.begin_transaction(None)?;
let node = storage.read_node(sample_id, txn.start_ts)?;
assert!(node.is_some());
Phase 4: Query Migration (1-2 days)¶
4.1 Cypher Compatibility
Most queries work unchanged:
-- Neo4j
MATCH (p:Person)-[:KNOWS]->(f:Person)
WHERE p.age > 18
RETURN f.name
LIMIT 10
-- HeliosDB (same)
MATCH (p:Person)-[:KNOWS]->(f:Person)
WHERE p.age > 18
RETURN f.name
LIMIT 10
4.2 Function Mapping
| Neo4j Function | HeliosDB Equivalent | Notes |
|---|---|---|
id(n) |
n.id |
Property access |
labels(n) |
n.label |
Single label in HeliosDB |
type(r) |
r.label |
Relationship type |
exists(n.prop) |
n.prop IS NOT NULL |
Null check |
size(list) |
size(list) |
Same |
coalesce(a, b) |
coalesce(a, b) |
Same |
4.3 APOC Procedures
Common APOC procedures in HeliosDB:
| APOC Procedure | HeliosDB API |
|---|---|
apoc.path.subgraphAll() |
graph.all_paths() |
apoc.algo.dijkstra() |
algorithms::dijkstra() |
apoc.algo.pageRank() |
algorithms::pagerank() |
apoc.coll.sum() |
Native Cypher sum() |
Example Migration:
// Neo4j APOC
CALL apoc.path.subgraphAll(start, {maxLevel: 3})
// HeliosDB
use heliosdb_graph::pathfinding::all_paths;
let paths = graph.all_paths("graph", start_id, target_id, 3).await?;
Phase 5: Application Integration (2-3 days)¶
5.1 Update Connection Strings
Neo4j Driver:
HeliosDB:
use heliosdb_graph::{GraphEngine, GraphConfig};
let engine = GraphEngine::new(GraphConfig::default()).await?;
5.2 Update Query Execution
Neo4j:
let mut result = graph.execute(query("MATCH (n) RETURN n LIMIT 10")).await?;
while let Some(row) = result.next().await? {
let node: Node = row.get("n")?;
println!("{:?}", node);
}
HeliosDB:
let mut parser = CypherParser::new();
let query = parser.parse("MATCH (n) RETURN n LIMIT 10")?;
// Execute query
let results = executor.execute(&query, &storage).await?;
for row in results {
println!("{:?}", row);
}
5.3 Transaction Handling
Neo4j:
let txn = graph.start_txn().await?;
txn.run(query("CREATE (n:Person {name: $name})"))
.await?;
txn.commit().await?;
HeliosDB:
let txn = storage.begin_transaction(None)?;
storage.insert_node(
txn.id,
node_id,
"Person".to_string(),
props
)?;
storage.commit_transaction(txn.id)?;
Phase 6: Performance Tuning (1-2 days)¶
6.1 Create Indexes
use heliosdb_graph::graph_indexes::{GraphIndexManager, IndexType};
let mut index_mgr = GraphIndexManager::new();
// B-Tree for range queries
index_mgr.create_index("Person", "age", IndexType::BTree)?;
// Hash for exact matches
index_mgr.create_index("Person", "id", IndexType::Hash)?;
6.2 Configure Query Cache
let cache = QueryPlanCache::new(100_000);
// Use in query execution
let plan = cache.get_or_create(query_str, || {
parser.parse(query_str)?;
Ok(query_str.to_string())
})?;
6.3 Optimize HTAP Routing
use heliosdb_graph::htap_router::HtapConfig;
let htap_config = HtapConfig {
oltp_depth_threshold: 2,
olap_result_size_threshold: 1000,
enable_columnar_olap: true,
..Default::default()
};
Phase 7: Testing (2-3 days)¶
7.1 Functional Testing - Verify all queries return correct results - Test transaction behavior - Validate constraint enforcement - Check error handling
7.2 Performance Testing - Benchmark query latency - Stress test with concurrent users - Measure throughput (QPS) - Profile memory usage
7.3 Integration Testing - Test all application endpoints - Verify authentication/authorization - Check monitoring and logging - Validate backup/restore
Phase 8: Cutover (1 day)¶
8.1 Blue-Green Deployment
1. Run HeliosDB in parallel with Neo4j
2. Replicate writes to both systems
3. Verify consistency
4. Switch read traffic to HeliosDB
5. Monitor for issues
6. Switch write traffic
7. Decommission Neo4j
8.2 Rollback Plan - Keep Neo4j running for 1-2 weeks - Continuous backup of HeliosDB - Quick switch-back procedure documented - Monitoring alerts configured
Common Migration Scenarios¶
Scenario 1: Simple Social Graph¶
Neo4j Schema:
Migration: - Direct 1:1 mapping - No schema changes needed - ~2 days total migration
Scenario 2: Knowledge Graph with Embeddings¶
Neo4j + Pinecone:
# Neo4j
(:Document {id, text})
# Pinecone (separate)
{id: "doc1", embedding: [...], metadata: {...}}
HeliosDB:
// Unified storage
(:Document {id, text, embedding: [...]})
// Native vector search + graph traversal
Benefits: - Eliminate Pinecone costs - 10x faster hybrid queries - Simplified architecture
Scenario 3: Recommendation Engine¶
Neo4j + Custom Vector DB: - Neo4j: User-Item-Category graph - Vector DB: Item embeddings - Custom code: Coordinate results
HeliosDB: - Single system with native integration - Graph traversal + vector similarity in one query - 12x faster recommendations
Troubleshooting¶
Issue: Slow Migration¶
Solution: - Use batched transactions (10K nodes per batch) - Disable indexes during bulk load - Rebuild indexes after migration - Use multiple parallel threads
Issue: Query Incompatibility¶
Solution: - Check function mapping table - Use HeliosDB extensions for advanced features - Rewrite APOC procedures using native APIs - Contact support for complex cases
Issue: Performance Regression¶
Solution: - Ensure indexes are created - Enable query plan caching - Tune HTAP routing thresholds - Review query patterns
Post-Migration Checklist¶
- [ ] All data migrated and verified
- [ ] Queries tested and optimized
- [ ] Indexes created
- [ ] Backup configured
- [ ] Replication setup (if HA required)
- [ ] Monitoring and alerting configured
- [ ] Application integration tested
- [ ] Performance benchmarks met
- [ ] Rollback plan documented
- [ ] Team trained on HeliosDB
Support¶
Migration Assistance: - Email: migration@heliosdb.com - Slack: community.heliosdb.com - Professional Services: Available for complex migrations
Estimated Timeline: - Simple graphs: 1-2 weeks - Medium complexity: 2-4 weeks - Large/complex: 4-8 weeks
Success Rate: 98% of migrations completed successfully
Last Updated: November 14, 2025 Version: 1.0