Repository navigation
chore: release lance-csr 0.2.0 - #6
Merged
Merged
Conversation
Also list the benches crate in .bumpversion.toml, whose version pin on lance-graph otherwise breaks the build after a bump.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
lance-csr 0.2.0 releases what landed since 0.1.0: the official LDBC IC Cypher running as openCypher text (#2), the project goals, the benchmark and uv-based tooling (#4), and the
node_table/rel_tableconfig builder (#5). It also brings PyPI back in line with the docs: since #5, the examples usenode_table, which 0.1.0 doesn't have.What changed
lance-graph,pyproject.toml,.bumpversion.toml, bothCargo.lockfiles anduv.lock. The lockfiles change only for lance-csr's own packages..bumpversion.tomlnow lists the benches crate. It was missing, and the benches crate's version pin onlance-graphbroke the build after the 0.1.0 bump.The release notes are below, for the GitHub release once this merges.
Validation
cargo check --workspace --locked, and the bindings crate with--locked, both build with the updated lockfiles.uv lock --checkpasses.make installbuildslance-csr-0.2.0,importlib.metadatareports 0.2.0, andmake testpasses 332 tests.v0.2.0, before publishing.Release notes
lance-csr now runs the official LDBC Interactive complex (IC) queries as openCypher text instead of hand-written ports. Its config builder uses Kuzu-style node and relationship tables, and the project's tooling moves to uv.
Highlights
reduce(), which openCypher's standardisation scope excludes, so it runs as a port built from in-scope constructs. All 14 match the golden answers in every engine mode.node_tableandrel_table. The names match Kuzu's and Ladybug's node and rel tables, and every relationship table names the node tables at both ends.Upgrading
uv add 'lance-csr>=0.2.0'Rename the builder calls. Each relationship now names its endpoint node tables:
with_node_label,with_relationshipandwith_relationship_endpointsstill work in 0.2 with unchanged behavior. They raise aDeprecationWarningthat names the replacement, and will be removed in a later release. In Rust they are marked#[deprecated].Behavior changes
collect()over no values returns[]instead of null, as Cypher specifies.RETURNcome out under lowercase names (RETURN postCountgives apostcountcolumn), consistent with aliases, which were already lowercased.[uni.name, studyAt.classYear], becomes a list of strings. Before, it failed to cast.testsanddevextras are gone from the package: development tools now live in a uv dependency group (see below).New Cypher support
engine.execute(query, params), and the same forexecute_batchesandexplain, with numbers, strings, booleans,None, anddatetime/datevalues.a = b,a IN [x, y],count(DISTINCT a)anda IS NULLcompare nodes by id, and a path used as a value is its length (path IS NULL).collect(node), thenUNWINDback to nodes, andx IN listfor any list expression (friend IN friends,tag.id IN tags).$start <= m.creationDate < $end.(t:Tag {id: tagId}).(p:Person)<-[:HAS_CREATOR]-(post).NOT (a)-[:KNOWS]-(b) AS isNew, andCASE path IS NULL WHEN true .....fieldon maps and dates (latestLike.msg.id,birthday.month).head,toInteger,toFloat,date,datetimeandduration.inSeconds.head(collect(...)),count(x) + 1), andcollect()in the order of a precedingWITH ... ORDER BY.[x IN list WHERE p | v], pattern predicates on the element included, and pattern comprehensions[(a)-[:R]->(b) WHERE p | v].Fixes
WITH, as the planner already did. Before,WITH collect(friend) AS friends UNWIND friends AS friendfailed with "redefined with different type".WITHmay start at a node no earlier clause bound. It used to fail to plan.WITH(WHERE friend IN friends) now plans.Performance
On the LDBC SNB SF1 IC queries as openCypher text (release build, Apple M5), lance-csr's in-memory CSR mode runs 1.96× faster than Neo4j 2026.09 and wins 9 of 14 queries. It runs 4.36× faster than Kuzu 0.11.3 and wins 10 of 14 (geometric means). These are independent, unaudited measurements, not LDBC Benchmark Results, and the Neo4j and Kuzu numbers come from an earlier run on the same machine. The 30-query suite is unchanged from 0.1.0. Its results, next to Neo4j, Kuzu, Ladybug and lance-graph, are in the README and in graph-benchmark-ldbc.
Packaging, documentation and tooling
uv.lock, and development setup isuv sync --locked --no-install-projectfollowed byuv run --no-sync maturin develop.make install,make testandmake lintwrap these steps.DEVELOPMENT.mdand the build steps match the current setup, including theprotocrequirement.Known limitations
[1, 2, 3]parse as 32-bit float vectors (the vector-search syntax), so integers above 2^24 lose precision (#3).-[:A|B*0..]->) unrolls into many branches, and planning them dominates LDBC IC12's run time.Full changelog: v0.1.0...v0.2.0
🤖 Generated with Claude Code