Skip to content

v0.6.1

Choose a tag to compare

@dylanbstorey dylanbstorey released this 29 Aug 11:42
· 88 commits to main since this release
a1c65ad

GraphQLite 0.6.1

Patch release fixing three community-reported issues (#95, #96, #97) — two silent-wrong-results bugs in parameterized relationship matching and a write path that raised an error after committing — plus a new upsert_edge capability for parallel edges. Thanks to @anirbanbasu for the excellent, reproducible reports.

Fixed

Relationship inline property filters now honor $parameters (#96)

MATCH ()-[r:TYPE {prop: $param}]->() silently ignored the parameter and matched every edge of the type — dangerous when the filter scoped a SET or DELETE (e.g. MATCH ()-[r:TYPE {id: $id}]->() SET r.x = 1 updated every TYPE edge). Parameter values are now matched against the edge property tables exactly like literals, for all scalar types. Node patterns and WHERE clauses were unaffected.

RETURN r works for relationships created between MATCH-bound nodes (#95)

MATCH (x:Hub {name: 'a'}), (y:Hub {name: 'b'})
CREATE (x)-[r:LINKS_TO {seq: 1}]->(y)
RETURN r

previously raised Unknown variable: r — after the CREATE had already committed, breaking the usual error-handling contract (a caller couldn't tell from the exception whether the write landed, making retry logic risky). The MATCH+CREATE+RETURN path now projects CREATE-introduced variables (bare r, r.prop, aggregates, SKIP/LIMIT), one result row per matched row, for both comma-pattern and multi-MATCH shapes.

MERGE honors parameter-valued inline properties

The MERGE match phase ignored $param inline properties for both nodes and edges — MERGE (n:L {id: $id}) matched any :L node and created nodes without the property; MERGE (a)-[r:T {id: $eid}]->(b) matched any existing edge on the triple. All three paths (node match, edge match, node create) now resolve parameters correctly.

Added

Caller-assigned edge ids for upsert_edge (#97)

Parallel edges on the same (source, target, type) triple are now individually addressable:

# Python — new optional edge_id keyword
g.upsert_edge("alice", "bob", {"seq": 1}, rel_type="KNOWS", edge_id="k1")
g.upsert_edge("alice", "bob", {"seq": 2}, rel_type="KNOWS", edge_id="k2")  # second, distinct edge
g.upsert_edge("alice", "bob", {"seq": 9}, rel_type="KNOWS", edge_id="k1")  # updates k1 in place
// Rust — new method; existing upsert_edge signature unchanged
g.upsert_edge_with_id("alice", "bob", [("seq", "1")], "KNOWS", "k1")?;

With an id, the edge is merged on an id relationship property instead of the triple; omitting it keeps today's merge-on-triple behavior, so existing code is unaffected.

Documentation

The architecture page now states explicitly that concurrent multi-process access inherits SQLite's own locking/WAL guarantees (requested in #95).

Validation

  • 947/947 C unit tests; functional suite clean, including a new hard-assertion regression file (tests/functional/39_issue_regression_tests.sql, 17 assertions covering all three issues)
  • openCypher TCK: per-scenario diff vs. pre-change run — zero regressions
  • Python bindings: 357 tests; Rust bindings: 244 integration tests

Install / upgrade

pip install --upgrade graphqlite        # Python (PyPI)
cargo update -p graphqlite              # Rust (crates.io)

Prebuilt extension binaries and the gqlite CLI for Linux (x86_64/aarch64), macOS (arm64/x86_64), and Windows are attached below.

Full changelog: v0.6.0...v0.6.1