Skip to content

Comparative Analysis

How does Purple8 Hyper Graph compare to every category of database and AI framework it replaces? This page is an honest, technically grounded comparison — including benchmarks, architecture trade-offs, and a frank admission of where Purple8 is not yet the best choice.

Version note

This analysis reflects Purple8 Hyper Graph v0.56.0 (June 2026) and the latest publicly available versions of all competitors at time of writing. Benchmark hardware: Apple M-series (macOS dev baseline) for Suites C–J; single m6i.2xlarge (8 vCPU, 32 GB RAM, NVMe SSD) for hybrid search tables unless noted.


What Category Is Purple8 In?

Google Gemini categorises Purple8 as a multi-model database — and that is the most accurate label available. Purple8 is not a graph database with a vector bolt-on, nor a vector store with graph annotations. It is a single embedded engine in which four data models are first-class citizens, stored in one BrickCoreStorage (Cortex) instance, queried in one Cypher statement, encrypted by one KMS envelope, and made durable by one WAL:

Data modelHow it works in Purple8
Property graphNodes + edges + typed labels, Cypher traversal
Vector storeDual HNSW + DiskANN, in-process, fed directly into Cypher CALL db.vector.search
Document storeSchemaless properties: dict[str, Any] on every node — arbitrary JSON depth, arrays, nested objects
Full-text / BM25Native BM25 with stopword filtering, hybrid text_vector_search()

Every alternative forces you to pick one model as primary and bolt the others on. Purple8 treats them as equals.


Executive Summary

Purple8 Hyper Graph occupies a category no competitor currently owns: the Hyper Graph DB — a single embedded engine that unifies graph traversal, HNSW vector search, document storage, and BM25 full-text search with AES-256-GCM encryption at rest and a multi-tenant REST API.

Every alternative in the market today makes at least one of these trade-offs Purple8 avoids:

Trade-offWho makes it
Graph + bolt-on vector → two query phases, JVM overhead, Docker requiredNeo4j + Vector Plugin
In-memory first → no durable disk-backed storageFalkorDB, Memgraph
Vector only → zero multi-hop reasoning, zero disambiguationWeaviate, Pinecone, Qdrant, LanceDB
AI workflow orchestration → external state store (Redis/Postgres), no audit trail, DIY SLALangChain, LangGraph, CrewAI, AutoGen, Apache Airflow
AI memory → separate memory service, separate DB, no graph traversal over historyMem0, Zep, MemGPT/Letta
Document store → separate service + sync layer + dual write riskMongoDB Atlas, DynamoDB, Postgres JSONB

The headline benchmarks make the competitive gap concrete:

  • MS MARCO MRR@10 at 100k passages: Purple8 0.7511 vs BM25 baseline 0.6025 (+24.7%), at 3.53 ms p50 — 182× faster than BM25
  • Entity disambiguation accuracy: Purple8 1.000 vs every vector-only system 0.000, vs every hybrid dual-stack system ≤ 0.500
  • GraphRAG mean accuracy: Purple8 91.7% vs Neo4j+Vector / Kùzu / FalkorDB all at 79.2%
  • Operational footprint: 1 service, 1 pip install vs 2+ services + Docker + ETL pipelines
  • Journey Engine: built-in AI workflow orchestration with graph-native state, SLA enforcement, and immutable audit trails — LangGraph + Airflow compressed into a single module with no external state store required
  • Graph as Memory: every AI decision, human override, stage transition, and outcome is written as an immutable graph edge — queryable in Cypher, vector-searchable in-process, and feedable back as context with no separate memory service (no Mem0, Zep, or MemGPT required)
  • Unified Document Store: schemaless dict[str, Any] properties on every node — MongoDB, DynamoDB, and Postgres JSONB are not required; no separate service, no sync layer, no dual-write risk

No direct competitor exists at this intersection. The closest alternatives require combining two separate databases and building a synchronisation layer between them — which Purple8 eliminates entirely.


1. Market Landscape

1.1 Category Map

The database market for AI applications splits cleanly into four capability quadrants. Purple8 is the only product in Q1:

High Graph Capability

   Q2   │   Q1  ← Purple8 ONLY

────────┼──────── High Vector Capability

   Q3   │   Q4

Low Graph Capability
QuadrantProductsLimitations
Q1 — High Graph + High VectorPurple8 (only)
Q2 — High Graph + Low/No VectorNeo4j (native), Memgraph, Amazon Neptune, Azure Cosmos GremlinNo native HNSW; bolt-on plugins required
Q3 — Low Graph + Low VectorRelational DBs, Elasticsearch (legacy)Neither capability natively
Q4 — Low/No Graph + High VectorWeaviate, Pinecone, Qdrant, LanceDBZero multi-hop reasoning, zero temporal chains

1.2 Competitor Roster

CompetitorTypeDeploymentOpen SourceClosest to Purple8
Neo4j + Vector PluginGraph + bolt-on vectorSelf-hosted / Managed AuraDBCommunity Ed. onlyHighest overlap, largest gap
KùzuEmbedded graphSelf-hostedC++ wiring required
FalkorDBIn-memory graph+vectorSelf-hosted / CloudDurability gap
WeaviateVector-firstManaged / Self-hostedNo graph at all
PineconeManaged vectorSaaS onlyNo graph, no offline
QdrantEmbedded/managed vectorManaged / Self-hosted / HybridNo graph traversal
LanceDBEmbedded vector (Lance format)Self-hostedNo graph layer
MemgraphIn-memory graphSelf-hosted / CloudCommunity Ed.No native HNSW
Amazon NeptuneManaged graphAWS onlyCloud-only, no vector
Azure Cosmos DB (Gremlin)Managed graphAzure onlyPer-RU billing, no vector
Spanner GraphManaged distributed graphGCP onlySchema-first, no vector

2. Core Feature Matrix

FeaturePurple8Neo4jKùzuFalkorDBWeaviatePineconeQdrantMemgraph
Graph traversal (Cypher)
Native HNSW vector search⚠️ plugin⚠️ manual
DiskANN (disk-based ANN)
Vector + graph in one query❌ two-phase
Document store (schemaless)⚠️⚠️⚠️⚠️⚠️
BM25 full-text search✅ EE
AES-256-GCM encryption at rest⚠️ EE only⚠️ cloud⚠️ cloud⚠️ cloud
5 KMS providers
Multi-tenant REST API (built-in)✅ cloud✅ cloud✅ cloud
WAL durability (BrickCore)✅ cloud✅ cloud✅ cloud
Read replicas (snapshot-based)✅ EE✅ cloud✅ cloud✅ cloud✅ EE
Built-in RAG pipeline❌ DIY
LLM registry (39 models, 9 providers)
Embedding registry (21 models)
NL-to-Cypher⚠️ plugin
Journey Engine (AI orchestration)
SLA enforcement (built-in)
Immutable audit trail (graph edges)
Graph as Memory (AI decision history)
Human override history (queryable)
Outcome edges + learning loop
DocIntel (56+ formats)
AEC domain modules (12)
MCP server (native)
SuperGraph federation✅ enterprise
SOC anomaly detection & containment✅ enterprise
Turbo Mode (circuit breaker)
Rust performance core
pip install — no Docker/JVM⚠️ C++N/A SaaS
Self-hosted / air-gapped
int8/binary quantization⚠️

✅ = fully supported | ⚠️ = partial / plugin / external | ❌ = not supported


3. Performance

Hybrid search (vector + graph, 100K nodes)

EngineQPSP50P99Notes
Purple8 Hyper Graph (HNSW)1,8472.1 ms8.7 msSingle in-process query: vector + BFS
Purple8 Hyper Graph (DiskANN)1,2033.1 ms11.2 msOn-disk index, low memory footprint
Neo4j + vector index8924.8 ms19.3 msTwo-phase query (vector → Bolt → merge)
Kùzu + manual HNSW7415.9 ms24.1 msSeparate vector call + Cypher join
FalkorDB6347.2 ms31.5 msGraph-only (no unified vector query)

Pure graph traversal (100K nodes, 3-hop MATCH)

EngineQPSP50P99
Purple8 Hyper Graph4,1201.8 ms5.9 ms
Kùzu3,8901.9 ms6.4 ms
Neo4j 5.x3,2102.4 ms9.1 ms

Search quality (MS MARCO MRR@10 — real sentence embeddings)

ScalePurple8 MRR@10BM25 MRR@10Vector-onlyPurple8 p50BM25 p50Speedup
2,5000.96580.8233~0.880.93 ms
25,0000.88100.7117~0.791.99 ms
100,0000.75110.6025~0.683.53 ms645 ms182×

HotpotQA multi-hop reasoning

ScalePurple8 MRR@10SF-F1Purple8 p50BM25 p50Speedup
2,5000.84310.61130.96 ms
25,0000.68920.51862.17 ms277 ms128×
100,0000.64890.50433.85 ms755 ms196×

SF-F1 (Supporting-Fact F1) measures whether Purple8 retrieves the correct reasoning paths — not just any relevant document. Purple8 SF-F1 ≥ 0.50 at all scales confirms the graph expansion is finding genuinely relevant reasoning chains.

GraphRAG task accuracy (Suite A v2, 2,500 docs)

TaskPurple8Combined (Weaviate+Neo4j)Neo4j-onlyWeaviate-only
Multi-hop reasoning0.5000.5000.5000.500
Entity disambiguation1.0000.5000.5000.000
Knowledge synthesis (score/20)7.527.727.710.3
Temporal chain1.0001.0001.0000.000
GraphRAG mean accuracy🥇 91.7%79.2%79.2%~50%

⚠️ Honest caveat on knowledge synthesis: Neo4j + combined strategies score higher on Task 3 because they fan out across all graph nodes (breadth-first, no selectivity filter). Purple8 uses targeted hybrid queries. Fan-out wins on recall but at multi-second latency — the trade-off is Purple8 <1 ms vs Neo4j multi-second scans at 100k+ docs.

Write throughput & durability (Suite C, 100k nodes)

SystemLive ingestDurability
Purple8603 add_node/s · 19,024 edges/s · 37k docs/min batch✅ WAL, hot restart 4.6 ms
Neo4j (online API)~500–2,000 CREATE/s✅ WAL (JVM)
Neo4j bulk import~50k–200k nodes/min⚠️ Offline — DB must stop
FalkorDBVery high❌ No WAL guarantee
Weaviate batch~10k–50k objects/min✅ (objects only, no edges)

Document store query (Suite D, 100k nodes)

QueryPurple8MongoDB AtlasPostgreSQL JSONB
Point lookup0.073 ms p501–5 ms0.5–2 ms
Nested property access (3-level)0.004 ms p50~0.5–2 ms~1–5 ms
Concurrent R/W peak251k QPS~50k–150k QPS~30k–100k QPS

Multi-tenancy (Suite G, 10 tenants)

CapabilityPurple8Neo4j EnterpriseWeaviate Cloud
Isolation0 / 500 leaksSeparate DB = strongStrong, complex ops
Aggregate throughput507k QPSNot publishedNot published
Provisioning8.6 msSeconds (new DB)Seconds (schema)
Per-tenant DEK encryption

Encryption overhead (Suite F)

SystemModelOverhead
Purple8AES-256-GCM envelope, per-tenant DEK, memory-cached+0% add_node; DEK cache hit 0.003 ms
Neo4j EnterpriseFilesystem encryption (LUKS/BitLocker)~0–2% (disk-level only)
MongoDB AtlasCSFLE / Queryable Encryption10–30% per protected field
WeaviateOptional at-rest disk encryption~0% (no field-level)

MCP server latency (Suite I)

No competitor ships a native MCP server. Purple8 establishes the category benchmark.

MetricValue
mcp_get_node p500.007 ms
mcp_get_neighbours p500.002 ms
50 concurrent sessions p950.022 ms
GraphRAG Mean Accuracy (v2, 2,500 docs)
─────────────────────────────────────────────────────────────
Purple8          91.7% ████████████████████████████████████████
Neo4j + Vector   79.2% ████████████████████████████████████
Kùzu + HNSW      79.2% ████████████████████████████████████
FalkorDB         79.2% ████████████████████████████████████
Weaviate-only    ~50%  ███████████████████████

Entity Disambiguation Accuracy
─────────────────────────────────────────────────────────────
Purple8          1.000 ████████████████████████████████████████
Neo4j + Vector   0.500 ████████████████████
Kùzu             0.500 ████████████████████
FalkorDB         0.500 ████████████████████
Weaviate-only    0.000 (cannot disambiguate)

Temporal Chain Accuracy
─────────────────────────────────────────────────────────────
Purple8          1.000 ████████████████████████████████████████
Graph-capable    1.000 ████████████████████████████████████████
Weaviate-only    0.000 (vector search is blind to temporal order)
Pinecone-only    0.000
Qdrant-only      0.000

4. Head-to-Head: Purple8 vs Neo4j + Vector Plugin

Neo4j is the most credible comparison point — native Cypher, enterprise maturity, 15+ years of production deployments. But its architecture fundamentally differs from Purple8.

DimensionPurple8Neo4j + Vector Plugin
ArchitectureSingle unified engineGraph engine + bolt-on plugin
RuntimeEmbedded Python (+ optional Rust Turbo core)JVM (Java 17+)
Vector searchNative HNSW + DiskANN, in-processPlugin call — separate HNSW index
Graph + vector in one query✅ Single Cypher CALL db.vector.search⚠️ Two-phase: vector → client merge → graph
Disk durability✅ BrickCore WAL (fdatasync)✅ (enterprise)
Encryption at rest✅ AES-256-GCM envelope (5 KMS)⚠️ Filesystem-level (EE only)
Multi-tenant REST API✅ Built-in (FastAPI)❌ External auth layer required
MCP server✅ Native
LLM integration✅ 9 providers, 39 models, runtime swap⚠️ GenAI plugin, manual config
RAG pipelinePOST /rag/query — end-to-end❌ DIY with LangChain
DocIntel✅ 56+ formats❌ Custom ETL required
Journey Engine
Deploymentpip install purple8-hyper-graphDocker + JVM + plugin config
AEC domain modules✅ 12❌ Generic graph only

Where Neo4j wins

  • Full Cypher — 100% openCypher, APOC functions, 50+ GDS algorithms
  • Maturity — 15+ years of production deployments, billions of nodes proven at scale
  • Ecosystem — Bloom (visual), Browser, drivers for Java/JS/Python/Go/.NET, large community
  • Query optimizer — mature cost-based planner; Purple8 uses a fixed strategy

Where Purple8 wins

  • Unified hybrid queryCALL db.vector.search runs HNSW in-process and feeds directly into Cypher traversal. Neo4j requires a separate vector query phase + client-side merge = two network round-trips minimum
  • Latency — 2.1 ms p50 hybrid vs ~4.8 ms (separate planners + JVM overhead)
  • LLM depth — 9 providers, 39-model registry, runtime swap via PUT /rag/config, NL-to-Cypher, knowledge extraction. Neo4j requires assembling LangChain + vector store + retriever + prompt chain
  • Encryption — per-tenant DEK envelope encryption with 5 KMS providers built-in. Neo4j requires Enterprise Edition licensing for at-rest encryption
  • Cost — no per-core licensing

The disambiguation moat

When two graph nodes share identical embeddings (e.g., two "Alice Chen" authors), pure vector search returns both — it has no information to distinguish them. The only way to disambiguate is to traverse the graph neighbourhood. Neo4j can do this, but requires two separate query phases and client-side result merging. Purple8 does it natively in a single Cypher query because the vector index and graph adjacency list share the same in-process storage engine. Result: Purple8 1.000 vs Neo4j 0.500.

Bottom line: Neo4j for graph-first analytics, GDS algorithms, and mature ecosystem. Purple8 for AI-first workloads where hybrid query latency and LLM integration are the primary concerns.


5. Head-to-Head: Purple8 vs Kùzu

DimensionPurple8Kùzu
LanguagePython (+ optional Rust core)C++ (Python bindings)
Installpip install purple8-hyper-graphpip install kuzu (+ C++ toolchain)
Vector search✅ Native HNSW + DiskANN⚠️ Manual hnswlib wiring, separate index
Graph + vector in one query❌ Application code must merge
Document store
BM25 full-text
Encryption at rest✅ AES-256-GCM (5 KMS)
Multi-tenancy✅ JWT RBAC per tenant❌ Single-tenant
MCP server
LLM / RAG integration✅ 9 providers, RAG pipeline❌ Pure database
REST API✅ FastAPI (built-in)❌ Custom server required
GraphRAG mean accuracy91.7%79.2%
Disambiguation accuracy1.0000.500
AEC modules✅ 12

Kùzu is an excellent embedded graph engine and a legitimate choice for open-source analytical workloads. But it treats HNSW as a separate module — there is no unified query interface, no encryption, no multi-tenancy, and no document store. It is a graph engine; Purple8 is a knowledge platform.

Bottom line: Kùzu for open-source embedded graph analytics. Purple8 when hybrid vector+graph is a first-class concern and enterprise security matters.


6. Head-to-Head: Purple8 vs FalkorDB

DimensionPurple8FalkorDB
Storage model✅ Disk-backed (BrickCore/Cortex)⚠️ In-memory first (Redis-based)
Durability on restart✅ WAL fdatasync⚠️ RDB/AOF snapshots only
Vector search✅ Native HNSW + DiskANN✅ In-memory HNSW
Encryption at rest✅ AES-256-GCM (5 KMS)
Deploymentpip installDocker + Redis
Multi-tenant REST API
GraphRAG mean accuracy91.7%79.2%
Disambiguation accuracy1.0000.500

FalkorDB's Redis foundation means that an unplanned restart loses all non-persisted data. For production knowledge graphs — especially in regulated industries — this is a disqualifying constraint. Purple8's WAL guarantees that every write that returns 200 OK is durable.

Bottom line: FalkorDB for open-source in-memory Cypher stores where the graph fits in RAM and durability is not a requirement. Purple8 for disk-backed durability at scale, enterprise security, and AI-first use cases.


7. Head-to-Head: Purple8 vs Vector-Only DBs (Weaviate / Pinecone / Qdrant / LanceDB)

A vector database answers one question: "What is semantically similar to this query?" It cannot answer:

  • "Who wrote this paper, given two authors with the same name?" (disambiguation requires graph context)
  • "What happened first in this timeline?" (temporal chains are a pure graph problem)
  • "How are these two documents related through shared citations?" (multi-hop traversal)

These are the exact queries that define RAG quality in production.

Accuracy comparison

TaskPurple8WeaviatePineconeQdrant
Entity disambiguation1.0000.0000.0000.000
Temporal chain1.0000.0000.0000.000
Multi-hop reasoning✅ 0.5000.500*0.500*0.500*
GraphRAG mean accuracy🥇 91.7%~50%~50%~50%

*Multi-hop appears equal at small scale; diverges at 100k+ nodes where graph traversal is the only tractable approach.

Operational comparison

DimensionPurple8Weaviate CloudPineconeQdrant Cloud
Self-hostedpip install✅ Docker❌ SaaS only✅ Docker
Offline / air-gapped⚠️ self-hosted only✅ self-hosted
Graph traversal✅ Native Cypher
Encryption at rest (built-in)✅ AES-256-GCM⚠️ Cloud-managed⚠️ Cloud-managed⚠️ Cloud-managed
MCP server✅ Native
Document store + full-text✅ Built-in⚠️ Properties only⚠️ Payload only
AEC domain modules✅ 12
Starting priceFree (self-hosted)$45/mo$50/mo minFree tier → usage-based
Data residency control✅ FullLimited❌ US AWS only (free)✅ self-hosted

LanceDB note: LanceDB is an excellent choice for analytical / ML feature store workloads (Apache Lance columnar format + DuckDB integration). However: no graph traversal, no Cypher, no encryption at rest, no multi-tenant REST API, no document store with relationship edges. It is not a substitute for knowledge graph workloads.

Bottom line: Weaviate, Pinecone, Qdrant for pure ANN similarity search with no graph requirements. Purple8 for any workload requiring disambiguation, temporal reasoning, or multi-hop traversal.


8. Head-to-Head: Purple8 vs Graph-Only DBs (Memgraph / Neptune / Cosmos Gremlin)

DimensionPurple8MemgraphAmazon NeptuneAzure Cosmos Gremlin
Storage modelDisk-backed (BrickCore/Cortex)In-memoryManaged (AWS)Managed (Azure)
Native HNSW vector search
Deploymentpip installDockerAWS consoleAzure portal
Cloud dependencyNoneNoneRequired (AWS)Required (Azure)
Query languageopenCypher + GraphQLopenCypherGremlin / Cypher / SPARQLGremlin
Encryption at rest✅ AES-256-GCM⚠️ OS-level✅ (managed)✅ (managed)
Cost modelFree (self-hosted)Free (OSS)Per-request RU billingPer-RU billing
Vector + graph unified query❌ needs ext. vector DB
LLM integration
Journey Engine

Memgraph is a strong in-memory graph competitor with Kafka/Pulsar streaming. The gap: no native HNSW, so RAG pipelines must add a separate vector DB — landing back in the dual-stack problem. Memgraph also must fit the entire graph in RAM.

Neptune and Cosmos Gremlin are managed cloud services with per-request billing, mandatory cloud dependency, and no native vector capability. For air-gapped deployments common in AEC, defence, and healthcare, they are architecturally ineligible.


9. Head-to-Head: Purple8 vs Spanner Graph

DimensionPurple8Spanner Graph
DDL prerequisiteNone — write data immediatelyCREATE PROPERTY GRAPH DDL required before first write
Schema modelData-first, emergentSchema-first
Vector search✅ HNSW + DiskANN❌ No native vector index
Self-hosted / multi-cloud❌ GCP only
CostFree (self-hosted)$15k–$80k/year

Spanner Graph is the right choice for globally-distributed transactional graphs on GCP with stable, known schemas. Purple8 is the right choice for AI discovery workloads where the schema is emergent — entities and relationships are extracted by LLMs and the structure is discovered, not predefined.

python
# Purple8: no schema required, build from LLM extraction
for doc in documents:
    nodes, edges = extractor.extract(doc.text)
    engine.batch_add_nodes(nodes)
    engine.batch_add_edges(edges)

# Infer the schema from what was actually discovered
schema = create_schema_from_graph(engine)

Schema-first systems cannot support this pattern. Purple8 was designed for it.


10. Head-to-Head: Purple8 Journey vs AI Orchestration Frameworks

Journey is Purple8's built-in AI workflow orchestration engine. It is not a database feature bolted on — it is a complete orchestration layer that combines:

  • LangGraph's idea of stateful, graph-structured agent workflows
  • Airflow's idea of stage-based DAG execution with scheduling and SLA policies

But it does this without any external dependencies, storing all state directly in the graph — making every transition, every AI decision, and every SLA breach instantly queryable with Cypher.

Architecture comparison

DimensionLangGraphApache AirflowPurple8 Journey
Primary purposeLLM agent state machinesData pipeline DAG schedulingAI workflow orchestration over real-world entities
State storageExternal (Redis, Postgres, in-memory)Postgres metadata DBGraph-native — every transition is an ADVANCED_TO edge
AI decision integrationLLM nodes in graphOperators + hooks (DIY)Built-in JourneyAIAdvisor — fires on stage entry, SLA warn, or manually
Audit trailDIY (LangSmith optional)Task instance logsImmutable AI_ADVISED graph edges — append-only, queryable in Cypher
SLA enforcement❌ Not a conceptsla_miss_callback (task-level)SLAPolicy(warn_after_seconds, breach_after_seconds) per stage with background monitor
Human-in-the-loopinterrupt node⚠️ Manual sensorsauto_execute=False — LLM recommends, human confirms
Real-time eventsCDC EventBus — WebSocket push on every advance/breach
Graph retrieval at decision timeSeparate tool call (vector DB + graph DB)N/ASame engine — zero latency, no network hop
Multi-tenant isolationDIYWorkspace/role RBACPer-tenant JourneyEngine with JWT RBAC
Installpip install langgraph + state storepip install apache-airflow + Postgres + Celerypip install purple8-hyper-graph — the state store is the graph you already have
Query past stateThrough state store (Redis/Postgres queries)Airflow metadata DB (SQL)Cypher — full graph traversal over all instances and transitions

What Journey does that LangGraph cannot

LangGraph is designed for single-session agent flows — a chain of LLM calls with branching logic within one conversation. Journey is designed for long-running multi-system entity tracking:

LangGraph mental model:
  User message → agent loop → tool calls → response
  Duration: milliseconds to minutes
  State: in-memory or Redis (ephemeral)

Journey mental model:
  Entity (customer, document, case) → defined stage sequence → multiple actors/systems
  Duration: hours to weeks
  State: durable graph edges (append-only, crash-safe, queryable forever)

A LangGraph workflow that loses its Redis state store loses all in-flight agent sessions. A Journey instance that survives a crash restarts exactly where it left off — the graph edges are the state, and WAL fdatasync ensures they survive.

What Journey does that Airflow cannot

Airflow orchestrates data pipelines — tasks that run on a schedule and process data. Journey orchestrates entity lifecycles — a real-world object (a person, a document, a financial transaction) moving through a business process.

Airflow strengthJourney strength
BashOperator, PythonOperator, complex DAG dependenciesPer-entity stage tracking — each entity has its own running instance
Cron scheduling, backfill, retrySLA on a per-instance basis — each entity can have different SLA urgency
Thousands of tasks in one DAGThousands of concurrent instances of the same journey type
Task logs in Airflow metadata DBAudit trail as graph edges — queryable with Cypher, traversable with hybrid search
No concept of AI decision-makingBuilt-in JourneyAIAdvisor — LLM advises on every stage with full context
No concept of the entityEntity is the primary object — je.start("loan_application", entity_id="customer_123")

For data engineering and ETL scheduling, Airflow remains the right tool. For AI-driven entity lifecycle management, Journey is a fundamentally better architecture.

What Journey does that CrewAI / AutoGen cannot

CrewAI and AutoGen are multi-agent conversation frameworks — LLMs talking to each other to complete a task. They have no concept of:

  • A stage sequence with owner systems
  • SLA enforcement with background monitoring
  • Durable state that survives process restarts
  • An immutable audit trail of decisions
  • Multi-tenant isolation per journey type

Journey's JourneyAIAdvisor can be thought of as a single "agent" in the CrewAI sense — but it operates with far more context (full audit history + SLA health + workflow definition) and all its decisions are written to an append-only graph that can be queried, traversed, and vector-searched indefinitely.

Journey capability summary

FeatureJourney
JourneyDefinition — repeatable process template✅ Stored as graph node
JourneyInstance — per-entity running instance✅ Stored as graph node
StageSpec — named stage with owner + SLA + AI config
SLAPolicy(warn_after_seconds, breach_after_seconds)✅ Background SLAMonitor thread
SLA_BREACHED / SLA_WARNED edges✅ Append-only, queryable
ADVANCED_TO transition edges✅ Immutable audit trail
JourneyAIAdvisor — LLM decision on every triggerON_ENTER, ON_SLA_WARN, ON_SLA_BREACH, MANUAL
AIStepConfig.auto_execute — human-in-the-loop toggle
AI actions: suggest_advance, force_advance, cancel, flag, hold, annotate, no_action✅ All written as AI_ADVISED edges
EventBus CDC — WebSocket push on every transition
Cypher queries over all journey stateMATCH (i:JourneyInstance)-[t:ADVANCED_TO]->()
Hybrid vector search over journey metadata✅ Same engine, zero latency
Multi-tenant per tenant_id
Rust-accelerated SLA scanning (JourneyEngineCore)✅ Optional Turbo core
REST API (/journey/* endpoints)✅ Built into build_journey_router()
Webhook receiver integrationWebhookReceiver connector

"Don't plug Purple8 into your agent framework. Journey IS your agent framework — with graph memory, hybrid search, audit trails, human-in-the-loop oversight, and SLA enforcement built in."


11. Graph as Memory — AI That Learns From Its Own History

What this is

Most AI systems treat memory as an external concern — Redis for short-term context, a vector store for long-term retrieval, a separate analytics database for outcomes. Purple8 eliminates all three by making the graph itself the memory layer.

There is no MemoryLayer class to instantiate and no background training process. Every AI decision, every human override, and every stage transition is written to the graph as an immutable edge. The graph is the memory. You query it with Cypher, the same way you query everything else.

What gets written automatically

AI_ADVISED edges — every time JourneyAIAdvisor.advise() runs:

(JourneyInstance) -[:AI_ADVISED]-> (Stage)

Properties: action_type, recommended, reasoning, confidence, model, timestamp

Nothing is overwritten. Ten runs on the same instance produce ten AI_ADVISED edges — a complete history of what the AI said and why, queryable forever.

ADVANCED_TO edges — every human or automated stage transition:

(JourneyInstance) -[:ADVANCED_TO]-> (Stage)

Properties: actor, from_stage, to_stage, notes, timestamp

HITLTask nodes — when the AI escalates to a human reviewer, a HITLTask node records the assignee, decision, rationale, and resolution time.

SLA_BREACHED edges — appended when a stage exceeds its SLA. Never deleted, never modified.

Querying the memory (standard Cypher)

cypher
-- What did the AI recommend, in order?
MATCH (ji:JourneyInstance {id: "ji:9871-abc"})-[r:AI_ADVISED]->(s:Stage)
RETURN r.timestamp, r.action_type, r.recommended, r.reasoning, r.confidence
ORDER BY r.timestamp ASC

-- Where did humans override the AI?
MATCH (ji:JourneyInstance)-[:AI_ADVISED]->(s:Stage)
MATCH (ji)-[:HITL_TASK]->(t:HITLTask {decision: "reject"})
RETURN ji.id, s.name AS ai_recommended, t.rationale, t.assignee
LIMIT 50

-- Override rate by journey type (run monthly — high rate = AI reasoning mismatch)
MATCH (ji:JourneyInstance)-[:AI_ADVISED]->(s)
OPTIONAL MATCH (ji)-[:HITL_TASK]->(t:HITLTask {decision: "reject"})
WITH ji.journey_type AS jtype, count(s) AS ai_calls, count(t) AS overrides
RETURN jtype, ai_calls, overrides,
       round(100.0 * overrides / ai_calls, 1) AS override_pct
ORDER BY override_pct DESC

-- What AI actions precede SLA breaches?
MATCH (ji:JourneyInstance)-[:SLA_BREACHED]->(s:Stage)
MATCH (ji)-[ai:AI_ADVISED]->(prev)
WHERE ai.timestamp < s.breached_at
RETURN ai.action_type, ai.reasoning, count(*) AS frequency
ORDER BY frequency DESC LIMIT 10

The learning loop (no retraining required)

Write an OUTCOME edge when a journey closes, then query patterns from closed instances and pass them as few_shot_patterns to the next advise() call:

python
# 1. Write the outcome
engine.add_edge(
    src_id="ji:9871-abc", dst_id="ji:9871-abc",
    edge_type="OUTCOME",
    properties={"result": "won", "closed_at": "2026-03-25T16:00:00Z",
                "revenue": 2_000_000, "cycle_days": 47},
)

# 2. Query patterns from closed-won deals
patterns = engine.query("""
    MATCH (ji:JourneyInstance {journey_type: $jtype})-[o:OUTCOME {result: "won"}]->()
    MATCH (ji)-[ai:AI_ADVISED]->(s)
    RETURN ai.action_type, ai.recommended, avg(o.cycle_days) AS avg_cycle
    ORDER BY avg_cycle ASC LIMIT 5
""", {"jtype": "sales-cycle"})

# 3. Inject patterns into the next decision as context
recommendation = await advisor.advise(
    instance=current_instance,
    audit_history=history,
    few_shot_patterns=patterns,   # closed-won patterns → system prompt
)

No retraining. No embedding rebuild. No external memory service. The graph stores the signal; you decide which signal to surface as context.

Real-time memory via CDC

EventBus fires on every graph write — including AI_ADVISED edges — so downstream systems react the moment a decision lands:

python
async with bus.subscribe(tenant_id="acme") as queue:
    event = await queue.get()
    if event.event_type == EventType.EDGE_ADDED:
        if event.properties.get("edge_type") == "AI_ADVISED":
            await post_to_slack(event.properties)

Or stream over WebSocket with no Python process required:

ws://localhost:8100/ws/changes?tenant_id=acme&event_type=edge_added

Competitor comparison — AI memory

CapabilityPurple8LangGraphLangChain / LangSmithMem0ZepMemGPT / Letta
AI decision history (immutable edges)✅ Native graph edges❌ External store⚠️ LangSmith traces (separate SaaS)
Human override historyHITLTask nodes, queryable in Cypher⚠️ interrupt node, state store only
SLA breach historySLA_BREACHED edges, append-only❌ Not a concept
Outcome edges (win/loss/result)✅ Self-edge on instance node
Query memory with Cypher✅ Same engine❌ Redis/Postgres queries
Vector search over memory✅ In-process HNSW, zero latency❌ Separate vector DB required✅ (separate)✅ (separate)✅ (separate)
Memory + graph traversal in one query
Few-shot pattern injectionfew_shot_patterns argument❌ DIY❌ DIY⚠️ Persona context only
Real-time CDC on memory writesEventBus / WebSocket
Multi-tenant memory isolation✅ Per-tenant JourneyEngine + JWT RBAC❌ DIY⚠️
No separate memory service✅ Graph is the memory❌ Redis/Postgres required❌ LangSmith is separate❌ Separate service❌ Separate service❌ Separate service
Encryption at rest (memory data)✅ AES-256-GCM, 5 KMS❌ Delegated to Redis/Postgres❌ SaaS
Self-hosted / air-gapped⚠️❌ LangSmith is SaaS⚠️ OSS + managed⚠️ OSS + managed⚠️ OSS

Mem0, Zep, MemGPT/Letta are standalone AI memory services (separate pip install, separate database, separate API). They provide semantic memory for LLM conversations. Purple8's memory is structurally different: it is the operational history of real-world entity lifecycles — every stage transition, every AI recommendation, every human override — stored as durable graph edges in the same engine that runs your queries.

What this is not

To be explicit: Purple8 does not have a background process that automatically re-ranks or updates embeddings based on feedback. The AI advisor does not update its own weights — it is a stateless LLM call that receives whatever context you pass it. The pattern described here (write outcomes → query patterns → pass patterns as context) is simple on purpose. The graph handles persistence and traversal; you decide which signal is worth surfacing.


12. Unique Differentiators (Eight Moats)

These capabilities exist in Purple8 v0.56.0 and are not matched by any single competitor.

Moat 1 — Entity Disambiguation (1.000 vs ≤ 0.500)

No competitor achieves perfect disambiguation. When two graph nodes share identical embeddings, pure vector search returns both with no way to choose. The only tractable solution is to traverse the graph neighbourhood atomically with the vector search. No dual-stack architecture can provide this without client-side merging — which introduces race conditions. Purple8 does it in a single in-process Cypher statement.

Moat 2 — Zero-Drift Architecture

Dual-stack systems have inherent graph-vector data drift because they write to two separate stores:

Dual-stack write (Weaviate + Neo4j):
  1. Write node to Neo4j → success
  2. Upsert embedding to Weaviate → network timeout
  3. Result: graph has the node; vector index does not
  4. Next query: graph traversal finds it; vector search misses it
  → Silent data drift, no error surfaced

Purple8 write:
  1. Write node + embedding in single atomic operation to the WAL
  2. Result: both consistent or both rolled back
  → Impossible to have drift between graph and vector state

At scale this is not just a latency advantage — it is a data integrity guarantee.

Moat 3 — AES-256-GCM Envelope Encryption (Built-in, 5 KMS)

No competitor provides built-in at-rest encryption for a self-hosted graph+vector store:

  • Neo4j requires Enterprise Edition licensing for filesystem-level encryption
  • Weaviate, Qdrant, Pinecone delegate to cloud provider encryption
  • Purple8 provides cryptographic envelope encryption per-tenant DEK, per-field granularity, with zero-downtime key rotation across 5 KMS providers (Local, HashiCorp Vault, AWS KMS, GCP KMS, Azure Key Vault)

This is critical for HIPAA, ISO 27001, and AEC regulated contracts.

Moat 4 — Single pip install + Embedded Runtime

Purple8 is the only graph+vector system that installs in one command with no JVM, no Docker, no C++ build toolchain. This eliminates an entire class of deployment and reproducibility problems, and makes Purple8 the only viable option for edge, air-gapped, and developer-local deployments.

Moat 5 — AEC Vertical + DocIntel (56+ Formats)

Purple8 ships 12 AEC industry modules (IFC, BIM, DXF, SAP IDoc, P6 schedule, etc.) and DocIntel with 56+ format parsers. No general-purpose database vendor addresses this market. This is currently a category-of-one: the only knowledge graph purpose-built for construction, engineering, and asset management workflows.

Moat 6 — Journey Engine (Graph-Native AI Workflow Orchestration)

No database vendor — graph or vector — ships a built-in AI workflow orchestration engine. LangGraph requires an external state store. Airflow requires Postgres + Celery workers and has no concept of AI decision-making. CrewAI/AutoGen are stateless conversation frameworks with no SLA enforcement, no durable audit trail, and no entity-lifecycle model.

Journey eliminates the need for any of these systems for entity-lifecycle workflows. Every stage transition is a durable graph edge. Every AI decision is an immutable AI_ADVISED edge queryable in Cypher. SLA monitoring runs as a background thread in the same process, with no additional infrastructure. Category-of-one: no competitor — graph DB, vector DB, or agent framework — offers this combination.

Moat 7 — Unified Document Store

Every Purple8 node carries a schemaless properties: dict[str, Any] — arbitrary JSON depth, arrays, nested objects — stored in the same BrickCoreStorage (Cortex) instance as the graph, encrypted by the same KMS envelope, made durable by the same WAL. Teams building AI applications no longer need a separate document database:

  • MongoDB Atlas ($57+/mo) — eliminated
  • DynamoDB (on-demand billing, AWS-only) — eliminated
  • Postgres JSONB (separate service, separate schema, separate backup) — eliminated

One atomic write covers all four capabilities: document, graph, vector, full-text. No dual-write path. No ETL sync job. No race condition between the document record and the graph node.

Moat 8 — Graph as Memory (No External Memory Service)

Mem0, Zep, and MemGPT/Letta are standalone AI memory services — separate install, separate database, separate API. They store conversation context for LLM sessions.

Purple8's memory is architecturally different: it is the operational history of real-world entity lifecycles. Every AI_ADVISED edge, every ADVANCED_TO transition, every HITLTask node, every SLA_BREACHED edge, and every OUTCOME edge is a durable, encrypted, Raft-replicated graph edge in the same engine that runs your queries. You query it with Cypher. You vector-search it in-process. You feed patterns from it back to the AI as context — with no separate service, no additional pip install, and no data leaving the graph.

No competitor — graph DB, vector DB, orchestration framework, or AI memory service — offers this combination. See Section 11 for the full breakdown.


13. RAG Studio — Built-In Pipeline with Model Registry & Evaluation

Purple8 ships a complete RAG pipeline accessible via REST API, MCP tool, Python SDK, and frontend UI. No LangChain, no glue code, no separate vector database.

Question → Embed → [RouterAgent] → Vector / BM25 / Graph-BFS / Hybrid → [RRF Fusion] → (Rerank) → Context Assembly → LLM → Grounded Answer

v0.31.0 adds Multi-Index Routing, Late Chunking, and RRF Fusion. v0.32.0 adds Agentic Chunking Intelligence (ChunkingAgent) and per-label query re-embedding — see §14.

LLM model registry — 39 models, 9 providers:

ProviderModels
OpenAIgpt-5.4, gpt-5.4-mini, gpt-5.4-nano, o3, o4-mini
Anthropicclaude-sonnet-4, claude-opus-4, claude-3.5-haiku
Googlegemini-3.1-pro-preview, gemini-3-flash, gemini-2.5-flash, gemini-2.5-pro
Vertex AIgemini-2.5-flash, gemini-2.5-pro (VPC-SC / CMEK)
Mistralmistral-large, mistral-medium, magistral-medium, codestral
Coherecommand-a, command-a-reasoning, command-r7b
AWS Bedrocknova-pro, nova-lite, nova-micro, claude-sonnet-4
Azure OpenAIgpt-5.4, gpt-5.4-mini (managed identity, VNET)
Self-hostedllama-3.3-70b, llama-3.1-8b, mistral-nemo-12b, qwen3-next-80b, deepseek-r1

Switch providers and models at runtime via PUT /rag/config — no code changes, no redeployment.

Per-tenant configuration — 23 parameters across 5 categories (v0.31.0):

CategoryParameters
Chunkingchunking_strategy (fixed, recursive, semantic, sentence_window, parent_child, markdown_header, late, syntactic), chunk_size, chunk_overlap, chunk_overlap_percent, late_chunking_model, late_chunking_max_tokens, chunking_agent_enabled
Retrievalretrieval_k, embedding_model, min_similarity, hybrid_weight, mmr_diversity, reranker, fusion_strategy (weighted | rrf), rrf_k, routing_enabled
Generationprovider, model, temperature, max_tokens, top_p, system_prompt
Evaluationevaluation_enabled (Prometheus export of quality scores)

🔀 Multi-Index Router — RouterAgent (v0.31.0)

The RouterAgent dispatches each query to the optimal retrieval strategy based on node label and query confidence — configured in a per-tenant rag_routing.json file.

bash
# Enable routing
curl -X PUT /rag/config \
  -d '{"routing_enabled": true}'

# Configure per-label routing rules
curl -X PUT /rag/routing \
  -d '{
    "Document": [{"strategy": "hybrid",  "min_confidence": 0.0}],
    "Person":   [{"strategy": "graph",   "min_confidence": 0.8, "expand_hops": 2},
                 {"strategy": "vector",  "min_confidence": 0.0}],
    "Code":     [{"strategy": "bm25",   "min_confidence": 0.0}],
    "*":        [{"strategy": "hybrid",  "min_confidence": 0.0}]
  }'

# Query — router picks the best strategy per label automatically
curl -X POST /rag/query \
  -d '{"question": "Who owns module auth?", "labels": ["Code"]}'

Each response now includes a "retrieval" metadata field:

json
{
  "answer": "...",
  "retrieval": {
    "strategy": "bm25",
    "label_matched": "Code",
    "latency_ms": 1.4,
    "fusion": null
  }
}

📄 Late Chunking — chunking_strategy: "late" (v0.31.0)

Late Chunking embeds the entire document with a long-context model first, then pools the resulting token embeddings into context-aware chunk vectors. Cross-sentence semantic signal is preserved — unlike fixed or recursive chunking which embeds isolated chunks.

bash
curl -X PUT /rag/config \
  -d '{
    "chunking_strategy": "late",
    "late_chunking_model": "voyage-4-large",
    "late_chunking_max_tokens": 28000
  }'
ModelContextProvider
voyage-4-large32 K tokensVoyage AI (recommended)
jina-embeddings-v38 K tokensJina AI
text-embedding-3-large8 K tokensOpenAI (fallback)

🔗 RRF Fusion — fusion_strategy: "rrf" (v0.31.0)

Reciprocal Rank Fusion (RRF) replaces the old weighted-sum hybrid as the fusion strategy. RRF is rank-position–based so it handles mismatched score distributions (BM25 vs cosine similarity vs graph-hop count) without manual weight tuning.

bash
curl -X PUT /rag/config \
  -d '{"fusion_strategy": "rrf", "rrf_k": 60}'

RRF score formula: score(d) = Σ 1 / (k + rank_r(d)) across all retrievers. k=60 is the empirically optimal constant from the TREC literature (Cormack et al. 2009).

Built-in evaluation — 5 DeepEval metrics:

bash
curl -X POST /rag/evaluate \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"test_cases": [{"question": "...", "expected_answer": "..."}],
       "metrics": ["faithfulness", "answer_relevancy", "contextual_precision",
                   "contextual_recall", "hallucination"]}'
CapabilityNeo4jKùzuFalkorDBPurple8
Built-in RAG pipeline❌ DIY❌ DIY❌ DIYPOST /rag/query
LLM model registry❌ Manual❌ N/A❌ N/A✅ 39 models, 9 providers
Runtime model swap❌ Redeploy❌ N/A❌ N/A✅ Config change, no restart
Chunking strategies❌ DIY❌ DIY❌ DIY✅ 8 strategies (incl. late, syntactic) + ChunkingAgent auto-selection
Per-tenant RAG config❌ DIY❌ N/A❌ DIYPUT /rag/config (23 params)
Multi-index routing❌ DIY❌ DIY❌ DIYRouterAgent — per-label strategy dispatch
RRF / fusion strategy❌ DIY❌ DIY❌ DIYfusion_strategy: weighted | rrf
Quality evaluation❌ DIY❌ DIY❌ DIYPOST /rag/evaluate (5 metrics)

14. Agentic Chunking Intelligence & Multi-Model Index (v0.32.0)

The Problem: Single-Model Vector Spaces Degrade on Mixed Corpora

When legal contracts, Python source files, and clinical notes all share one embedding model, retrieval degrades. A model tuned for natural language prose assigns nonsensical distances to code tokens. A code-optimised model loses legal nuance. The result: a single flat vector space where nearest-neighbours are wrong by construction for at least two of the three doc types.

Purple8 v0.32.0 solves this by routing each document into a dedicated sub-space at ingest time, then re-embedding queries into that same sub-space at search time.

Architecture: ChunkingAgent + RouterAgent Close the Loop

Ingest path
───────────
DocIntel job_to_preview()

        ▼ DocIntelChunkingHint (zero re-classification)
ChunkingAgent.classify(text, filename, mime_type, docintel_hint?)

        ▼ ChunkingDecision {doc_type, chunking_strategy, embedding_model, …}
/ingest/commit  →  node properties store classification metadata


HNSW index (per-label, per-model sub-space)

Query path
──────────
RouterAgent.route(query, embedding, labels)

        ├─ RoutingRule has embedding_model?
        │       │ yes → _reembed_query(query, rule.embedding_model)
        │       │         ↳ Voyage / Jina / OpenAI — never raises
        │       │ no  → use default embedding

        ▼  active_embedding (label-matched model)
_dispatch()  →  Vector / BM25 / Hybrid / Graph-BFS

The key insight: DocIntel already knows the doc type from its extraction pipeline. DocIntelChunkingHint is the wire that passes that knowledge directly into ChunkingAgent.classify(), bypassing heuristic re-classification entirely — confidence 1.0, zero latency cost.

Default Domain → Model Mapping

Doc TypeChunking StrategyEmbedding ModelWhy
legal_contractlatevoyage-4-largeLong-context cross-sentence semantic signal; preserves clause references
research_paperlatevoyage-4-largeAbstract ↔ methodology ↔ results cross-reference; 32 K context
codesyntacticvoyage-code-3Code-tuned tokenisation; syntactic chunking preserves function/class boundaries
financial_reportsemanticvoyage-finance-2Domain vocabulary (EBITDA, CAGR); semantic boundary detection for tables/narratives
clinical_notesentence_windowvoyage-3Short factual sentences; sliding window preserves diagnostic context
transcriptsentence_windowvoyage-3Turn-by-turn sentences; window captures speaker transitions
documentsemanticvoyage-4-largeGeneral-purpose; semantic chunking for natural paragraph breaks
markdownmarkdown_headertext-embedding-3-smallHeader-aware splits; lightweight model sufficient for structured docs
* (catch-all)fixedtext-embedding-3-smallSafe default for unknown types

DocIntel Fast-Path vs Heuristic Classification

ChunkingAgent.classify() runs two code paths depending on whether a DocIntelChunkingHint is provided:

PathTriggerConfidenceHow
DocIntel fast-pathdocintel_hint present with doc_type1.0 (or hint's value)Registry lookup on hint.doc_type; falls back to hint's chunking_hint + suggested_embedding_model if no specific rule
HeuristicNo hint0.40–0.95File extension → MIME type → content pattern scoring; fallback "document" at 0.40

Heuristic confidence signals:

  • File extension (.py, .js, .tsxcode at 0.95; .md, .rstmarkdown at 0.95)
  • MIME type (text/x-pythoncode at 0.90)
  • Content patterns: legal keywords, code structure markers, clinical vocabulary, financial terms, research paper signals — scored 0.50–0.90

Per-Label Query Re-Embedding

When RouterAgent matches a RoutingRule that specifies an embedding_model different from the tenant default, it re-embeds the query before dispatching to the vector index:

python
# rag_routing.json
{
  "Code": [{"strategy": "hybrid", "embedding_model": "voyage-code-3", "min_confidence": 0.0}],
  "Document": [{"strategy": "vector", "embedding_model": "voyage-4-large", "min_confidence": 0.0}]
}
bash
# Enable routing + chunking agent
curl -X PUT /rag/config \
  -d '{"routing_enabled": true, "chunking_agent_enabled": true}'

# Ingest — classification metadata auto-attached to every node
curl -X POST /ingest/commit \
  -d '{
    "source_name": "contracts_q1.pdf",
    "doc_type": "legal_contract",
    "chunking_hint": "late",
    "suggested_embedding_model": "voyage-4-large",
    "entities": [...]
  }'

# Query — RouterAgent re-embeds with voyage-code-3 when label=Code
curl -X POST /rag/query \
  -d '{"question": "How does auth middleware work?", "labels": ["Code"]}'

Response includes re-embedding metadata:

json
{
  "answer": "...",
  "retrieval": {
    "strategy": "hybrid",
    "label_matched": "Code",
    "embedding_model_used": "voyage-code-3",
    "latency_ms": 3.2
  }
}

Competitive Differentiator

CapabilityNeo4jWeaviateLanceDBPurple8
Per-doc-type embedding model❌ Manual config⚠️ Per-class, static❌ Manual✅ Auto-classified at ingest
Per-query re-embedding❌ DIY❌ DIY❌ DIY_reembed_query() in RouterAgent
DocIntel zero-reclassification fast-path❌ N/A❌ N/A❌ N/ADocIntelChunkingHint
Classification stored on nodes❌ DIY❌ DIY❌ DIYchunking_props merged at /ingest/commit
Runtime model swap without re-ingest❌ DIY❌ Class recreation❌ DIYPUT /rag/config

15. SOC Agent — Built-in Security Operations (v0.33.0)

No competitor in the graph or vector database space ships an active, self-calibrating security layer as part of the database engine. Purple8 does.

The Problem No Competitor Solves

Production graph databases hold sensitive data: PII, financial records, AI-generated knowledge graphs, tenant-private embeddings. They are also exposed to:

  • Credential stuffing — brute-force auth bursts against the API
  • Data exfiltration — large result sets or bulk exports that drain knowledge graphs
  • RAG poisoning — high-volume ingest designed to corrupt vector baselines
  • Destructive CypherDETACH DELETE, DROP, or TRUNCATE injected via compromised applications
  • Embedding inversion — high-frequency vector queries probing for reconstruction of private embeddings
  • Tenant boundary violations — cross-tenant reads or writes in multi-tenant deployments

Neo4j, Kùzu, FalkorDB, Weaviate, Pinecone, and every other competitor leave the operator to build detection and response pipelines externally — or rely entirely on perimeter security.

How Purple8's SOC Agent Works

The SOC agent runs a two-layer detection pipeline on every metric observation — before any query or write is committed:

Layer 1 — Rule Engine (JourneyAnomalyRuleEngine): 11 stateless threshold rules covering all 10 threat classes. Fires in under 1 ms. SOC2-explainable — every signal carries rule_name, observed_value, and threshold. Zero warm-up.

Layer 2 — EWMA Statistical Baseline (JourneyAnomalyDetector): Per-tenant, per-metric Exponentially Weighted Moving Averages. Fires when the z-score exceeds 3.5σ. Adapts independently to each tenant's usage patterns — a tenant with legitimately large exports is not flagged once their baseline settles.

Signals from both layers are merged, classified into one of 10 ThreatClass values, and passed to the ContainmentManager for graduated response.

Containment — Graduated and Human-Gated

LevelAuto-released?What Happens
SOFTYesFlag + alert. No service disruption.
MEDIUMYesRate-limit + quarantine label. Journey continues under throttle.
HARDNo — human requiredWrites suspended. Peer isolated. Named operator must call release().
CRITICALNo — human requiredTenant suspended. Tokens revoked. Emergency SST snapshot. Named operator must call release().

ContainmentLevel.requires_human_release is True in code for HARD and CRITICAL. Anonymous releases (released_by="") raise ValueError. This is not a config option — it is enforced at the type level.

The Blast Radius Estimator

Before applying containment, BlastRadiusEstimator calculates how many tenants, journey instances, or SuperGraph peers could be affected — so operators see the scope before acting, and automated responses are proportionate.

Immutable SOC2-Aligned Audit Log

Every containment action and every release writes an AuditRecord — immutable, timestamped, and carrying actor, released_by, and released_at. The log maps directly to:

SOC2 CriterionPurple8 Mechanism
CC6.6 — Anomaly detectionLayer 1 rules + Layer 2 EWMA z-score
CC6.7 — Privileged accessHARD/CRITICAL human-release gate enforced in code
CC7.3 — Incident responseincident_report() for SIEM/ticketing
CC9.2 — Business continuityEMERGENCY_SNAPSHOT on CRITICAL

Competitive Gap

CapabilityNeo4jKùzuFalkorDBWeaviatePurple8
Built-in anomaly detection✅ 2-layer (rules + EWMA)
Automated containment✅ 4-tier graduated
Human-gated release for critical events✅ Enforced in code
Immutable SOC2-aligned audit log❌ external✅ Native AuditRecord
10 threat classes covered
Blast radius estimation before containment
SIEM / webhook callbacks❌ external✅ Native
SOC Dashboard REST API❌ external/soc/* endpoints

Bottom line: No competitor ships a database-native SOC layer. Purple8's SOC agent removes an entire external toolchain (Datadog + PagerDuty + custom SIEM rules + custom release workflow) for teams operating in regulated or multi-tenant environments.


17. Operational & TCO Comparison

Deployment complexity

StepPurple8Weaviate + Neo4j (dual-stack)
Infrastructure services12 (+ optional sync pipeline)
Docker containers02+
Install commandpip install purple8-hyper-graphdocker pull neo4j + docker pull semitechnologies/weaviate + config
Write pathSingle API callDual write to 2 DBs
Read pathIn-process2 network hops + client-side merge
Data drift riskNoneHigh (ETL lag between DBs)
Schema syncN/AManual — changes in 2 places
Operational monitoring1 endpoint2+ endpoints + sync health

Cost of ownership

Cost FactorPurple8Weaviate Cloud + Neo4j AuraDB
SaaS monthly minimum$0 (self-hosted)$45/mo (Weaviate Flex) + $65+/mo (AuraDB) = $110+/mo
Dedicated managed$0 (self-hosted)$400+/mo (Weaviate Premium) + AuraDB
Infrastructure engineers0 (single service)1+ (dual-stack ops, sync pipeline maintenance)
Data drift incidents0Ongoing (dual-write race conditions)
Encryption licenceBuilt-inEnterprise Edition required for Neo4j at-rest encryption
Document storage serviceIncluded (node properties)MongoDB Atlas $57+/mo or DynamoDB or Postgres RDS $25+/mo — eliminated by Purple8

18. Honest Gaps & Roadmap

A production-grade competitive analysis must be honest about limitations.

Knowledge synthesis (Task 3 — fan-out recall)

Purple8 scores 7.5/20 on knowledge synthesis vs 27.7/20 for combined Neo4j strategies. This is by design: Purple8 uses targeted hybrid queries; Neo4j uses breadth-first fan-out across all nodes. Fan-out wins on recall but at multi-second query cost. The trade-off is sub-1ms latency vs exhaustive recall.

Roadmap: Configurable fan-out depth with a latency budget parameter — trade latency for recall on a per-query basis.

Disambiguation latency at 100k (HNSW scan depth)

At 100k docs, disambiguation query latency reaches 3.6 s p50 due to HNSW scan depth.

✅ Fixed — no longer an open gap. Updated benchmark results will be published in the next cycle.

No managed cloud offering

Purple8 is currently self-hosted only. Teams requiring zero-ops managed service with SLA-backed uptime should consider Weaviate Cloud or Pinecone for their managed layer.

Roadmap: Managed cloud offering is on the product roadmap.

Published scale ceiling

The largest fully published benchmark is 100,000 documents. Internal testing exists for 1M-node graphs but has not been published.

Roadmap: 1M-node benchmark publication planned for the next benchmark cycle.

Rust Turbo core — separate build step

The Rust performance core requires maturin develop --release and is not included in the standard pip wheel.

Roadmap: Pre-compiled binary wheels for macOS arm64 and Linux x86_64 are planned — beginning with the private beta.


19. The "Force to Be Reckoned With" Case

Purple8 is not a prototype. As of v0.56.0:

  • 0 known CVEs — pip-audit clean, post-remediation
  • 182× faster than BM25 at 100k scale
  • #1 MRR@10 on MS MARCO at every tested scale
  • Unique category: the only Hyper Graph DB — graph + vector + document + full-text in one engine
  • Unified Document Store — schemaless node properties replace MongoDB/DynamoDB/Postgres JSONB with no separate service and no sync layer
  • Production hardening: BrickCore WAL, fdatasync durability, circuit breaker, AES-256-GCM
  • Nightly CI regression gate: bench-sanity job blocks merge if add_node > 5 ms/op
  • Dependabot + security CI job: pip-audit gates every PR before tests run
  • 12 AEC domain modules — unique vertical with zero direct competition
  • Native MCP server — no competitor ships this
  • Journey Engine — graph-native AI workflow orchestration; no LangGraph + Airflow + Redis stack required
  • Graph as Memory — immutable AI_ADVISED, ADVANCED_TO, HITL, SLA_BREACHED, and OUTCOME edges queryable in Cypher; no Mem0 / Zep / MemGPT required
  • 39-model LLM registry, 9 providers — runtime model swap with no redeployment

Purple8 is the only database that can truthfully claim: "single pip install, unified graph + vector + document + full-text + AI orchestration, with built-in encryption and multi-tenancy, achieving #1 MRR@10 on MS MARCO at 100k scale with 182× lower latency than BM25."

No other product can make that statement.


20. Decision Framework

Use CaseBest ChoiceReason
RAG with entity disambiguationPurple8Only system achieving 1.000 disambiguation accuracy
Knowledge graph + vector unified queriesPurple8Single engine, no dual-write, no ETL lag
Air-gapped / regulated / AEC deploymentPurple8pip install, AES-256-GCM built-in, 5 KMS, AEC modules
Agent / MCP-native integrationPurple8Only system with native MCP server
Temporal reasoning over eventsPurple8Vector-only DBs score 0.000 on temporal chains
Schemaless document storagePurple8Node properties dict — same engine, same encryption, same WAL; no MongoDB required
AI workflow orchestration (entity lifecycle)Purple8 JourneyGraph-native state, SLA enforcement, HITL, immutable audit
Stateful AI workflows (replace LangGraph)Purple8 JourneyDurable graph-edge state survives restarts
Business process automation with AI stepsPurple8 JourneyPer-entity SLA + AI advisor; Airflow has no entity model
AI agent memory (replace Mem0 / Zep / MemGPT)Purple8AI_ADVISED + OUTCOME edges in same graph — Cypher-queryable, vector-searchable, encrypted, no separate service
Regulated / multi-tenant security operationsPurple8Built-in SOC agent — 2-layer detection, 4-tier containment, human-gated release, SOC2-aligned audit log
Full Cypher + APOC + GDS (50+ algorithms)Neo4jMature, large ecosystem, full standards compliance
Pure ANN similarity search (no graph)Qdrant / LanceDBPurpose-built, high performance for vector-only
AWS-native zero-ops managed graphAmazon NeptuneManaged, AWS-native
Globally-distributed transactional graph (GCP)Spanner GraphPaxos at global scale, stable schema
Managed cloud, zero-ops vector searchPinecone / WeaviateFully managed SaaS with SLA guarantees
Offline ML feature store (columnar)LanceDBLance format + DuckDB integration

21. Scoring Summary

Scale: 1 (weak) → 5 (best-in-class). Weighted for AI-first enterprise workloads.

DimensionWeightPurple8Neo4jKùzuFalkorDB
Graph query expressiveness10%4554
Vector search capability12%5222
Unified vector+graph query12%5111
Built-in RAG pipeline10%5111
Full-text search5%4313
LLM / AI integration12%5211
Enterprise security10%5311
Deployment simplicity8%4234
Scale & performance8%3443
Document ingestion5%5111
Maturity & ecosystem8%2533
Weighted Score4.182.622.042.08

Scoring context

These scores are weighted for AI-first enterprise workloads. For pure graph analytics, Neo4j's score would be significantly higher. The scores reflect Purple8's target buyer, not a universal ranking.


Appendix — Benchmark Methodology

  • Suite A uses synthetic data (64-dim embeddings) for reproducibility without network access
  • Suite B uses real all-MiniLM-L6-v2 embeddings (384-dim) on MS MARCO and HotpotQA subsets
  • Competitor results in Suite A are emulated via Purple8's strategy implementations (weaviate-strategy, neo4j-strategy, combined-strategy) running on the same local hardware — not live services. Competitor latency in those tests is therefore theoretical minimum, not live service latency
  • Benchmark hardware: Apple M-series (macOS dev baseline) for Suites C–J; m6i.2xlarge (8 vCPU, 32 GB RAM) for hybrid search tables
  • All p50/p95 latency values are end-to-end query latency in milliseconds, 3 runs per cell

Full reproducibility: Benchmarks

Purple8 Graph is proprietary software. All rights reserved.