Skip to main content

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.

80 comparable workloads2 omissions12 groups
2.30×slower
Grafeo vs LoraDB overall
Geometric-mean slowdown across the full suite.
52/ 80
Workloads won by LoraDB
Grafeo wins 9; 19 go to a third engine.
0close calls
Within ~10% on both sides
Workloads where neither engine ran away with the row.

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 Grafeo
    LoraDB2.70× slower
    Grafeofastest
    Rows · 10·1
  • writes9 workloads · winner Grafeo
    LoraDB0.61× slower
    Grafeofastest
    Rows · 93·5·1
  • scans6 workloads · winner LoraDB
    LoraDBfastest
    Grafeo5.43× slower
    Rows · 65·0·1
  • predicates12 workloads · winner LoraDB
    LoraDBfastest
    Grafeo1.83× slower
    Rows · 128·1·3
  • strings5 workloads · winner Kuzu
    LoraDB1.22× slower
    Grafeo1.84× slower
    Rows · 50·0·5
  • numerics6 workloads · winner Kuzu
    LoraDB1.08× slower
    Grafeo1.87× slower
    Rows · 61·0·5
  • aggregates9 workloads · winner LoraDB
    LoraDBfastest
    Grafeo1.89× slower
    Rows · 98·1
  • pipeline9 workloads · winner LoraDB
    LoraDBfastest
    Grafeo1.30× slower
    Rows · 95·1·3
  • lists3 workloads · winner LoraDB
    LoraDBfastest
    Grafeo3.21× slower
    Rows · 32·0·1
  • sort3 workloads · winner LoraDB
    LoraDBfastest
    Grafeo1.60× slower
    Rows · 33·0
  • traversals14 workloads · winner LoraDB
    LoraDBfastest
    Grafeo5.88× slower
    Rows · 1414·0
  • patterns3 workloads · winner LoraDB
    LoraDBfastest
    Grafeo2.45× slower
    Rows · 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
WorkloadSizeLoraDBGrafeoWinner
construct_empty4.06 µs2.70× slower1.50 µsfastestGrafeo

writes(9)

WinnerGrafeo
WorkloadSizeLoraDBGrafeoWinner
bulk_edges200606.63 µsfastest19.86 ms32.7× slowerLoraDB
bulk_set_match1000552.39 µs1.84× slower315.88 µs1.05× slowerKuzu
delete_node1000355.70 µs1.47× slower241.43 µsfastestGrafeo
merge_create1000112.57 µs1.25× slower90.02 µsfastestGrafeo
merge_existing100023.95 µs2.89× slower8.29 µsfastestGrafeo
set_multiple_props100021.15 µsfastest182.77 µs8.64× slowerLoraDB
update_set100018.01 µsfastest208.61 µs11.6× slowerLoraDB
write_bulk10001.46 ms1.93× slower756.21 µsfastestGrafeo
write_single100014.90 µs2.20× slower6.78 µsfastestGrafeo

scans(6)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
distinct1000198.38 µsfastest246.37 µs1.24× slowerLoraDB
lookup_by_id1000716.64 nsfastest170.03 µs237× slowerLoraDB
lookup_by_id_indexed1000684.00 nsfastest22.73 µs33.2× slowerLoraDB
range_filter1000199.70 µs1.04× slower214.22 µs1.11× slowerKuzu
scan_filtered1000149.08 µsfastest211.95 µs1.42× slowerLoraDB
scan_label1000124.96 µsfastest213.71 µs1.71× slowerLoraDB

predicates(12)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
where_compound_and_or1000213.07 µsfastest646.50 µs3.03× slowerLoraDB
where_contains1000145.04 µsfastest255.53 µs1.76× slowerLoraDB
where_ends_with1000143.60 µsfastest236.22 µs1.64× slowerLoraDB
where_id_in_range1000142.71 µs2.02× slower70.55 µsfastestGrafeo
where_in_list1000162.42 µsfastest270.30 µs1.66× slowerLoraDB
where_modulo_eq1000127.32 µsfastest250.88 µs1.97× slowerLoraDB
where_not1000166.05 µs1.01× slower340.52 µs2.08× slowerKuzu
where_or1000147.16 µsfastest450.08 µs3.06× slowerLoraDB
where_starts_with1000146.91 µsfastest249.22 µs1.70× slowerLoraDB
where_string_gte1000180.97 µs1.07× slower247.34 µs1.47× slowerKuzu
where_subexpr1000227.59 µs1.69× slower589.01 µs4.37× slowerSurrealDB
where_two_props1000152.69 µsfastest404.15 µs2.65× slowerLoraDB

strings(5)

WinnerKuzu
WorkloadSizeLoraDBGrafeoWinner
string_concat1000186.55 µs1.27× slower283.23 µs1.92× slowerKuzu
string_size1000172.17 µs1.10× slower251.12 µs1.61× slowerKuzu
string_substring1000210.20 µs1.21× slower314.23 µs1.81× slowerKuzu
string_to_lower1000201.00 µs1.33× slower297.66 µs1.97× slowerKuzu
string_to_upper1000185.41 µs1.22× slower292.95 µs1.93× slowerKuzu

numerics(6)

WinnerKuzu
WorkloadSizeLoraDBGrafeoWinner
numeric_abs1000174.85 µs1.13× slower272.48 µs1.76× slowerKuzu
numeric_ceil1000171.69 µs1.10× slower269.13 µs1.73× slowerKuzu
numeric_floor1000175.48 µs1.10× slower326.82 µs2.05× slowerKuzu
numeric_modulo1000144.95 µs1.02× slower236.39 µs1.66× slowerKuzu
numeric_pow1000166.22 µs1.16× slower394.61 µs2.75× slowerKuzu
numeric_round1000180.68 µsfastest269.75 µs1.49× slowerLoraDB

aggregates(9)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
aggregate_avg100081.43 µsfastest202.26 µs2.48× slowerLoraDB
aggregate_collect100078.90 µsfastest214.58 µs2.72× slowerLoraDB
aggregate_count100059.50 µs2.77× slower21.44 µsfastestGrafeo
aggregate_count_distinct1000104.05 µsfastest213.10 µs2.05× slowerLoraDB
aggregate_max100079.97 µsfastest200.95 µs2.51× slowerLoraDB
aggregate_min100079.67 µsfastest197.17 µs2.47× slowerLoraDB
aggregate_sum100078.09 µsfastest199.65 µs2.56× slowerLoraDB
grouped_aggregation1000154.46 µsfastest269.45 µs1.74× slowerLoraDB
top_k1000186.50 µsfastest424.61 µs2.28× slowerLoraDB

pipeline(9)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
case_when1000173.33 µsfastest256.32 µs1.48× slowerLoraDB
coalesce_existing1000161.92 µsfastest260.13 µs1.61× slowerLoraDB
computed_in_return1000151.15 µs1.07× slower241.22 µs1.71× slowerKuzu
distinct_with_order1000508.01 µs2.08× slower243.88 µsfastestGrafeo
predicate_via_function1000238.39 µs1.38× slower434.70 µs2.52× slowerKuzu
with_aggregate_then_filter1000148.70 µsfastest267.49 µs1.80× slowerLoraDB
with_distinct_then_count1000202.72 µsfastest244.75 µs1.21× slowerLoraDB
with_pipeline1000186.41 µsfastest218.95 µs1.17× slowerLoraDB
with_two_chained1000313.64 µs1.41× slower388.95 µs1.75× slowerKuzu

lists(3)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
list_in_construction1000177.94 µs1.05× slower450.42 µs2.67× slowerKuzu
list_unwind_explicit10001.11 µsfastest7.11 µs6.40× slowerLoraDB
range_function100018.86 µsfastest38.62 µs2.05× slowerLoraDB

sort(3)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
order_by_id_asc1000167.95 µsfastest226.74 µs1.35× slowerLoraDB
order_by_multi_key1000211.99 µsfastest442.71 µs2.09× slowerLoraDB
skip_limit1000162.19 µsfastest233.92 µs1.44× slowerLoraDB

traversals(14)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
direct_record_traversal500831.70 nsfastest64.09 µs77.1× slowerLoraDB
recursive_depth2500968.69 nsfastest62.29 µs64.3× slowerLoraDB
recursive_depth35001.04 µsfastest62.87 µs60.5× slowerLoraDB
recursive_depth55001.16 µsfastest62.30 µs53.7× slowerLoraDB
traversal_count_one_hop50059.36 µsfastest141.39 µs2.38× slowerLoraDB
traversal_filter_one_hop500138.99 µsfastest259.07 µs1.86× slowerLoraDB
traversal_one_hop500125.98 µsfastest263.65 µs2.09× slowerLoraDB
traversal_reverse500123.67 µsfastest266.69 µs2.16× slowerLoraDB
traversal_three_hop500236.10 µsfastest556.10 µs2.36× slowerLoraDB
traversal_two_hop500165.58 µsfastest411.83 µs2.49× slowerLoraDB
traversal_undirected500213.41 µsfastest494.10 µs2.32× slowerLoraDB
variable_length_path10086.24 µsfastest210.43 µs2.44× slowerLoraDB
varlen_2_to_5100123.74 µsfastest274.33 µs2.22× slowerLoraDB
varlen_exact_510056.89 µsfastest140.52 µs2.47× slowerLoraDB

patterns(3)

WinnerLoraDB
WorkloadSizeLoraDBGrafeoWinner
star_fanout1000138.96 µsfastest321.31 µs2.31× slowerLoraDB
star_fanout_count100061.36 µsfastest193.38 µs3.15× slowerLoraDB
star_fanout_filter1000112.53 µsfastest227.60 µs2.02× slowerLoraDB

Honest omissions

Workloads Grafeo couldn’t run like-for-like.

Omissions

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_filter
    Grafeo
    • 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_clause
    Grafeo
    • 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.