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.
| Engine | Completed | Timeouts | Resource limits | Other failures | Source matches | Source mismatches |
|---|---|---|---|---|---|---|
| ShrikeDB | 1,045 / 1,196 | 133 | 18 | 0 | 329 | 0 |
| Neo4j | 820 / 1,196 | 361 | 15 | 0 | 209 | 0 |
| Memgraph | 624 / 1,196 | 572 | 0 | 0 | 161 | 0 |
| FalkorDB | 603 / 1,196 | 593 | 0 | 0 | 95 | 76 |
| ArangoDB | 286 / 1,196 | 910 | 0 | 0 | 55 | 0 |
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
| Family | Queries | ShrikeDB | Neo4j | Memgraph | FalkorDB | ArangoDB |
|---|---|---|---|---|---|---|
| anti join | 61 | 56 / 61 | 52 / 61 | 41 / 61 | 41 / 61 | 17 / 61 |
| chain 2 | 61 | 61 / 61 | 53 / 61 | 46 / 61 | 48 / 61 | 19 / 61 |
| chain 3 | 82 | 82 / 82 | 66 / 82 | 52 / 82 | 52 / 82 | 20 / 82 |
| chain 4 | 82 | 81 / 82 | 59 / 82 | 40 / 82 | 42 / 82 | 14 / 82 |
| chain 5 | 72 | 69 / 72 | 34 / 72 | 25 / 72 | 17 / 72 | 11 / 72 |
| chain 6 | 61 | 48 / 61 | 24 / 61 | 10 / 61 | 8 / 61 | 3 / 61 |
| chain 8 | 51 | 38 / 51 | 21 / 51 | 10 / 51 | 1 / 51 | 6 / 51 |
| chain inequality | 72 | 43 / 72 | 44 / 72 | 37 / 72 | 34 / 72 | 26 / 72 |
| cycle 3 | 41 | 41 / 41 | 38 / 41 | 27 / 41 | 28 / 41 | 7 / 41 |
| cycle 4 | 41 | 40 / 41 | 37 / 41 | 25 / 41 | 25 / 41 | 16 / 41 |
| cycle 5 | 31 | 26 / 31 | 26 / 31 | 13 / 31 | 14 / 31 | 8 / 31 |
| distinct | 61 | 50 / 61 | 44 / 61 | 33 / 61 | 30 / 61 | 15 / 61 |
| grouping | 61 | 59 / 61 | 42 / 61 | 31 / 61 | 34 / 61 | 13 / 61 |
| multi match | 82 | 59 / 82 | 47 / 82 | 34 / 82 | 32 / 82 | 20 / 82 |
| optional match | 61 | 32 / 61 | 36 / 61 | 27 / 61 | 27 / 61 | 10 / 61 |
| property predicate | 72 | 70 / 72 | 58 / 72 | 56 / 72 | 56 / 72 | 24 / 72 |
| star 3 | 61 | 61 / 61 | 50 / 61 | 44 / 61 | 46 / 61 | 20 / 61 |
| star 4 | 51 | 51 / 51 | 21 / 51 | 17 / 51 | 17 / 51 | 6 / 51 |
| star 5 | 41 | 39 / 41 | 19 / 41 | 18 / 41 | 14 / 41 | 6 / 41 |
| varlen | 51 | 39 / 51 | 49 / 51 | 38 / 51 | 37 / 51 | 25 / 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.
| Engine | Matched | Mismatched | Unsupported |
|---|---|---|---|
| ShrikeDB | 1,196 / 1,196 admitted | 0 | 0 |
| Neo4j | 1,196 / 1,196 admitted | 0 | 0 |
| Memgraph | 1,196 / 1,196 admitted | 0 | 0 |
| ArangoDB | 1,196 / 1,196 admitted | 0 | 0 |
| SurrealDB | 1,051 / 1,051 admitted | 0 | 145 |
| FalkorDB | 109 / 1,196 admitted | 1,087 | 0 |
ArangoDB and SurrealDB use frozen translations of the Cypher query shapes into their native query languages. Engine-specific admission is recorded with each result.
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.
| Trial | Flights/s | Load time | Write ack median / p95 | JFK count median / p95 |
|---|---|---|---|---|
| 1 | 14,053.6 | 75.89 s | 38.37 / 60.31 ms | 10.09 / 24.57 ms |
| 2 | 14,396.6 | 74.08 s | 37.49 / 58.56 ms | 10.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.
| Trial | Acknowledged vectors/s |
|---|---|
| 1 | 48,866.9 |
| 2 | 49,435.2 |
| 3 | 48,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 API | QPS | p95 latency | Aggregate IDRecall@10 |
|---|---|---|---|
| ShrikeDB UVI · packed RPC | 440.1 | 19.659 ms | 0.999682617 |
| Milvus · HNSW M32 / ef512 | 476.3 | 23.026 ms | 0.999511719 |
| ShrikeDB UVI · typed Cypher | 426.8 | 20.244 ms | 0.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.
Median query latency in milliseconds · common linear scale
| Query family | Predicates | ShrikeDB median | PostGIS median | Latency ratio |
|---|---|---|---|---|
| Recurring hour in a region | 16 | 2.237 ms | 30.058 ms | 13.44× |
| Region and date range | 16 | 0.418 ms | 12.389 ms | 29.64× |
| Region across dates | 16 | 2.428 ms | 29.874 ms | 12.30× |
| Time range | 16 | 1.208 ms | 0.569 ms | 0.47× |
| Entity history | 16 | 1.091 ms | 0.439 ms | 0.40× |
| Empty region control | 1 | 1.577 ms | 5.304 ms | 3.36× |
| Full-period control | 1 | 62.559 ms | 111.519 ms | 1.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 language | Median request | p95 request | Measured requests |
|---|---|---|---|
| Cypher | 5.757 ms | 6.035 ms | 50 |
| SPARQL | 3.547 ms | 3.926 ms | 50 |
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 language | Median request | p95 request | Measured requests |
|---|---|---|---|
| Cypher | 5.697 ms | 6.331 ms | 30 |
| SPARQL | 5.903 ms | 6.320 ms | 30 |
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.
Median latency in microseconds · common linear scale
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.