Skip to content

v0.5.1

Latest

Choose a tag to compare

@prrao87 prrao87 released this 31 Oct 17:04
6145cf5

What's Changed

No breaking changes, and no query returns different rows.

Planner:

  • #97: MATCH (a)-[r1]->(b)-[r2]->(c) [WHERE ...] RETURN count(*) is counted from per-node degrees instead of building every path, when each WHERE condition reads only one hop's variables and the hops fan out enough to make it worthwhile. On graph-benchmark (100K Person, 2.4M FOLLOWS), q8 drops from 120 to 20 ms and q9 from 92 to 19 ms. The counts match path expansion exactly, including self-loops.
  • #101: grouping by a node, as in WITH forum, collect(friend), groups by the node's id when its label has an in-memory node index, and looks the node's other properties up afterwards, once per node, instead of carrying them through the aggregate for every row. In memory mode, IC3 drops from 53.4 to 25.4 ms (-52%), IC7 from 16.2 to 14.4 ms (-11%) and IC5 from 85.1 to 78.9 ms. explain() shows the lookup as NodeLookupExec. Lance node tables read lazily keep the previous plan.

CSR:

  • #98: optimize_csr() (Python and Rust) folds a CSR's accumulated delta into a new base at the pinned version, the counterpart of Lance's optimize_indices(). refresh() still applies changes as a delta and rebuilds on its own past 25% of the base. The CSR guide explains when to use which.
  • #100: filters on an in-memory relationship's columns (WHERE membership.joinDate > $minDate) run per chunk in every partition, instead of one partition building a mask while the others wait. IC5 in memory mode drops from 97.1 to 89.1 ms on its own.

IC5, slower in memory mode since 0.5.0's #87 (#92), is back to 0.4.0's time: 78.9 ms against 0.4.0's 79.8 ms (0.5.0: 97.1 ms). In lazy mode it's about 110 ms, against 104.0 ms in 0.4.0 and 116.4 ms in 0.5.0.

Known trade-offs: none new. Two follow-ups are open: #99 (looking up grouped nodes' properties for Lance node tables) and #102 (large named hops that return relationship columns from Lance, an experiment parked there).

Other: RELEASE.md documents the release process, and CI skips the test workflows on main pushes that don't touch code.

Benchmarks: measured PR by PR against main with the harness in CONTRIBUTING.md, both suites, both modes, on an Apple M5; every query's answer matched. Each PR lists every query.

PRs

  • perf(planner): count two-hop paths from per-node degrees by @prrao87 in #97
  • feat(csr): fold the delta into a new base with optimize_csr() by @prrao87 in #98
  • perf(csr): filter in-memory relationship columns per chunk by @prrao87 in #100
  • perf(planner): look up a grouped node's columns after grouping by id by @prrao87 in #101
  • chore: bump version 0.5.0 → 0.5.1 by @prrao87 in #103

Full Changelog: v0.5.0...v0.5.1