Releases: graphistry/pygraphistry
v0.57.0 — GFQL perf: parse caching, single-hop fast path, structured returns
v0.57.0 — GFQL performance: parse caching, single-hop fast path, structured returns
A performance-focused GFQL release. Most changes are transparent (same results, faster); one is a user-visible output improvement (RETURN a).
Highlights
Faster GFQL, same results
- Parse memoization — repeated Cypher queries skip the ~15 ms lark parse (
parse_cypher), and repeated row-expressions skip their parse + transformer rebuild (parse_expr). ~1.3–1.7× faster end-to-end on small/interactive queries; the fixed per-call compile cost of a repeated query drops to ≈ parity with the equivalent native chain. Cached ASTs are deeply immutable, so sharing is safe. - Single-hop fast path (pandas + cuDF) — node-only
MATCH (n)and 1-hopMATCH (a {f})-[e]->(b)skip the BFS forward/backward/combine machinery. ~100× faster on pandas (node filter 204→2 ms @10m rows); on cuDF it stays on the resident frame (a couple of semi-joins instead of the BFS + ~31drop_duplicates). Differential-verified equivalent to the full path across 440 random graphs + targeted edge cases. - dtype-gated detection — numeric/bool columns skip the spurious
astype(str)+ regex scan in temporal/list detection:where_rows~3.1× (pandas), ~4.4–13.3× (cuDF). - Redundant-dedup removal — dropped
.unique()passes that only fed.isin()membership (byte-identical; one fewer GPU kernel launch per hop).
Structured whole-entity returns (#1650) — user-visible
- Terminal Cypher
RETURN a(a whole node/edge) now emits structured flattened columns (a.id,a.val, …) instead of a single Cypher display string. The columns already exist before projection, so this is near-free, lossless, directly usable, and serializes to JSON/CSV/Parquet/Arrow. Measured ~2–6.4× (pandas) / ~2.7–4.3× (cuDF). - The human-readable display string is still available on demand via
render_entity_text(result, alias). - Migration: if you previously parsed the rendered
({id: …, …})string out of aRETURN acolumn, read thea.*columns directly instead (or callrender_entity_text).
Fixes
- Single-hop fast path now honors
prune_to_endpoints(was returning both endpoints) by declining to the full path. RETURN a, a.valno longer emits a duplicatea.valcolumn.- Chains on edges-only graphs (no node-id binding) preserve the materialized binding through the full path (fixes a corrupt result /
NotImplementedErroron Python 3.14). - The chain fast path no longer bypasses
prechain/postchain/postloadpolicy hooks (a policy can deny execution) — policy-bearing queries take the full path.
Compatibility
No API changes. The one behavior change is the RETURN a output format (above). Default un-indexed traversal behavior is unchanged. pandas/cuDF production paths validated; polars/dask/spark untouched by the fast path.
v0.56.0
PyGraphistry 0.56.0
Broad GFQL/Cypher release with public tooling additions, stricter validation of invalid query shapes, private compatibility cleanup, and substantial implementation shrink.
Highlights
- Added public visualization settings contracts and committed schema artifacts for downstream tooling.
- Expanded GFQL layout-chain, encode-call, temporal, predicate, and coverage-audit capabilities.
- Hardened local Cypher validation and native physical planning across reentry, OPTIONAL MATCH, multiple MATCH, CALL, pattern predicates, and temporal comparisons.
- Removed private GFQL compatibility shims and stale fallback paths while preserving documented public APIs.
- Added migration guidance for legacy api=1/api=2 auth settings, deprecated compiler-inspection internals, invalid/ambiguous Cypher query shapes, and private GFQL helper imports.
Compatibility
Expected impact is low for users on documented APIs: current api=3 authentication, valid GFQL/Cypher queries, public g.gfql(...) / g.gfql_remote(...), documented Chain constructors, and documented predicate APIs continue to work.
Full changelog
0.55.1
v0.54.1
PyGraphistry 0.54.1
Patch release focused on stability, typing scaffolding, CI hardening, and expanded regression coverage.
Highlights
- CI hardening and speedups via
uvlockfile-based installs and supply-chain cooldown policy. - Added initial GFQL IR type layer (
graphistry/compute/gfql/ir/*) as frozen dataclass scaffolding for compiler/binder work. - Multiple GFQL/Cypher correctness fixes, including OPTIONAL MATCH execution improvements and shortest-path-related parity hardening.
- Expanded test coverage across GFQL/Cypher/cudf/oracle parity paths.
Full changelog
v0.53.16
Added
- GFQL native-chain
rows()now materializes connected multi-alias bindings tables for named traversal chains (#880).
Fixed
- Duplicate aliases are rejected in both legacy named-chain execution and direct
rows(binding_ops=...)execution. - Missing alias-prefixed bindings properties now project as null instead of failing with a generic row-expression error.
Tests
- Added regression coverage for binding-op duplicate aliases and native-chain injection guards.
v0.53.13 - Connected Multi-Alias Row Bindings
Highlights
- Added direct Cypher support for connected multi-alias row bindings in scalar projections.
- Added bounded
WITH ... MATCHreentry support for connected suffix projections using the same row-binding path. - Landed the benchmark-facing continuation behind
interactive-short-2, closing the narrower blockers#981and#1006.
Scope
This release targets the connected single-path / connected multi-pattern lane. It keeps broader generalized row-binding architecture work under the still-open umbrella #880.
Validation
- Hosted CI green on the product merge and the release PR
- Targeted DGX cuDF validation green on official RAPIDS
26.02cuda13 - Publish workflow green:
23834354640 - PyPI version verified:
0.53.13
Install
pip install -U graphistryFull changelog: https://github.com/graphistry/pygraphistry/blob/master/CHANGELOG.md
v0.53.11 - Cypher WITH -> UNWIND Reentry
PyGraphistry v0.53.11 adds a focused Cypher/GFQL fix for graph-backed WITH -> UNWIND -> MATCH continuation.
Highlights
- Direct local Cypher now supports the narrow graph-backed shape
MATCH ... WITH collect([DISTINCT] alias) AS list UNWIND list AS alias MATCH ... RETURN. - The admitted path is covered end-to-end on both pandas and cuDF, including targeted DGX validation.
- Unsupported adjacent shapes remain explicit fail-fast errors instead of silently widening semantics.
Included Changes
MATCH ... WITH collect([DISTINCT] alias) AS list UNWIND list AS alias MATCH ... RETURNlowering support- Additional parser/lowering regression coverage for admitted and rejected shapes
- A small
cugraphtyping baseline fix needed to keep current hosted typecheck green
Install
pip install -U graphistry==0.53.11Full changelog: https://github.com/graphistry/pygraphistry/blob/master/CHANGELOG.md
v0.53.10 - Bounded Cypher Reentry
Highlights
- Added bounded direct local Cypher reentry support for the vectorized same-alias
MATCH ... WITH ... MATCH ...subset. - Added carried scalar projection and trailing
RETURN/ORDER BYsupport on the bounded reentry path. - Hardened fail-fast behavior for unsupported cross-alias, fresh row-seeded, and prefix-order-dependent reentry shapes.
- Added pandas and cuDF regression coverage for bounded reentry, including targeted DGX validation on official RAPIDS
26.02cuda13.
Notes
- This release keeps the bounded-reentry feature intentionally narrower than a general
WITHor row-carrier redesign. - Follow-on cleanup and design work are tracked separately in
#987and#989.
Installation
pip install -U graphistry==0.53.10Links
- Changelog: https://github.com/graphistry/pygraphistry/blob/master/CHANGELOG.md
- PR: #975
- Cleanup follow-on: #987
- Row-carrier follow-on: #989
v0.53.5
Fixed
- GFQL: Fixed
g.gfql()rejecting pre-serialized Let dict envelopes ({"type": "Let", "bindings": {...}}). Unblocks ETL server from passinggfql_queryLet payloads tog.gfql(). - GFQL / Remote: Fixed
_step_to_jsonemitting"ChainRef"instead of"Ref". Removed spurious"ChainRef"alias fromfrom_json()and all documentation — the wire type has always been"Ref".
Added
- GFQL / Remote:
gfql_remote()now acceptsoutputparameter for selecting which Let/DAG binding to return.
v0.53.4
Fixed
- GFQL / Remote: Fixed
gfql_remote()silently dropping WHERE clauses — queries with same-path constraints (e.g.,WHERE a.x = b.y) now send the full Chain envelope via a newgfql_queryrequest field. The existinggfql_operationsflat array is still sent for backward compatibility with older servers.
Added
- GFQL / Remote:
gfql_remote()now accepts ASTLet/Let dict input for DAG queries, serialized as{"type": "Let", ...}in thegfql_queryfield. - GFQL / Remote:
gfql_remote()now accepts Cypher strings (compiled locally, sent as Chain or Let wire format). SupportsMATCH ... RETURN,GRAPH { ... }, andGRAPH g = ... USE g ...forms. - GFQL / Remote:
gfql_remote()now acceptsparamsfor parameterized Cypher queries.
Docs
- Updated remote mode guide with Cypher string, GRAPH constructor, multi-stage pipeline, and params examples.