<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MANIKANTA YARRAMNEEDI</title>
    <description>The latest articles on DEV Community by MANIKANTA YARRAMNEEDI (@manikanta_yarramneedi_).</description>
    <link>https://dev.to/manikanta_yarramneedi_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4087095%2F6bdde68a-8761-4bc2-9687-5a31f91c6e54.png</url>
      <title>DEV Community: MANIKANTA YARRAMNEEDI</title>
      <link>https://dev.to/manikanta_yarramneedi_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manikanta_yarramneedi_"/>
    <language>en</language>
    <item>
      <title>I gave five graph databases 256 MB of RAM and asked them the same question</title>
      <dc:creator>MANIKANTA YARRAMNEEDI</dc:creator>
      <pubDate>Thu, 20 Aug 2026 18:24:17 +0000</pubDate>
      <link>https://dev.to/manikanta_yarramneedi_/i-gave-five-graph-databases-256-mb-of-ram-and-asked-them-the-same-question-4m82</link>
      <guid>https://dev.to/manikanta_yarramneedi_/i-gave-five-graph-databases-256-mb-of-ram-and-asked-them-the-same-question-4m82</guid>
      <description>&lt;p&gt;What happens when you take a free tier literally — and why the most important&lt;br&gt;
number in my benchmark was the one that measured nothing at all.*&lt;/p&gt;



&lt;p&gt;Most database benchmarks are useless, and for a boring reason: the two systems&lt;br&gt;
weren't given the same machine.&lt;/p&gt;

&lt;p&gt;You know the shape of it. A vendor benchmarks their managed service against a&lt;br&gt;
competitor's free tier. Someone runs Postgres on a laptop against a cloud&lt;br&gt;
warehouse on 32 cores. The numbers are real, the charts are pretty, and the&lt;br&gt;
conclusion is worthless — what got measured was the hardware bill.&lt;/p&gt;

&lt;p&gt;I wanted to do the opposite. CognoDB's free tier is &lt;strong&gt;0.5 burstable vCPU, 256 MB&lt;br&gt;
RAM, 1 GB disk&lt;/strong&gt;. That's small. So rather than hand it a fight it couldn't win, I&lt;br&gt;
made that envelope the &lt;em&gt;rule&lt;/em&gt;: every database gets 0.5 vCPU and 256 MB, not a&lt;br&gt;
byte more. The four comparison engines run as containers with hard cgroup limits&lt;br&gt;
at exactly those figures.&lt;/p&gt;

&lt;p&gt;Then I asked all five the same six questions, 100 times each, three times over.&lt;/p&gt;

&lt;p&gt;The headline result is that &lt;strong&gt;one database appeared to be 600× slower than&lt;br&gt;
another, and roughly 99% of that gap was the Atlantic Ocean.&lt;/strong&gt; Getting to that&lt;br&gt;
required measuring something most benchmarks never do.&lt;/p&gt;


&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The data:&lt;/strong&gt; &lt;a href="https://snap.stanford.edu/data/cit-HepTh.html" rel="noopener noreferrer"&gt;SNAP cit-HepTh&lt;/a&gt; —&lt;br&gt;
the arXiv high-energy-physics citation network. 27,769 papers, 352,768 citations.&lt;br&gt;
Real data with real skew: a few papers are cited hundreds of times, most barely&lt;br&gt;
at all. Scale-free, which is what makes traversal interesting — hop counts&lt;br&gt;
explode unevenly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The contenders:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Engine&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CognoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed cloud, Bolt-compatible&lt;/td&gt;
&lt;td&gt;Cypher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neo4j 5.26&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JVM, native graph store, page cache&lt;/td&gt;
&lt;td&gt;Cypher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memgraph 2.22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;C++, in-memory&lt;/td&gt;
&lt;td&gt;Cypher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ArangoDB 3.11&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-model, document store + edge index&lt;/td&gt;
&lt;td&gt;AQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FalkorDB 4.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sparse matrices + GraphBLAS, inside Redis&lt;/td&gt;
&lt;td&gt;Cypher&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Picked deliberately, not for variety. Neo4j and Memgraph speak the &lt;em&gt;same&lt;br&gt;
language&lt;/em&gt; with completely different runtimes — that isolates "JVM vs. native."&lt;br&gt;
Memgraph and FalkorDB are both in-memory but store the graph in different&lt;br&gt;
&lt;em&gt;shapes&lt;/em&gt; — that isolates data structure. ArangoDB doesn't speak Cypher at all.&lt;/p&gt;

&lt;p&gt;Four Neo4j-compatible databases would have made a tidy table and taught me&lt;br&gt;
nothing.&lt;/p&gt;


&lt;h2&gt;
  
  
  The part everyone skips
&lt;/h2&gt;

&lt;p&gt;Here's the question that kept me up: &lt;strong&gt;how do I know they're answering the same&lt;br&gt;
question?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's easy to write Cypher for "count distinct nodes exactly three hops out." It's&lt;br&gt;
easy to write AQL that &lt;em&gt;looks&lt;/em&gt; equivalent. It is not easy to be sure — AQL&lt;br&gt;
traversals have uniqueness options that silently change what gets counted. Get&lt;br&gt;
that wrong and you're comparing a hard question to an easy one and calling the&lt;br&gt;
difference "performance."&lt;/p&gt;

&lt;p&gt;So every query returns a &lt;strong&gt;count&lt;/strong&gt;, and the harness sums those counts across all&lt;br&gt;
100 iterations into a fingerprint. After every database runs, it compares&lt;br&gt;
fingerprints. Divergence means the queries aren't equivalent and the run is&lt;br&gt;
flagged &lt;code&gt;MISMATCH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;They matched. Exactly, on all six workloads, across all five engines. That check&lt;br&gt;
is why I trust anything below it.&lt;/p&gt;


&lt;h2&gt;
  
  
  The number that measures nothing
&lt;/h2&gt;

&lt;p&gt;CognoDB is a managed endpoint over the internet. The other four are containers on&lt;br&gt;
loopback. That's not a difference resource caps can fix.&lt;/p&gt;

&lt;p&gt;So I measured each platform's &lt;strong&gt;floor&lt;/strong&gt;: the median round trip for &lt;code&gt;RETURN 1&lt;/code&gt;, a&lt;br&gt;
query that does no work whatsoever.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Transport floor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CognoDB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;238.08 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neo4j&lt;/td&gt;
&lt;td&gt;2.99 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ArangoDB&lt;/td&gt;
&lt;td&gt;2.28 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memgraph&lt;/td&gt;
&lt;td&gt;0.45 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FalkorDB&lt;/td&gt;
&lt;td&gt;0.27 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;238 milliseconds before CognoDB does anything at all. Memgraph answers a real&lt;br&gt;
1-hop traversal in 0.39 ms — &lt;em&gt;less than its own round trip.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Subtract the floor and the picture inverts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;p50 (ms)&lt;/th&gt;
&lt;th&gt;1-hop raw&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;1-hop net&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;3-hop raw&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;3-hop net&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CognoDB&lt;/td&gt;
&lt;td&gt;239.57&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~1.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;256.30&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~18.2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neo4j&lt;/td&gt;
&lt;td&gt;4.26&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~1.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.63&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~1.6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ArangoDB&lt;/td&gt;
&lt;td&gt;3.11&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~0.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16.50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~14.2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FalkorDB&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~0.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~0.7&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memgraph&lt;/td&gt;
&lt;td&gt;0.39&lt;/td&gt;
&lt;td&gt;&lt;em&gt;at floor&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;1.08&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~0.6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;CognoDB's engine does a 1-hop traversal in about 1.5 ms — the same order as&lt;br&gt;
Neo4j's 1.3 ms.&lt;/strong&gt; The 600× headline was almost entirely network.&lt;/p&gt;

&lt;p&gt;Both halves matter, though. If your app talks to CognoDB across the internet,&lt;br&gt;
240 ms per query is what you'll &lt;em&gt;actually&lt;/em&gt; experience — the net column describes&lt;br&gt;
the engine, the raw column describes the deployment. And subtracting one noisy&lt;br&gt;
median from another amplifies noise, which is why Memgraph's 1-hop lands &lt;em&gt;below&lt;/em&gt;&lt;br&gt;
its own floor and gets reported as "at floor" rather than as a negative number.&lt;/p&gt;


&lt;h2&gt;
  
  
  Depth is where engines diverge
&lt;/h2&gt;

&lt;p&gt;Using net figures — the only fair way to compare a remote engine with local ones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;1-hop → 3-hop&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Neo4j&lt;/td&gt;
&lt;td&gt;1.3 → 1.6 ms — flat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FalkorDB&lt;/td&gt;
&lt;td&gt;0.2 → 0.7 ms — flat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memgraph&lt;/td&gt;
&lt;td&gt;floor → 0.6 ms — flat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ArangoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.8 → 14.2 ms — &lt;strong&gt;~17×&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CognoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.5 → 18.2 ms — &lt;strong&gt;~12×&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three engines barely notice the extra hops. Two fall off a cliff — and they're&lt;br&gt;
the two whose one-hop numbers gave no warning. &lt;strong&gt;ArangoDB is faster than Neo4j at&lt;br&gt;
one hop and nine times slower at three.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For ArangoDB the mechanism is clear. Edges are documents with an index on their&lt;br&gt;
endpoints, so every hop costs an index probe &lt;em&gt;per frontier node&lt;/em&gt;. The depth-3&lt;br&gt;
frontier here is ~950 nodes — one query becomes roughly a thousand index lookups.&lt;br&gt;
Memgraph follows pointers. FalkorDB multiplies a sparse matrix, where a third hop&lt;br&gt;
is just a third multiply. Neither pays per node.&lt;/p&gt;

&lt;p&gt;For CognoDB I genuinely don't know. The profile &lt;em&gt;resembles&lt;/em&gt; index-backed&lt;br&gt;
adjacency, but the managed tier exposes no query plan and no storage internals.&lt;br&gt;
That's a hypothesis, and I'm labelling it as one rather than dressing it up.&lt;/p&gt;

&lt;p&gt;The lesson that survives every caveat: &lt;strong&gt;on a fixed small budget, adjacency&lt;br&gt;
representation dominates — and one-hop benchmarks won't reveal it.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The JVM tells on itself
&lt;/h2&gt;

&lt;p&gt;Neo4j's p95 runs &lt;strong&gt;19×&lt;/strong&gt; its p50 on 1-hop. Nobody else exceeds 7×.&lt;/p&gt;

&lt;p&gt;I didn't have to guess why. At 40 concurrent clients, Neo4j returned this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Neo.TransientError.General.MemoryPoolOutOfMemoryError:
The allocation of an extra 2.0 MiB would use more than the limit 67.2 MiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;67.2 MB is the transaction pool it derived from the 96 MB heap I gave it. Neo4j&lt;br&gt;
splits its box three ways — heap, page cache, JVM overhead — and at 256 MB all&lt;br&gt;
three starve simultaneously. Its ingest was 5,421 rels/s against Memgraph's&lt;br&gt;
42,246 on an identical load method: &lt;strong&gt;8× slower&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This doesn't say Neo4j is slow. It says Neo4j's architecture doesn't fit in&lt;br&gt;
256 MB. For a benchmark about free tiers, that's exactly what's worth knowing.&lt;/p&gt;


&lt;h2&gt;
  
  
  Scaling: five different shapes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;qps&lt;/th&gt;
&lt;th&gt;1 client&lt;/th&gt;
&lt;th&gt;10&lt;/th&gt;
&lt;th&gt;40&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memgraph&lt;/td&gt;
&lt;td&gt;2,780&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3,265&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3,262&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FalkorDB&lt;/td&gt;
&lt;td&gt;1,884&lt;/td&gt;
&lt;td&gt;1,757&lt;/td&gt;
&lt;td&gt;1,815 &lt;em&gt;(1,027 rejected)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ArangoDB&lt;/td&gt;
&lt;td&gt;268&lt;/td&gt;
&lt;td&gt;1,755&lt;/td&gt;
&lt;td&gt;1,730&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neo4j&lt;/td&gt;
&lt;td&gt;178&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;td&gt;239&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CognoDB&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;39.5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;155.5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;CognoDB scales almost perfectly linearly&lt;/strong&gt; — 39× throughput for 40× clients,&lt;br&gt;
p50 flat at ~250 ms throughout. That's the signature of a latency-bound system&lt;br&gt;
with headroom to spare: every client spends its time waiting on the network, so&lt;br&gt;
more clients cost almost nothing. Its 4 qps at one client isn't a capacity&lt;br&gt;
ceiling, it's one query per round trip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FalkorDB starts at its ceiling&lt;/strong&gt; and gains nothing, because Redis runs commands&lt;br&gt;
on one thread. At 40 clients it rejected 1,027 queries with &lt;code&gt;Max pending queries&lt;br&gt;
exceeded&lt;/code&gt; — backpressure, not a crash. It sheds load rather than degrading for&lt;br&gt;
everyone, which is a defensible design choice and makes that cell mean&lt;br&gt;
"throughput while shedding."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neo4j doesn't scale at all&lt;/strong&gt;: 178 → 182 qps from 1 to 10 clients.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I got wrong
&lt;/h2&gt;

&lt;p&gt;Four things, all in the commit history, because I'd rather show the scar tissue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The benchmark loaded nothing and reported success.&lt;/strong&gt; CognoDB claimed 24,000&lt;br&gt;
rels/sec and stored &lt;strong&gt;zero relationships&lt;/strong&gt;. Nodes landed, edges didn't, nothing&lt;br&gt;
raised an error. The edge load matches endpoints by an indexed property — and&lt;br&gt;
while that index is still populating, the MATCH returns zero rows &lt;em&gt;and no&lt;br&gt;
error&lt;/em&gt;, so every CREATE was silently skipped. The procedure that should have&lt;br&gt;
prevented this, &lt;code&gt;db.awaitIndexes&lt;/code&gt;, doesn't exist on CognoDB; my code caught that&lt;br&gt;
failure and slept two seconds instead, which is a guess, not a guarantee.&lt;/p&gt;

&lt;p&gt;Only the load-verification step caught it. &lt;strong&gt;A benchmark that timed queries&lt;br&gt;
without checking what was stored would have published traversal latencies for an&lt;br&gt;
empty graph — and they'd have looked fantastic.&lt;/strong&gt; That's the one that scares me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My reset procedure killed Neo4j.&lt;/strong&gt; Mid-run, it started refusing connections:&lt;br&gt;
container up, JVM dead, &lt;code&gt;OutOfMemoryError&lt;/code&gt; on every scheduler thread. My teardown&lt;br&gt;
used &lt;code&gt;DETACH DELETE&lt;/code&gt; in 10,000-node batches, which pulls each node's&lt;br&gt;
relationships into the same transaction. Against a 96 MB heap, fatal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The harness could hang forever.&lt;/strong&gt; A run stalled during FalkorDB's 40-client&lt;br&gt;
sweep and just sat there. No driver had a query timeout, so a worker blocked on a&lt;br&gt;
response that never came waited indefinitely. A harness that can hang is worse&lt;br&gt;
than one that records a timeout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I measured my own floor wrong.&lt;/strong&gt; First time round, the transport baseline came&lt;br&gt;
out &lt;em&gt;higher&lt;/em&gt; than Memgraph's 1-hop latency — 158% of a number it's supposed to&lt;br&gt;
sit underneath. I'd measured the baseline cold and compared it against warm&lt;br&gt;
percentiles. A floor that exceeds what it floors is a bug in the ruler.&lt;/p&gt;


&lt;h2&gt;
  
  
  What this can't tell you
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Variance is large — larger than several differences in these tables.&lt;/strong&gt; Worst&lt;br&gt;
run-to-run spread hit 100.7%. Between two full runs, ArangoDB's ingest moved 54%&lt;br&gt;
and its 3-hop p50 moved 3×. &lt;strong&gt;Anything under about 2× here isn't a finding&lt;/strong&gt;, and&lt;br&gt;
I've said so where it isn't. The 8× ingest gap and the ~17× depth degradation&lt;br&gt;
clear that bar; plenty else doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One dataset, one shape.&lt;/strong&gt; cit-HepTh is sparse and scale-free. A dense social&lt;br&gt;
graph could reorder all of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same answers ≠ same plans.&lt;/strong&gt; The parity check proves identical results, not&lt;br&gt;
comparable execution strategies. Confirming that means reading five query&lt;br&gt;
planners.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The remote/local split is estimated, not eliminated.&lt;/strong&gt; Subtracting a transport&lt;br&gt;
floor assumes transport and query cost are independent and additive —&lt;br&gt;
approximately true, not exactly. The clean experiment benchmarks all five as&lt;br&gt;
managed endpoints from one region. The harness supports it; I didn't run it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Run it yourself
&lt;/h2&gt;

&lt;p&gt;No number in the README was typed by hand — they're injected from &lt;code&gt;results.json&lt;/code&gt;&lt;br&gt;
by the report generator, specifically so they can't drift from what was measured.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Maniprogramer/cognodb-graph-benchmark.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cognodb-graph-benchmark
make all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That builds a venv, starts four capped containers, downloads and canonicalises&lt;br&gt;
the dataset, runs the suite, and writes the tables and charts. Add CognoDB&lt;br&gt;
credentials to &lt;code&gt;.env&lt;/code&gt; for the fifth.&lt;/p&gt;

&lt;p&gt;If you disagree with a methodology choice — my warm-up, my start-node selection,&lt;br&gt;
my read/write mix — the harness is small and the knobs are on the command line.&lt;br&gt;
I'd rather be corrected with a pull request than agreed with quietly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Repo: &lt;a href="https://github.com/Maniprogramer/cognodb-graph-benchmark" rel="noopener noreferrer"&gt;github.com/Maniprogramer/cognodb-graph-benchmark&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>database</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
