ClickGraph · ClickHouse   /   DeltaGraph · Databricks  ·  Positioning Brief

Your warehouse or lakehouse is the graph engine.

We translate Cypher to SQL and push it down to ClickHouse or Databricks. No graph database. No data movement. No second compute engine. The graph question, answered where the data already lives — at a scale the graph engines can't reach.

The wedge — three things we add

Compute
Zero

A pure translator. 100% of execution runs inside the warehouse you already operate, secure, and pay for. There is no engine to size, scale, or bill.

Data movement
Zero

Nothing is imported, copied, or flattened. Your existing tables — warehouse or open lakehouse formats (Iceberg, Delta, Parquet) — are the graph, with their real relationships intact. Data never leaves the platform boundary.

In-memory ceiling
Zero

We store nothing. Our scale ceiling is the warehouse's — petabyte-native. The graph engines cap at what fits in RAM.

Where this matters most — GraphRAG

Your warehouse already does vector search. We add the graph half.

GraphRAG needs two retrievals over your knowledge: semantic (“chunks similar to this query” → vector search) and structural (“traverse from these entities to related facts” → graph). ClickHouse and Databricks already ship native vector search.¹⁰¹¹ Today, teams do the semantic half in the warehouse and export to Neo4j/Neptune for the structural half — a second store, an ETL pipeline, a sync lag, a governance gap. The vectors are already home; the graph traversal can live there too.

# one hybrid retrieval, one warehouse — vector seed + graph expansion
CALL vector_search(chunks, $q, 10) YIELD node // native ANN, in-warehouse
MATCH (node)-[:MENTIONS|RELATED_TO*1..2]->(ctx) // graph-expand real relationships
RETURN ctx // enriched, governed context → LLM
Freshness

RAG data is a live knowledge base. Exporting to a graph DB makes answers stale by the ETL lag. We query where fresh data lands — no ingestion, no lag.

No retrieval sprawl

Collapse graph into the store that already holds the vectors. One system to run and secure, not vector DB + graph DB + sync glue.

Governance

The context sent to the LLM must contain only what the user is authorized to see. A separate graph store is a second RBAC surface to get right. We inherit the warehouse's access controls.

Scale

Enterprise knowledge bases outgrow a ~1 TiB in-memory graph engine. Your GraphRAG graph is as large as your warehouse — the same tables you already trust.

Honest scope: the warehouse does the embeddings and the ANN index — we're the graph half that completes the pair, not a vector database. Retrieval + bounded graph expansion is the ready path; heavier graph-algorithm summarization (e.g. community-based GraphRAG) is where the roadmap goes next — see below.

See it live — six GraphRAG traversals an AI agent ran through MCP, including a hybrid vector + graph retrieval →

A flagship vertical — security graph at scale

Your security telemetry is already in the warehouse. It's already a graph.

Network flows, DNS, auth logs, cloud audit trails — petabytes of it, already landing in ClickHouse or the lakehouse, ingested at millions of events per second. The questions security teams ask are inherently graph questions: lateral movement (which host reached which host reached which), blast radius (what can this compromised identity touch), attack paths, threat propagation. Today they want graph queries on this data but can't — you cannot move a petabyte of flow logs into a graph database. So the graph question goes unasked, or gets asked on a stale, sampled export.

# lateral-movement / blast-radius query — Cypher over the live log tables
MATCH (src:Host {compromised: true})-[:CONNECTED_TO*1..4]->(reachable:Host)
WHERE reachable.segment = 'crown-jewels'
RETURN reachable.id, count(*) // what an intrusion can reach, right now
Scale is the whole point

PB of telemetry can't fit a ~1 TiB in-memory graph engine. Pushdown queries it in place, at the warehouse's scale — the only place the query can actually run.

Freshness = detection

A stale security graph misses an active intrusion. Export-then-query adds ETL lag exactly when minutes matter. We query where events land — zero ingestion lag.

No second copy of sensitive logs

Standing up a graph store means a second, separately-governed copy of your most sensitive data. Querying in place keeps one governed source under existing controls.

The shapes fit

Lateral movement, blast radius, entity resolution — bounded traversal + pattern-match + aggregate. Exactly the query shapes pushdown wins.

Not a slide — already modeled. ClickGraph ships Zeek network-security schemas out of the box: IP, Domain, ExternalIP entities over connection, DNS, and resolution logs (REQUESTED, RESOLVED_TO, ACCESS edges) — graph queries over raw security telemetry, no import step.

The wedge that's actually ours

“Zero ETL” isn't the differentiator. Zero compute is.

Query-in-place is a crowded claim — others make it too. The difference is one level deeper: other engines are zero-ETL but still deploy their own distributed graph compute engine beside your data. You run it, scale it, pay for it. We deploy nothing that executes: Cypher becomes SQL, and your warehouse does the work.

The graph queries where native engines beat SQL are precisely the queries that can't reach your data scale. Deep traversal and graph algorithms need the working graph resident in memory — so it must fit in one engine's RAM. At hundreds of TB to petabytes, it physically can't.

The scale ceiling — the analytics engines are in-memory by design

In-memory is the source of their speed and the source of their ceiling.

The two engines purpose-built for graph analytics both hold the whole graph in RAM. That's not incidental — iterative algorithms need it. It's also why they stop long before warehouse scale.

Documented capacity ceilings · vendor sources cited below
EngineArchitectureCeilingAt 100s TB – PB
Neptune Analytics
what nx-neptune imports into
Entire graph in-memory, provisioned in m-NCU (~1 GiB each) ~1 TiB
1024 m-NCU max
100–1000× short
Neo4j GDS Algorithms run entirely in heap; heap ≈ 90% of one machine's RAM Single-box RAM
estimate-and-abort
can't hold it
Neptune Database Distributed storage — but OLTP, not analytics 128 TiB
incl. indices + logs
< 1 PB, wrong shape
ClickGraph / DeltaGraph Pushdown to the warehouse — stores nothing Warehouse ceiling
PB-native
scales with the warehouse

On Neptune Analytics, even MATCH (n) RETURN count(n) can run out of memory — counting all vertices “is not memory bounded.” A system where counting your nodes can OOM is not a system for petabyte data. AWS truthfully markets it as analyzing tens of billions of connections — that's ~1 TiB of RAM. Your data is 100–1000× that. Their number is real at their scale; your scale is where their scale ends.

The honest map — it's not graph vs SQL, it's query shape

Where pushdown wins, where native graph wins.

We don't claim to be faster at everything. We claim the right tool per query shape — and that most real “graph analytics” is the top row.

SQL pushdown wins our home turf
  • Pattern match + filter + aggregate — fraud rings, recommendations, lineage, 1–3 hop. Set-oriented, vectorized, at scale.
  • Bounded traversal — known finite depth compiles to MPP-parallel joins.
  • Real-time — query where fresh data already lands (ClickHouse ingests millions of rows/sec). Zero ingestion lag, because there's no ingestion.
Native graph wins a real carve-out
  • Heavy, repeated whole-graph algorithms at small-to-mid scale — community detection (Louvain), betweenness — over a graph resident in memory, run as batch on a snapshot.
  • Unbounded deep traversal — arbitrary-depth transitive closure, at a scale that fits in memory.
  • For these, a dedicated GDS/cuGraph engine on a snapshot is often the better tool. (ClickGraph does ship PageRank and shortest-path as in-warehouse SQL — see the note below — but tight-loop iterative algorithms at small scale are where in-memory adjacency wins.)

The reframe: “graph algorithms” and “real-time” are in tension. The heavy algorithms are offline batch. The real-time graph workloads are pattern-matching + aggregation — exactly the shape pushdown wins, on data too fresh and too large to have been imported anywhere.

Traversal — we can do what they do, plus what they can't

Two strategies available. Some engines have only one.

Variable-length paths compile differently by shape. We already emit MPP-parallel join chains for exact hops; bounded ranges are a join-expansion optimization on the roadmap; unbounded traversal is a capability some SQL backends structurally lack.

Variable-length path strategy by query shape
TraversalClickGraph / DeltaGraphEngines on StarRocks-class SQL backends
Exact *N..N chained joins today MPP-parallel, no recursion Join expansion
Bounded *1..3 roadmap compile to UNION ALL of fixed-hop joins Join expansion — the only option available
Unbounded *1.. native recursive CTE on ClickHouse & Databricks not expressible in-engine

The honest boundary: recursive CTEs are row-iterative on ClickHouse — slower than vectorized scans, and best replaced by join expansion for bounded ranges (our roadmap). But unbounded arbitrary-depth traversal is something StarRocks-class backends can't express at all: StarRocks has no WITH RECURSIVE — the feature was requested and left unimplemented. We have both strategies; that class of engine has one. And unbounded transitive closure over a petabyte is expensive for everyone — which is why it belongs to a dedicated engine on a snapshot, not to any warehouse.

Openness — ask what runs on your data, and whether you can read the answer

We show our work. A black box can't.

Graph engines are usually opaque — you trust that a plan is good and that your data is handled well. We're a translator, and every query we generate is inspectable before it runs.

# Cypher in —
MATCH (a:User)-[:FOLLOWS*2..2]->(b:User) RETURN b.name
# exact SQL out (sql_only mode) — no recursion, MPP-parallel joins:
  FROM users a
  JOIN user_follows r1 ON a.user_id = r1.follower_id
  JOIN user_follows r2 ON r1.followed_id = r2.follower_id
  JOIN users b ON r2.followed_id = b.user_id

Point a skeptic at sql_only and they see exactly what will run on their ClickHouse or Databricks — the joins, the predicates, the pushdown. A closed-source engine asks you to trust a box you can't open: what its engine does, and where your data is processed. When you evaluate any graph engine, ask what it's built on and whether you're allowed to know. We're open source; the SQL is yours to read.

When not to reach for us

The honesty that makes the rest credible. Warehouse-native graph is an identity, not just an upside — you inherit the warehouse's scale and governance and its traversal-performance profile.

Use a native graph DB / GDS when

  • Heavy, repeated whole-graph algorithms at small-to-mid scale — community detection, betweenness — over a graph that fits in memory.
  • Deep OLTP traversal — 10-hop, millisecond, per-request — is the core workload.
  • Your data is small enough (GB–low TB) that in-memory adjacency is a clean win.

Reach for us when

  • Your data already lives in a warehouse or lakehouse — ClickHouse, Databricks, Iceberg, Delta — and is too large to move into a graph store.
  • The questions are pattern-matching, filtering, aggregation, bounded traversal — most real graph analytics.
  • You want one source of truth, no second datastore to sync, and graph on fresh data with zero ingestion lag.

Algorithms already run in-warehouse — and the ceiling is ours to raise. ClickGraph ships PageRank (CALL pagerank(...)) and shortest path (shortestPath / allShortestPaths) today, generated as SQL / BFS recursive CTEs over your tables. A whole family of graph algorithms is iterated JOIN + GROUP BY over a semiring — exactly what a vectorized warehouse does best — so pushing further is open road: semiring aggregate functions, keyed/settled-set recursion, and iterated-fixpoint execution can bring more of the family inside the warehouse, at a scale the in-memory engines can't reach.

Sources — every competitive claim is first-party or the vendor's own public docs

  1. Amazon Neptune — 128 TiB storage per cluster. aws.amazon.com/about-aws/whats-new/2022/02/amazon-neptune-128tib-storage-cluster
  2. Amazon Neptune Limits (cluster volume, incl. indices & logs). docs.aws.amazon.com/neptune/latest/userguide/limits.html
  3. Neptune Analytics capacity units (m-NCU ≈ 1 GiB; 32–1024 range). aws.amazon.com/about-aws/whats-new/2024/07/amazon-neptune-analytics-smaller-capacity-units
  4. Neptune Analytics Limits (unbounded vertex count / OOM). docs.aws.amazon.com/neptune-analytics/latest/userguide/analytics-limits.html
  5. Neo4j GDS — System Requirements (heap ≈ 90% RAM; CE concurrency 4). neo4j.com/docs/graph-data-science/current/installation/System-requirements/
  6. Neo4j GDS — Memory Estimation (estimate-and-abort; in-heap projection). neo4j.com/docs/graph-data-science/current/common-usage/memory-estimation/
  7. ClickHouse — recursive CTE no index pushdown per step. github.com/ClickHouse/ClickHouse/issues/75026
  8. ClickHouse — recursive CTE distributed fix. github.com/ClickHouse/ClickHouse/pull/63939
  9. StarRocks — WITH RECURSIVE feature request, unimplemented. github.com/StarRocks/starrocks/issues/34616
  10. ClickHouse — native vector similarity index (HNSW, cosine/L2). clickhouse.com/docs/engines/table-engines/mergetree-family/annindexes
  11. Databricks AI Search (Vector Search) — native, Delta-integrated, to ~1B vectors. learn.microsoft.com/azure/databricks/vector-search/vector-search

ClickGraph & DeltaGraph — read-only Cypher-to-SQL graph query engines · v0.6.8 (DeltaGraph preview). Figures current as of publication; vendor ceilings change over time — verify against the linked docs. Comparative claims describe publicly documented behavior of named technologies, not any vendor's non-public internals.

All third-party names and marks are the property of their respective owners and are used here for identification and comparison purposes only. ClickHouse is a trademark of ClickHouse, Inc. Databricks and Delta Lake are trademarks of Databricks, Inc. Amazon Neptune and AWS are trademarks of Amazon.com, Inc. or its affiliates. Neo4j, Cypher, and Bolt are trademarks of Neo4j, Inc. Apache Spark, Iceberg, Hudi, and Parquet are trademarks of the Apache Software Foundation. StarRocks, PuppyGraph, TigerGraph, and other named products are trademarks of their respective owners. ClickGraph and DeltaGraph are independent projects and are not affiliated with, sponsored by, or endorsed by any of these companies.