Benchmarks

Graph, vector, geospatial, and ingestion results with workload sizes, query checks, and downloadable records.

Broad Cypher queries

LSQB SF1 · 1,196 queries · 20 families · 10-second deadline.

Five engines ran the complete frozen corpus on an isolated AWS c7i.8xlarge. The graph contains 3,955,790 nodes and 22,196,676 relationships. SurrealDB did not finish the prerequisite warmup, so its full-corpus results are unavailable.

EngineCompletedTimeoutsResource limitsOther failuresSource matchesSource mismatches
ShrikeDB1,045 / 1,1961331803290
Neo4j820 / 1,1963611502090
Memgraph624 / 1,196572001610
FalkorDB603 / 1,196593009576
ArangoDB286 / 1,19691000550

Completion includes client request time and full result decoding. Independent typed-source references cover 334 frozen queries; references without a completed result remain unresolved. FalkorDB differs on 1,087 of 1,196 small-graph query shapes; its completion count is displayed for coverage, while those shapes are excluded from validated latency comparisons.

Completion by query family
FamilyQueriesShrikeDBNeo4jMemgraphFalkorDBArangoDB
anti join6156 / 6152 / 6141 / 6141 / 6117 / 61
chain 26161 / 6153 / 6146 / 6148 / 6119 / 61
chain 38282 / 8266 / 8252 / 8252 / 8220 / 82
chain 48281 / 8259 / 8240 / 8242 / 8214 / 82
chain 57269 / 7234 / 7225 / 7217 / 7211 / 72
chain 66148 / 6124 / 6110 / 618 / 613 / 61
chain 85138 / 5121 / 5110 / 511 / 516 / 51
chain inequality7243 / 7244 / 7237 / 7234 / 7226 / 72
cycle 34141 / 4138 / 4127 / 4128 / 417 / 41
cycle 44140 / 4137 / 4125 / 4125 / 4116 / 41
cycle 53126 / 3126 / 3113 / 3114 / 318 / 31
distinct6150 / 6144 / 6133 / 6130 / 6115 / 61
grouping6159 / 6142 / 6131 / 6134 / 6113 / 61
multi match8259 / 8247 / 8234 / 8232 / 8220 / 82
optional match6132 / 6136 / 6127 / 6127 / 6110 / 61
property predicate7270 / 7258 / 7256 / 7256 / 7224 / 72
star 36161 / 6150 / 6144 / 6146 / 6120 / 61
star 45151 / 5121 / 5117 / 5117 / 516 / 51
star 54139 / 4119 / 4118 / 4114 / 416 / 41
varlen5139 / 5149 / 5138 / 5137 / 5125 / 51

Download the Cypher measurement record ↗ · Download raw trial records ↗

Query correctness across six engines

1,196 frozen query shapes · independent exhaustive counts on a small graph.

Each engine evaluated the same query shapes against four nodes and eight distinct directed edges. The table counts matching answers, mismatches, and unsupported forms on that fixture.

EngineMatchedMismatchedUnsupported
ShrikeDB1,196 / 1,196 admitted00
Neo4j1,196 / 1,196 admitted00
Memgraph1,196 / 1,196 admitted00
ArangoDB1,196 / 1,196 admitted00
SurrealDB1,051 / 1,051 admitted0145
FalkorDB109 / 1,196 admitted1,0870

ArangoDB and SurrealDB use frozen translations of the Cypher query shapes into their native query languages. Engine-specific admission is recorded with each result.

Download the correctness record ↗

Live graph ingestion

1,066,492 BTS flights · concurrent Cypher reads.

The transport graph grew to 1,066,826 nodes and 2,138,741 relationships across 334 airports. Two full loads used fresh databases on an AWS c7i.8xlarge. Each write request carried up to 600 flights while count queries ran against committed data.

TrialFlights/sLoad timeWrite ack median / p95JFK count median / p95
114,053.675.89 s38.37 / 60.31 ms10.09 / 24.57 ms
214,396.674.08 s37.49 / 58.56 ms10.04 / 23.57 ms

Load time covers the first batch through the last durability acknowledgment; source parsing and server startup precede the timer. Both runs matched independent BTS source checks and passed restart recovery. The record includes route, itinerary, and two-hop read latencies.

Vector insert to first query

250,000 real SIFT descriptors · 128 dimensions · three fresh paired loads · AWS c7i.8xlarge.

Elapsed time from the first insert request until a correct top-10 search result from the newly loaded data. Median of three runs per engine; lower is faster.

Both engines loaded the same 250,000 vectors in 256-row requests with eight loopback clients on the same host. Request preparation and database setup preceded the timer. Milvus 3.0.2 used FLAT indexing; its flush, index creation, and load are included. ShrikeDB used its opt-in append-only path with exact search. Each timed first query matched an independent exhaustive FP64 reference; 32 held-out queries also matched before and after restart in every trial.

Vector ingestion

Durability-acknowledged 768-dimensional FP32 vectors · eight gRPC clients.

Across three fresh 32,768-vector loads, the median acknowledged rate was 48,866.9 vectors/s. Each request contained 256 vectors.

TrialAcknowledged vectors/s
148,866.9
249,435.2
348,429.4

A separate 8,192-vector sample from real arXiv embeddings reached 43,344.7 acknowledged vectors/s. Exact top-10 lookup matched independent exhaustive references on 32 held-out queries, including checks after restart. A 4,096-vector request-size trial reached 61,464.6 vectors/s.

The append-only path serves newly acknowledged rows with exact FP32 lookup. Timings include bulk RPCs and durability acknowledgments; client vector preparation is outside the interval.

One million 768-dimensional embeddings

Real arXiv semantic embeddings · 4,096 confirmation queries · top 10.

ShrikeDB UVI searched the loaded index through its packed vector RPC. The same indexed vectors were also queried through typed Cypher. Milvus 3.0.2 used an independently selected HNSW setting. Eight clients queried each engine on an AWS c7i.8xlarge with a 24 GiB server memory limit.

Engine and APIQPSp95 latencyAggregate IDRecall@10
ShrikeDB UVI · packed RPC440.119.659 ms0.999682617
Milvus · HNSW M32 / ef512476.323.026 ms0.999511719
ShrikeDB UVI · typed Cypher426.820.244 ms0.999682617

Packed RPC and Milvus values are medians of five sequential paired runs. The Cypher value is one run. Timings include client, transport, and server work in loaded, warm state.

Geospatial and temporal queries

Place, time, recurrence, entity history, and multi-place conjunctions.

Find activity in the same place across dates

Search a region during a recurring UTC hour, with an optional absolute date range. In the 10-million-observation comparison, ShrikeDB answered these queries in 2.237 ms median; PostGIS took 30.058 ms.

Find a return visit

Match observations from two separate time windows in the same region, then connect them by entity. The recorded Cypher and SPARQL queries returned 375 exact observation pairs.

Match activity across places

Find entities observed in one region on Saturday nights and another region on Monday mornings during the same four-week period. Both query languages found 125 matching entities in the measured trajectory workload.

Ten million observations: ShrikeDB and PostGIS

82 exact count predicates · 5 measured repetitions each · AWS c7i.8xlarge. Every predicate returned the same count in both engines.

ShrikeDBPostGIS

Median query latency in milliseconds · common linear scale

Recurring hour + region2.237 / 30.058 ms
Region + time0.418 / 12.389 ms
Region2.428 / 29.874 ms
Query familyPredicatesShrikeDB medianPostGIS medianLatency ratio
Recurring hour in a region162.237 ms30.058 ms13.44×
Region and date range160.418 ms12.389 ms29.64×
Region across dates162.428 ms29.874 ms12.30×
Time range161.208 ms0.569 ms0.47×
Entity history161.091 ms0.439 ms0.40×
Empty region control11.577 ms5.304 ms3.36×
Full-period control162.559 ms111.519 ms1.78×

Latency ratio = PostGIS median / ShrikeDB median. Values below 1 favor PostGIS. Both engines ran native count queries; network and result serialization are outside this comparison.

Same-region revisit through Cypher and SPARQL

Two disjoint ten-minute windows in the same region of the 100,000-observation AIS fixture. The query connects observations by entity and returns 375 pairs, checked against an independent scan of the source observations. Each language has five warmups and 50 measured loopback gRPC requests.

Query languageMedian requestp95 requestMeasured requests
Cypher5.757 ms6.035 ms50
SPARQL3.547 ms3.926 ms50

See the return-visit query →

Multi-place weekly conjunction

In a workload of 50,000 observations from 500 entities, one predicate selects Saturday 22:00–24:00 UTC in the first region and another selects Monday 08:00–10:00 UTC in the second. The query joins both matches by entity and returns 125 entities. An independent source scan found the same answer. Five warmups and 30 shuffled measured requests per language ran over loopback gRPC on AWS c7i.8xlarge.

Query languageMedian requestp95 requestMeasured requests
Cypher5.697 ms6.331 ms30
SPARQL5.903 ms6.320 ms30

The conjunction fixture uses generated trajectories; the ten-million-observation comparison above uses real AIS data. Request timings include query processing and gRPC transport.

See the Cypher and SPARQL queries →

100,000-observation point lookups

Ten ingested batches · warm resident count queries · AWS c7i.8xlarge.

ShrikeDBPostGIS

Median latency in microseconds · common linear scale

One-minute window110 / 366 µs
Entity + time range51.5 / 417 µs

The point-lookup figures are resident query timings. PostGIS includes planning and execution; the ShrikeDB figure measures the lookup against an already selected index. Both returned the expected counts.