crm_edges, FKs) already exist and are trusted — so this is a
projection problem, not an extraction problem.
Virtual RDF knowledge graph over the live Postgres CRM via R2RML. Zero data movement, no freshness bug, invents nothing — every triple is an existing row/FK/edge.
Apache-2.0 · 873★ · commit 2026-06-19 · SPARQL
Temporal property graph over crm_notes/meetings text →
relationship suggestions. Inferred edges are un-provenanced →
operator review before any crm_edges write. Never auto-writes.
Apache-2.0 · 28.4k★ · bi-temporal · MCP server
| Tool | ★ | License | Commit | Model | Verdict |
|---|---|---|---|---|---|
| Ontop | 873 | Apache-2.0 | 2026-06-19 | Virtual SPARQL→SQL, live | WINNER — zero data move |
| Morph-KGC | 280 | Apache-2.0 | 2026-06-28 | Materialize (batch) | #2 — needs freshness |
| RMLMapper | 201 | MIT | 2026-02-17 | Materialize to file | no query surface |
| SDM-RDFizer | 137 | Apache-2.0 | 2026-05-18 | Billion-triple scale | overkill |
| D2RQ | 324 | unclear | archived 2021 | Virtual | dead (Ontop's ancestor) |
| Sparqlify / Squerall | 134/— | none / gone | dormant / 404 | — | disqualified |
| Tool | ★ | License | Release | CRM-fit | Verdict |
|---|---|---|---|---|---|
| Graphiti | 28.4k | Apache-2.0 | 2026-06-08 | Bi-temporal, custom Contact/Org/Deal types, dedup, MCP | WINNER |
| Cognee | 27k | Apache-2.0 | 2026-06-26 | Plausible; dedup NOT verified | #2 — verify first |
| Neo4j LLM Graph Builder | 4.9k | Apache-2.0 | 2026-06-11 | Docs only, no structured path | secondary |
| iText2KG · KG-Gen | 951 · 1.2k | Apache/MIT | dormant | Text-only research impls | reject |
Every tool infers a graph from unstructured text — the inverse of our problem. Feeding CRM rows = paying LLM cost to re-derive edges we already hold, with drift + rule-#20 collision.
| Tool | ★ | Status | Note |
|---|---|---|---|
| Mem0 | 60.1k | graph store REMOVED (OSS v3) | Hosted-only, untyped ranking signal. Disqualified. Correct any prior "Mem0 graph memory" claim. |
| LightRAG | 37.3k | only escape hatch #1 | insert_custom_kg() writes pre-built edges direct. Pick if crm_notes RAG ever wanted. |
| R2R | 7.9k | ~8mo dormant | Postgres-native + REST CRUD + MCP — closest architecture, stalled momentum. Health-check first. |
| MS GraphRAG · nano · HippoRAG · fast-graphrag | 34k…3.8k | doc-first / research-grade | Graph = RAG byproduct, not addressable. Not it. |
| Engine | ★ | License | Deploy | Note |
|---|---|---|---|---|
| TerminusDB | 3.3k | Apache-2.0 (cleanest) | 1 Docker | Versioned document-graph = free audit trail (dovetails rule #20). WOQL niche. |
| Neo4j | 16.8k | GPL-3.0 (CE) | server (JVM) | Most mature, standard Cypher, heaviest ops. |
| Memgraph | 4.2k | BSL 1.1 + MEL | server | Source-available, not OSI until change-date. |
| FalkorDB | 4.7k | SSPL | server | Non-OSI; SDK layer doc-shaped, no Postgres ingest. |
| Kùzu | 4.0k | MIT | ARCHIVED 2026 | Embedded option is dead. Do not adopt. |
No turnkey "customer-360 / CRM knowledge graph" OSS build exists — confirmed by direct search + full audit of Neo4j's own example orgs. Don't wait for one; adopt at the tool altitude. (Note: Layer-1 Ontop needs no separate store — it is virtual over Postgres.)
1. Ontop (Docker) → read-only role on CRM Postgres.
2. R2RML maps: one per table; FKs + crm_edges → triples; crm_edge_types → predicates.
3. Internal SPARQL endpoint (read-only; no public mutating surface).
4. Validate a traversal query against real rows.
1. Who consumes the graph? (human/agent/analytics) → decides SPARQL vs property-graph.
2. Is read-only projection enough, or is the real ask relationship intelligence (→ Layer 2)?
3. Layer-2 write-gate workflow = metis-domain design.
4. Cognee dedup deep-read — only if Graphiti rejected.
research/oss-kg-for-crm-2026-07-05/ ·
Prior art (not re-surveyed): oss-crm-landscape (#49) · aion-graphify-adoption (#7).
Load-bearing rows all [live-verified]/[deep-read] except Cognee-dedup (flagged; does not gate headline).