Migration guide
Migrating from Graphiti to Cognee
Graphiti is the open-source temporal graph engine behind Zep. If you run it yourself on Neo4j or FalkorDB, Cognee's GraphitiSource adapter imports its nodes, edges, and episodes, and you can keep the graph you already built.
Based on public information as of September 2026. See each vendor's site for current details.
Graphiti's bi-temporal edges (when a fact was true, when it was recorded) are more precise than Cognee's temporal model, and if time-aware reasoning over conversations is your core problem, Graphiti is the sharper tool. Cognee also integrates with Graphiti rather than only replacing it. Migrate when you need memory built from documents, databases, and code as well as conversations, want retrieval modes beyond graph search, or want a memory layer with an MCP server, feedback loop, and multi-tenant isolation out of the box.
Disclosure: Cognee is our product. Claims about Graphiti are based on its public documentation as of September 2026.
Why teams migrate from Graphiti
Graphiti gives you the graph; you build ingestion, retrieval, permissions, and serving around it. Cognee ships the ECL pipeline for 30+ source types, hybrid graph-plus-vector retrieval with multiple search modes, an MCP server, and a feedback loop that re-weights the graph from rated answers.
Graphiti requires Neo4j or FalkorDB. Cognee runs embedded on Ladybug by default and can put the graph, vectors, and metadata in a single PostgreSQL instance, so a graph database becomes optional rather than required.
Cognee's datasets, permissions, and backend access control let many agents read and write one knowledge graph with per-user or per-tenant isolation, which Graphiti leaves to you.
Migration steps
Query your Graphiti store for entity nodes, entity edges (facts), and episodic nodes, and write them out as a dict with nodes, edges, and episodes keys. The adapter reads the same shape as Zep's graph export, so a straightforward Cypher dump is enough.
Python import jsonfrom neo4j import GraphDatabasedriver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "..."))def rows(query):with driver.session() as s:return [r.data() for r in s.run(query)]export = {"nodes": rows("MATCH (n:Entity) RETURN n.uuid AS uuid, n.name AS name, n.summary AS summary, labels(n) AS labels"),"edges": rows("MATCH (a:Entity)-[r:RELATES_TO]->(b:Entity) RETURN r.uuid AS uuid, a.uuid AS source_node_uuid, b.uuid AS target_node_uuid, r.name AS name, r.fact AS fact, r.valid_at AS valid_at, r.invalid_at AS invalid_at"),"episodes": rows("MATCH (e:Episodic) RETURN e.uuid AS uuid, e.content AS content, e.source AS source, e.created_at AS created_at"),}with open("graphiti_dump.json", "w") as f:json.dump(export, f, default=str)pip install cognee and set LLM_API_KEY. The embedded defaults (SQLite, LanceDB, Ladybug) are enough for the import; point Cognee at your existing Neo4j with the neo4j extra if you want to keep using it.
Shell pip install cognee # or: pip install "cognee[neo4j]"export LLM_API_KEY="..."preserve maps Graphiti's entities and facts directly into Cognee's graph with no LLM calls. hybrid also runs Cognee's extraction over the episodes, adding summaries, chunks, and a vector index so every retrieval mode works.
Python import asyncioimport cogneefrom cognee.migration import GraphitiSourceasync def main():await cognee.remember(GraphitiSource("graphiti_dump.json", mode="hybrid"),dataset_name="agent_memory",)asyncio.run(main())Run the temporal and relational questions your agents depend on and compare them with Graphiti's answers. CYPHER search lets you inspect the imported graph directly if Cognee is backed by Neo4j.
Python from cognee import SearchTypeawait cognee.search("Which vendor did the team switch to, and when?",query_type=SearchType.TEMPORAL,datasets=["agent_memory"],)Replace Graphiti add_episode and search calls with cognee.remember and cognee.recall, or connect through the Cognee MCP server or the TypeScript client. Keep Graphiti running in parallel until the answers match.
Graphiti has already done entity and fact extraction, so preserve mode is a lossless, zero-LLM copy and the right first run. hybrid (recommended for the final import) keeps that graph and adds Cognee's chunks, summaries, and vector index over the episodes. re-derive ignores Graphiti's graph entirely and rebuilds from the episode text.
The import adapters live in cognee.migration and are documented at docs.cognee.ai. If your export does not match the shape the adapter expects, open an issue on GitHub with a redacted sample.
Frequently asked questions
Do I have to stop using Graphiti?
No. Cognee has a Graphiti integration (cognee[graphiti]) for teams that want Graphiti's temporal graph inside a Cognee pipeline. This guide is for teams that want to consolidate on one memory layer.
Are valid_at and invalid_at preserved?
They are imported as fact metadata and used by TEMPORAL search. Cognee's temporal reasoning is not identical to Graphiti's bi-temporal model, so verify time-scoped answers during the parallel run.
My dump has a different shape. What then?
The adapter looks for nodes, edges, and episodes lists and tolerates extra fields. If your export is structured differently, open an issue on GitHub with a redacted sample and we will extend the adapter.
Can I export from Cognee later?
Yes. cognee.export writes a dataset to the open COGX archive format or GraphML.