Hermes · Decision-Grade Survey · 2026-07-05

OSS Knowledge-Graphs for a CRM

Adopt-path lens over the Pantheon crm_* spine · T-deep · every candidate live-verified via gh api
4 lanes · 30+ reposstars/license/last-commit verified source-coverage ledgerresearch-orchestrate (no banned Workflow)
The frame that decides everything
"Build a KG for a CRM" has two answers on opposite sides of our write-integrity gate (rule #20). Our edges (crm_edges, FKs) already exist and are trusted — so this is a projection problem, not an extraction problem.
→ Recommendation is a two-layer adopt path, not a single tool.
FAMILY 1 · WRITE-INTEGRITY-SAFE · ADOPT NOW

Layer 1 — Ontop

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

FAMILY 2 · GATED · PHASE 2

Layer 2 — Graphiti

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

crm_* Postgres (SSOT, unchanged) contacts · organizations · deals · notes · documents · crm_edges · meetings │ │ │ Family 1 (deterministic, safe) │ Family 2 (LLM-inferred, gated) ▼ ▼ ┌──────────────────────────┐ ┌──────────────────────────────┐ │ LAYER 1 · ONTOP │ │ LAYER 2 · GRAPHITI │ │ virtual RDF KG (R2RML) │ │ derived temporal graph │ │ zero data move │ │ → edge SUGGESTIONS │ │ SPARQL · invents nothing │ │ → operator review (P0) │ │ ✓ rule #20 │ │ → then write crm_edges │ └──────────────────────────┘ └──────────────────────────────┘

Lane A — Relational → KG mappers (Family 1, sharpest match)

ToolLicenseCommitModelVerdict
Ontop873Apache-2.02026-06-19Virtual SPARQL→SQL, liveWINNER — zero data move
Morph-KGC280Apache-2.02026-06-28Materialize (batch)#2 — needs freshness
RMLMapper201MIT2026-02-17Materialize to fileno query surface
SDM-RDFizer137Apache-2.02026-05-18Billion-triple scaleoverkill
D2RQ324uncleararchived 2021Virtualdead (Ontop's ancestor)
Sparqlify / Squerall134/—none / gonedormant / 404disqualified

Lane B — LLM KG builders (Family 2, suggestion layer)

ToolLicenseReleaseCRM-fitVerdict
Graphiti28.4kApache-2.02026-06-08Bi-temporal, custom Contact/Org/Deal types, dedup, MCPWINNER
Cognee27kApache-2.02026-06-26Plausible; dedup NOT verified#2 — verify first
Neo4j LLM Graph Builder4.9kApache-2.02026-06-11Docs only, no structured pathsecondary
iText2KG · KG-Gen951 · 1.2kApache/MITdormantText-only research implsreject

Lane C — GraphRAG frameworks (RULED OUT — wrong shape)

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.

ToolStatusNote
Mem060.1kgraph store REMOVED (OSS v3)Hosted-only, untyped ranking signal. Disqualified. Correct any prior "Mem0 graph memory" claim.
LightRAG37.3konly escape hatch #1insert_custom_kg() writes pre-built edges direct. Pick if crm_notes RAG ever wanted.
R2R7.9k~8mo dormantPostgres-native + REST CRUD + MCP — closest architecture, stalled momentum. Health-check first.
MS GraphRAG · nano · HippoRAG · fast-graphrag34k…3.8kdoc-first / research-gradeGraph = RAG byproduct, not addressable. Not it.

Lane D — Substrate + Customer-360

EngineLicenseDeployNote
TerminusDB3.3kApache-2.0 (cleanest)1 DockerVersioned document-graph = free audit trail (dovetails rule #20). WOQL niche.
Neo4j16.8kGPL-3.0 (CE)server (JVM)Most mature, standard Cypher, heaviest ops.
Memgraph4.2kBSL 1.1 + MELserverSource-available, not OSI until change-date.
FalkorDB4.7kSSPLserverNon-OSI; SDK layer doc-shaped, no Postgres ingest.
Kùzu4.0kMITARCHIVED 2026Embedded 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.)

Adopt path & open questions

Adopt now (~1–2 days)

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.

Route to metis / operator

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.

Full report + verified lane sections + source-coverage ledger: 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).