Migration

Already on Neo4j? You're already on CognoDB.

Same Bolt protocol. Same Cypher. No SDK to swap, no data model to redesign. In most projects, migration is a connection-string change and a one-time data import.

The minimum viable migration

One diff in driver config. One data export. One restore. You're done.

diff · point the driver
- driver = GraphDatabase.driver("bolt://neo4j-host:7687", auth=("neo4j", "secret"))
+ driver = GraphDatabase.driver("bolt://cognodb-host:7687", auth=("neo4j", "secret"))
bash · move the data
# 1) Export from Neo4j (neo4j-admin or APOC CSV)
neo4j-admin database dump neo4j --to-path=./out

# 2) Convert and load into CognoDB
neo2cognodb --in ./out --out ./backup/
cognodb-restore --in ./backup/ --storage local --data-dir ./mem

A safe four-step path

  1. 01
    Point your driver at CognoDB

    Change the host in your connection string. That's it. Same Bolt protocol, same auth handshake, same Cypher dialect.

  2. 02
    Move the data

    Export from Neo4j with neo4j-admin or APOC, then import with the neo2cognodb helper. Nodes, relationships, properties, labels — all preserved.

  3. 03
    Run side-by-side

    Mirror writes to both for a soak period. Compare query results. Cut traffic over workload by workload.

  4. 04
    Keep Neo4j for what it's good at

    If a query needs Neo4j's analytical engine over a billion-edge graph, point that query back. No rewrite either way — same Cypher.

Why teams migrate

The pain isn't Cypher. It's everything underneath: cold starts, JVM tuning, clustering, and the fact that you can't realistically run one Neo4j per agent.

Pain on Neo4jWhat changes on CognoDB
17-second cold starts7 ms cold start. Spin up a graph per agent, per task, per request.
~3.5 GB JVM footprint~15 MB resident. Run hundreds of isolated graphs on one box.
Heavyweight clusteringOne static binary plus a --sharded flag. Scale out horizontally for free.
Can't run at the edgeCopy one file to a Raspberry Pi or a Cloudflare worker container.
Write throughput throttles under load7× higher sustained write throughput in the same harness.
JVM tuning, GC pauses, heap dumpsNone of it. Go runtime, predictable latency.
Per-tenant isolation is prohibitiveOne process per tenant is cheap. True isolation, no noisy neighbors.
Run both side-by-side. Move workload by workload. If a query needs Neo4j's analytical engine, point it back. No rewrite either way.