Repository navigation
feat(cypher): add connected multi-alias row bindings - #1008
Merged
Merged
Conversation
This was referenced Apr 1, 2026
lmeyerov
marked this pull request as ready for review
April 1, 2026 04:51
Contributor
Author
|
Extra hardening is now pushed on What changed:
Validation:
|
16 of 19 tasks
lmeyerov
added a commit
that referenced
this pull request
Apr 1, 2026
Superseded by _serialize_binding_ops + orient_edges path from #1008. The binding_ops code path correctly handles undirected edges by doubling them (fwd + rev) in EdgeSemantics.orient_edges. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
lmeyerov
added a commit
that referenced
this pull request
Apr 1, 2026
Superseded by _serialize_binding_ops + orient_edges path from #1008. The binding_ops code path correctly handles undirected edges by doubling them (fwd + rev) in EdgeSemantics.orient_edges. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
lmeyerov
added a commit
that referenced
this pull request
Apr 1, 2026
…stence parser (#994, #997, #998) (#1009) * fix(cypher): handle undirected edges in bindings table (#994) For undirected MATCH patterns, the seed node can be on either side of the stored edge. Detect which side is the seed per-row using the src alias boolean mask, then compute peer_id for the undirected_peer alias. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * fix(cudf): use column check instead of .get() for cudf compat Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * test(cypher): add undirected incoming/outgoing/bidirectional tests (#994) 3 new tests for the undirected MATCH bindings table fix: - incoming edge returns peer not seed - outgoing edge still correct (regression) - bidirectional edges both return peer Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * feat(cypher): parse shortestPath + pattern existence with clear fail-fast (#997, #998) - shortestPath((a)-[:R*]-(b)) and allShortestPaths() now parse and raise GFQLValidationError("not yet supported") instead of GFQLSyntaxError("Invalid Cypher query syntax") - not((a)-[:R]-(b)), exists { ... }, not exists { ... } pattern existence expressions now detected pre-parse and raise clear GFQLValidationError instead of generic syntax error Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * test+docs(cypher): add tests for #997/#998 fail-fast, update changelog 6 new tests: 3 for shortestPath/allShortestPaths rejection, 3 for pattern existence expression rejection. Changelog updated with #994 fix + #997/#998 parser improvements. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * chore: retrigger CI after tck-gfql main fix * chore: retrigger CI (tck-gfql match5-21..24 removed from xfail map) * test(cypher): amplify #994/#998 edge case coverage Add 4 tests: undirected with multiple edges to same nodes, undirected star graph with multiple peers, undirected self-loop, and pattern existence in WHERE clause. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * refactor(lowering): remove dead _build_alias_endpoints function Superseded by _serialize_binding_ops + orient_edges path from #1008. The binding_ops code path correctly handles undirected edges by doubling them (fwd + rev) in EdgeSemantics.orient_edges. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * refactor(pipeline): remove unused undirected peer logic from alias_endpoints path The alias_endpoints code path in _gfql_bindings_row_table is not called from the Cypher lowering (which uses binding_ops + orient_edges instead). The undirected seed/peer detection was added for #994 but never wired up. Revert to the simpler src/dst join that matches the actual usage. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * docs(changelog): fix #994 description to match actual implementation The fix uses orient_edges (both-direction doubling), not the removed alias_endpoints seed/peer detection approach. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> * test(cypher): add regression test for parameterized LIMIT in reentry Covers 992f2fc fix where ParameterRef in LIMIT clause would crash _literal_limit_value. Verifies WITH...ORDER BY...LIMIT $n...MATCH reentry is properly rejected with a clear validation error. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
19 of 20 tasks
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.
Summary
rows(binding_ops=...)row-binding path for direct Cypher scalar multi-alias projectionWITH ... MATCHreentry so connected suffix projections can bind whole-row and carried-scalar aliases correctlyScope
Closes #981
Closes #1006
This PR intentionally targets the connected single-path / connected multi-pattern projection lane. It does not attempt the broader row-carrier redesign from #989 or the fuller
bindings_tablearchitecture from #880.Companion
tck-gfqlPR: graphistry/tck-gfql#17Validation
ruff check graphistry/compute/ast.py graphistry/compute/chain.py graphistry/compute/gfql/call/validation.py graphistry/compute/gfql/cypher/lowering.py graphistry/compute/gfql/row/pipeline.py graphistry/tests/compute/gfql/cypher/test_lowering.pypython -m py_compile graphistry/compute/ast.py graphistry/compute/chain.py graphistry/compute/gfql/call/validation.py graphistry/compute/gfql/cypher/lowering.py graphistry/compute/gfql/row/pipeline.py graphistry/tests/compute/gfql/cypher/test_lowering.py./bin/typecheck.shPYTHONPATH=. pytest -q graphistry/tests/compute/gfql/cypher/test_lowering.py -k 'multi_alias_return_empty_match or plain_connected_multi_pattern_scalar_projection or plain_multi_alias_edge_scalar_projection or whole_row_into_connected_multi_pattern_shape or carried_scalar_into_connected_multi_pattern_shape or recent_message_reentry_multihop_scalar_projection or branching_multihop_row_bindings or multiple_trailing_match_clauses'PYTHONPATH=. pytest -q graphistry/tests/compute/gfql/cypher/test_lowering.py -k 'reentry or multi_pattern or multi_alias or bindings'PYTHONPATH=. pytest -q graphistry/tests/compute/test_gfql.py -k 'reentry or cypher'PYTHONPATH=. pytest -q graphistry/tests/compute/gfql/cypher/test_lowering.pynvcr.io/nvidia/rapidsai/base:26.02-cuda13-py3.13:6 passed in 4.09sNotes
interactive-short-2shape now progresses through the old#1006blocker because connected multi-alias bindings are materialized instead of collapsed through endpoint shortcuts