vs Grafeo
LoraDB vs Grafeo
LoraDB leads by 2.30× overall. Grafeo is an in-process Rust property-graph crate. Numbers from the same suite as the overview — identical fixtures, identical seed, identical iteration count.
Overall
LoraDB sets the row; Grafeo sits at 2.30× slower.
Geometric-mean slowdown across every workload both engines run. Empty rows happen when the language can’t express the workload — they’re called out below, not hidden.
Per group
Wins by group.
For each group, the workload count, who wins it, and how the per-row tally breaks down between LoraDB, Grafeo, and any third engine that took a row.
- setup1 workload · winner GrafeoLoraDB2.70× slowerGrafeofastestRows · 10·1
- writes9 workloads · winner GrafeoLoraDB0.61× slowerGrafeofastestRows · 93·5·1
- scans6 workloads · winner LoraDBLoraDBfastestGrafeo5.43× slowerRows · 65·0·1
- predicates12 workloads · winner LoraDBLoraDBfastestGrafeo1.83× slowerRows · 128·1·3
- strings5 workloads · winner KuzuLoraDB1.22× slowerGrafeo1.84× slowerRows · 50·0·5
- numerics6 workloads · winner KuzuLoraDB1.08× slowerGrafeo1.87× slowerRows · 61·0·5
- aggregates9 workloads · winner LoraDBLoraDBfastestGrafeo1.89× slowerRows · 98·1
- pipeline9 workloads · winner LoraDBLoraDBfastestGrafeo1.30× slowerRows · 95·1·3
- lists3 workloads · winner LoraDBLoraDBfastestGrafeo3.21× slowerRows · 32·0·1
- sort3 workloads · winner LoraDBLoraDBfastestGrafeo1.60× slowerRows · 33·0
- traversals14 workloads · winner LoraDBLoraDBfastestGrafeo5.88× slowerRows · 1414·0
- patterns3 workloads · winner LoraDBLoraDBfastestGrafeo2.45× slowerRows · 33·0
Per workload
Raw timings, workload by workload.
Two columns — LoraDB and Grafeo — across every workload they share. Rows with no comparable Grafeorun are hidden here; they’re listed in the omissions block at the bottom.
setup(1)
WinnerGrafeo| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| construct_empty | — | 4.06 µs2.70× slower | 1.50 µsfastest | Grafeo |
writes(9)
WinnerGrafeo| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| bulk_edges | 200 | 606.63 µsfastest | 19.86 ms32.7× slower | LoraDB |
| bulk_set_match | 1000 | 552.39 µs1.84× slower | 315.88 µs1.05× slower | Kuzu |
| delete_node | 1000 | 355.70 µs1.47× slower | 241.43 µsfastest | Grafeo |
| merge_create | 1000 | 112.57 µs1.25× slower | 90.02 µsfastest | Grafeo |
| merge_existing | 1000 | 23.95 µs2.89× slower | 8.29 µsfastest | Grafeo |
| set_multiple_props | 1000 | 21.15 µsfastest | 182.77 µs8.64× slower | LoraDB |
| update_set | 1000 | 18.01 µsfastest | 208.61 µs11.6× slower | LoraDB |
| write_bulk | 1000 | 1.46 ms1.93× slower | 756.21 µsfastest | Grafeo |
| write_single | 1000 | 14.90 µs2.20× slower | 6.78 µsfastest | Grafeo |
scans(6)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| distinct | 1000 | 198.38 µsfastest | 246.37 µs1.24× slower | LoraDB |
| lookup_by_id | 1000 | 716.64 nsfastest | 170.03 µs237× slower | LoraDB |
| lookup_by_id_indexed | 1000 | 684.00 nsfastest | 22.73 µs33.2× slower | LoraDB |
| range_filter | 1000 | 199.70 µs1.04× slower | 214.22 µs1.11× slower | Kuzu |
| scan_filtered | 1000 | 149.08 µsfastest | 211.95 µs1.42× slower | LoraDB |
| scan_label | 1000 | 124.96 µsfastest | 213.71 µs1.71× slower | LoraDB |
predicates(12)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| where_compound_and_or | 1000 | 213.07 µsfastest | 646.50 µs3.03× slower | LoraDB |
| where_contains | 1000 | 145.04 µsfastest | 255.53 µs1.76× slower | LoraDB |
| where_ends_with | 1000 | 143.60 µsfastest | 236.22 µs1.64× slower | LoraDB |
| where_id_in_range | 1000 | 142.71 µs2.02× slower | 70.55 µsfastest | Grafeo |
| where_in_list | 1000 | 162.42 µsfastest | 270.30 µs1.66× slower | LoraDB |
| where_modulo_eq | 1000 | 127.32 µsfastest | 250.88 µs1.97× slower | LoraDB |
| where_not | 1000 | 166.05 µs1.01× slower | 340.52 µs2.08× slower | Kuzu |
| where_or | 1000 | 147.16 µsfastest | 450.08 µs3.06× slower | LoraDB |
| where_starts_with | 1000 | 146.91 µsfastest | 249.22 µs1.70× slower | LoraDB |
| where_string_gte | 1000 | 180.97 µs1.07× slower | 247.34 µs1.47× slower | Kuzu |
| where_subexpr | 1000 | 227.59 µs1.69× slower | 589.01 µs4.37× slower | SurrealDB |
| where_two_props | 1000 | 152.69 µsfastest | 404.15 µs2.65× slower | LoraDB |
strings(5)
WinnerKuzu| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| string_concat | 1000 | 186.55 µs1.27× slower | 283.23 µs1.92× slower | Kuzu |
| string_size | 1000 | 172.17 µs1.10× slower | 251.12 µs1.61× slower | Kuzu |
| string_substring | 1000 | 210.20 µs1.21× slower | 314.23 µs1.81× slower | Kuzu |
| string_to_lower | 1000 | 201.00 µs1.33× slower | 297.66 µs1.97× slower | Kuzu |
| string_to_upper | 1000 | 185.41 µs1.22× slower | 292.95 µs1.93× slower | Kuzu |
numerics(6)
WinnerKuzu| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| numeric_abs | 1000 | 174.85 µs1.13× slower | 272.48 µs1.76× slower | Kuzu |
| numeric_ceil | 1000 | 171.69 µs1.10× slower | 269.13 µs1.73× slower | Kuzu |
| numeric_floor | 1000 | 175.48 µs1.10× slower | 326.82 µs2.05× slower | Kuzu |
| numeric_modulo | 1000 | 144.95 µs1.02× slower | 236.39 µs1.66× slower | Kuzu |
| numeric_pow | 1000 | 166.22 µs1.16× slower | 394.61 µs2.75× slower | Kuzu |
| numeric_round | 1000 | 180.68 µsfastest | 269.75 µs1.49× slower | LoraDB |
aggregates(9)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| aggregate_avg | 1000 | 81.43 µsfastest | 202.26 µs2.48× slower | LoraDB |
| aggregate_collect | 1000 | 78.90 µsfastest | 214.58 µs2.72× slower | LoraDB |
| aggregate_count | 1000 | 59.50 µs2.77× slower | 21.44 µsfastest | Grafeo |
| aggregate_count_distinct | 1000 | 104.05 µsfastest | 213.10 µs2.05× slower | LoraDB |
| aggregate_max | 1000 | 79.97 µsfastest | 200.95 µs2.51× slower | LoraDB |
| aggregate_min | 1000 | 79.67 µsfastest | 197.17 µs2.47× slower | LoraDB |
| aggregate_sum | 1000 | 78.09 µsfastest | 199.65 µs2.56× slower | LoraDB |
| grouped_aggregation | 1000 | 154.46 µsfastest | 269.45 µs1.74× slower | LoraDB |
| top_k | 1000 | 186.50 µsfastest | 424.61 µs2.28× slower | LoraDB |
pipeline(9)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| case_when | 1000 | 173.33 µsfastest | 256.32 µs1.48× slower | LoraDB |
| coalesce_existing | 1000 | 161.92 µsfastest | 260.13 µs1.61× slower | LoraDB |
| computed_in_return | 1000 | 151.15 µs1.07× slower | 241.22 µs1.71× slower | Kuzu |
| distinct_with_order | 1000 | 508.01 µs2.08× slower | 243.88 µsfastest | Grafeo |
| predicate_via_function | 1000 | 238.39 µs1.38× slower | 434.70 µs2.52× slower | Kuzu |
| with_aggregate_then_filter | 1000 | 148.70 µsfastest | 267.49 µs1.80× slower | LoraDB |
| with_distinct_then_count | 1000 | 202.72 µsfastest | 244.75 µs1.21× slower | LoraDB |
| with_pipeline | 1000 | 186.41 µsfastest | 218.95 µs1.17× slower | LoraDB |
| with_two_chained | 1000 | 313.64 µs1.41× slower | 388.95 µs1.75× slower | Kuzu |
lists(3)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| list_in_construction | 1000 | 177.94 µs1.05× slower | 450.42 µs2.67× slower | Kuzu |
| list_unwind_explicit | 1000 | 1.11 µsfastest | 7.11 µs6.40× slower | LoraDB |
| range_function | 1000 | 18.86 µsfastest | 38.62 µs2.05× slower | LoraDB |
sort(3)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| order_by_id_asc | 1000 | 167.95 µsfastest | 226.74 µs1.35× slower | LoraDB |
| order_by_multi_key | 1000 | 211.99 µsfastest | 442.71 µs2.09× slower | LoraDB |
| skip_limit | 1000 | 162.19 µsfastest | 233.92 µs1.44× slower | LoraDB |
traversals(14)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| direct_record_traversal | 500 | 831.70 nsfastest | 64.09 µs77.1× slower | LoraDB |
| recursive_depth2 | 500 | 968.69 nsfastest | 62.29 µs64.3× slower | LoraDB |
| recursive_depth3 | 500 | 1.04 µsfastest | 62.87 µs60.5× slower | LoraDB |
| recursive_depth5 | 500 | 1.16 µsfastest | 62.30 µs53.7× slower | LoraDB |
| traversal_count_one_hop | 500 | 59.36 µsfastest | 141.39 µs2.38× slower | LoraDB |
| traversal_filter_one_hop | 500 | 138.99 µsfastest | 259.07 µs1.86× slower | LoraDB |
| traversal_one_hop | 500 | 125.98 µsfastest | 263.65 µs2.09× slower | LoraDB |
| traversal_reverse | 500 | 123.67 µsfastest | 266.69 µs2.16× slower | LoraDB |
| traversal_three_hop | 500 | 236.10 µsfastest | 556.10 µs2.36× slower | LoraDB |
| traversal_two_hop | 500 | 165.58 µsfastest | 411.83 µs2.49× slower | LoraDB |
| traversal_undirected | 500 | 213.41 µsfastest | 494.10 µs2.32× slower | LoraDB |
| variable_length_path | 100 | 86.24 µsfastest | 210.43 µs2.44× slower | LoraDB |
| varlen_2_to_5 | 100 | 123.74 µsfastest | 274.33 µs2.22× slower | LoraDB |
| varlen_exact_5 | 100 | 56.89 µsfastest | 140.52 µs2.47× slower | LoraDB |
patterns(3)
WinnerLoraDB| Workload | Size | LoraDB | Grafeo | Winner |
|---|---|---|---|---|
| star_fanout | 1000 | 138.96 µsfastest | 321.31 µs2.31× slower | LoraDB |
| star_fanout_count | 1000 | 61.36 µsfastest | 193.38 µs3.15× slower | LoraDB |
| star_fanout_filter | 1000 | 112.53 µsfastest | 227.60 µs2.02× slower | LoraDB |
Honest omissions
Workloads Grafeo couldn’t run like-for-like.
Workloads omitted only where the engine has no like-for-like equivalent — a missing scalar function, a different MERGE semantics, a reserved word. The reason is recorded with the workload, not silently dropped.
relation_filterGrafeo- grafeo's `create_edge` facade takes no edge properties, so the chain fixture has no `step` to filter on. memgraph/neo4j/kuzu seed `step` directly, so they do run this workload.
edge_subquery_clauseGrafeo- grafeo's `create_edge` facade takes no edge properties, so the social fixture has no `strength` to filter on. memgraph/neo4j/kuzu seed `strength` directly, so they do run this workload.