Repository navigation
[FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880
Description
Activity
Concrete benchmark-backed repros are now split out from this broader bindings/materialization request:
- Direct Cypher row lowering rejects scalar multi-alias projections from a single MATCH #981 Direct Cypher row lowering rejects scalar multi-alias projections from a single MATCH
- AST row select cannot reference edge alias properties after traversal #982 AST row select cannot reference edge alias properties after traversal
These came up while wiring the first official SNB Interactive subset in
pyg-benchon the local staged fixture. If the eventual fix path is shared, this broader issue still looks like the right umbrella.Partial progress landed in #1008.\n\nWhat is now covered:\n- direct Cypher connected multi-alias scalar projection ()\n- connected multi-pattern and bounded reentry cases that were surfacing as \n\nWhat remains open here:\n- the broader / generalized row-bindings architecture beyond the connected single-path / connected multi-pattern lane that intentionally targeted.\n\nSo should stay open as the wider umbrella, but the narrower user-visible blockers and are now resolved by #1008.
Correction to my prior comment: shell interpolation mangled the markdown.
Partial progress landed in #1008.
What is now covered:
- direct Cypher connected multi-alias scalar projection (Direct Cypher row lowering rejects scalar multi-alias projections from a single MATCH #981)
- connected multi-pattern and bounded
WITH ... MATCHreentry cases that were surfacing as Cypher MATCH after WITH currently supports only a single trailing MATCH pattern #1006
What remains open here:
- the broader
bindings_table/ generalized row-bindings architecture beyond the connected single-path / connected multi-pattern lane that feat(cypher): add connected multi-alias row bindings #1008 intentionally targeted
So #880 should stay open as the wider umbrella, but the narrower user-visible blockers #981 and #1006 are now resolved by #1008.
- added 7 commits that reference this issue
on Apr 1, 2026 61 remaining items
#1412 PR #9 CI follow-up
Pushed a second commit to graphistry/pyg-bench#9:
0f14382— mechanical lint cleanup exposed by the first PR smoke run.
Current PR status:
- PR: https://github.com/graphistry/pyg-bench/pull/9
- Head:
0f14382 - GitHub Actions
smoke: passed - Local
./bin/lint: passed - Local full tests:
103 passed
The residual rerun gate remains unchanged: merge graphistry/pyg-bench#9, then rerun on an environment with the pinned upstream query checkout and SF1 dataset staged before closing #1412 / clearing #880.
Update for child #1413: PR #1422 merged on 2026-05-11 UTC:
#1422Merge commit:
1520a728424fdc0c54fa507f912e3e24aa7953f7Scope covered by the merge:
- IC4 /
new-topicsjoined-row aggregation native GFQL/Cypher coverage. - Searched
CASE WHENconditions now lower chained comparisons before joined-row aggregation validation. - Exact reference-shaped regression covers
$startDate <= post.creationDate < $endDate. - DGX Spark RAPIDS 25.02 and 26.02 GFQL matrix passed after rebasing on Add GFQL row join apply (#1411) #1426 / [POST-RERUN] #880 residual: joined row projection bucket #1411.
Status against this umbrella:
- [POST-RERUN] #880 residual: joined row aggregation bucket #1413 is only partially complete.
- IC4/new-topics is pygraphistry-side implemented.
- IC3/cross-country-messages remains open: the
WITH person, collect(city) AS cities MATCH ...collect-list + carried-row reentry shape still hits the currentMATCH after WITHcompiler gate after Add GFQL row join apply (#1411) #1426. - Keep [POST-RERUN] #880 residual: joined row aggregation bucket #1413 unchecked in [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880 until IC3 is handled and the benchmark residual rerun no longer reports the joined-row aggregation bucket as
gfql partialwithgraphistry/pygraphistry#880.
- IC4 /
#1412 closeout lane update:
graphistry/pyg-bench#9merged 2026-05-11 UTC at518691b5220052cec0889a64deb3148598ee99ed.- Reply-author adapter workaround removal is now landed in pyg-bench, with a
CHANGELOG.mdentry. - DGX pinned-fixture sanity rerun passed:
results/runs/dgx-spark-issue-1412-testdata-absolute-closeout,run_id=snb-interactive-0dd69802e9,status=ok,probes_total=4,probes_passed=4,probes_partial=0. - [POST-RERUN] #880 residual: reply-author row-shaping bucket #1412 remains open pending a full staged residual rerun because SF1 IC8 returned 137 before probes and the expected DGX sf0.1 dataset cache is currently missing.
#1412 is closed out:
- Adapter workaround removal landed via
graphistry/pyg-bench#9at518691b5220052cec0889a64deb3148598ee99ed. - Missing sf0.1 SNB cache was staged on
dgx-spark. - DGX staged sf0.1 residual closeout passed:
results/runs/dgx-spark-issue-1412-sf01-gfql-closeout,run_id=snb-interactive-c8dee7f018,status=ok,probes_total=2,probes_passed=2,probes_partial=0. message-repliesandrecent-repliesGFQL both returnedstatus=okwithissue_refs=[].
Tracker status shifted #1412 to completed/closed; remaining #880 children are separate lanes.
- Adapter workaround removal landed via
#1413 closeout update:
- PR Fix #1413 IC3 carried-row reentry #1428 merged on 2026-05-14 UTC: Fix #1413 IC3 carried-row reentry #1428
- Merge commit:
2f83b27da8108aab6b2d4770bf31ac0d562a4cc0 - Completes the IC3 /
cross-country-messageshalf left open after [WIP] Fix #1413 joined-row aggregation residual #1422. - Covered shape: carried
personrow +collect(city) AS citiesthroughMATCHreentry,NOT friendCity IN cities, and multiple post-reentryWITHstages before aggregation. - Validation: local focused slices green, PR CI green, DGX RAPIDS
25.02/gfqland26.02/gfqltargeted runs passed.
Tracker body updated to mark #1413 pygraphistry-side complete. Final #880 closeout still needs remaining child lanes plus a fresh residual rerun proving no remaining
#880-attributedgfql partiallanes.Updated #1416 status after https://github.com/graphistry/pyg-bench/pull/10 merged: adapter workaround removed, DGX SF0.1 direct probe
snb-interactive-44201b99efpassed cleanly with 0 partials and empty issue refs. #1416 remains open pending a full SF1/latest residual rerun, or accepted lower-memory equivalent, before #880 closeout.#1411 / pyg-bench#11 benchmark-side closeout
graphistry/pyg-bench#11 is closed via merged PR graphistry/pyg-bench#14:
- PR: https://github.com/graphistry/pyg-bench/pull/14
- merge commit:
34f8f9c7487b1d521cf3d9310b4f1a27effad574 - CI: GitHub Actions
Smokepassed - pygraphistry validation base: origin/master
aaa424ca56b7b9b65174730daeffd3a125d8c19a
Receipt:
- seven [POST-RERUN] #880 residual: joined row projection bucket #1411 joined-row projection target GFQL lanes now report
okwithissue_refs=[] - target residual filter for
status == partialplusgraphistry/pygraphistry#880:[] - local credential scan clean
./bin/lintpassed./bin/testpassed:105 passed
Target lanes cleared:
- IS1
seed-lookup - IC2
recent-friend-messages - IC5
new-groups - IC7
recent-likers - IC9
recent-network-messages - IC10
common-interest-score - IC12
expert-search
Tracker implication: #1411 is complete on both sides. The #880 joined-row projection bucket can be treated as closed; remaining active #880 coordination should focus on #1415 / graphistry/pyg-bench#12, #1416 full residual closeout, and the final no-
#880residual rerun.#1418 / D1 closeout receipt
- Merge commit:
7659c2c3ed15f54484ce05adf7ce678292ce238e - Head commit:
3740d303a543b7f01ad116a85dc32d2cd03136f7 - Scope: completed the remaining narrow pygraphistry D1 row-join fallback deletion after [codex] Remove connected-match row-join compat fallback #1431 by moving connected OPTIONAL MATCH to direct physical-plan dispatch and removing the stale connected-optional compat branch.
- Validation: local focused/amplified tests green,
ruff+git diff --checkgreen, review skill converged with no findings, PR CI green at merge. - DGX: RAPIDS 25.02 import smoke and new direct-dispatch cutover test passed; broader cuDF optional tests were resource-blocked by shared
dgx-sparkCUDA/host memory pressure.
Tracker implication:
- [DEL] D1 remove obsolete row-join fallback branches after #880 post-rerun fixes #1418 can be treated as closed for the pygraphistry D1 deletion slice.
- [META] GFQL deletion wave: remove 2K+ LOC of obsolete compatibility paths #1419 remains open: current deletion receipts are still far below the >=2K LOC target. Remaining coordinator work is to resolve [POST-RERUN] #880 residual: tag-cooccurrence join-aggregation bucket #1415 / graphistry/pyg-bench#12 and [POST-RERUN] #880 residual: recursive-ancestor row-join bucket #1416, run/review the final [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880 residuals, then either run a broader deletion pass or explicitly revise/de-scope the [META] GFQL deletion wave: remove 2K+ LOC of obsolete compatibility paths #1419 target.
- Merge commit:
#1416 recursive-ancestor residual closeout receipt:
- [POST-RERUN] #880 residual: recursive-ancestor row-join bucket #1416 is being closed as completed per coordinator/owner closeout.
- PR [WIP] Refs #1416 recursive ancestor residual closeout #1430 is being closed unmerged as receipt-only because it has no source diff, only an empty anchor commit.
- pygraphistry coverage landed earlier in [codex] Add #1416 recursive ancestor row-join regression #1423.
- graphistry/pyg-bench#10 removed the SNB Interactive IS6 /
message-forumGFQL adapter workaround and switched the lane to nativerows()recursive ancestor traversal. - Fresh DGX SF0.1 dataset-backed direct probe passed for
interactive-short-6/message-forum: backendgfql,status=ok,semantic_scope=native_rows_recursive_ancestor_join,issue_refs=[],rows_returned=1,probes_partial=0. - Fresh SF1 was retried and exited
137before artifacts under DGX memory/swap pressure; recorded as a resource blocker, not a pygraphistry gap.
No source merge is needed from #1430.
One more lane cleared for #880.
Benchmark-side closeout of #1415 (IC6 /
tag-cooccurrencejoin+aggregation) lands in graphistry/pyg-bench#15: the lane is now classifiednative_rows_postprocess/status: okwith#880removed fromsuccess_issue_refs. Routes through a native GFQL chain materializing friend × post × tag joined rows viarows() + select()(locked by #1396 + #1426; tied to #1415 by #1427); adapter postprocess only does SNB-shaped finishing (exclude self, known-tag co-occurrence filter, group-by tag, count(post), order, limit-10).dgx-spark SNB SF0.1 receipt:
tag-cooccurrence/gfql/dataset-backedreturnsstatus: ok,issue_refs: [], latency 238 ms (results/runs/dgx-spark-ic6-issue-12-cpu-sf0.1/probe-results.json). pygraphistry IC6 RAPIDS 25.02 + 26.02 targeted tests pass (#1437 added the test-side numba_cuda segfault workaround for 25.02-cuda12.8).Remaining lanes citing
#880(per dgx-spark probe results): IC3cross-country-messages, IC4new-topics, IC11job-referral. Out of scope for graphistry/pyg-bench#12; each will follow its own closeout pattern.- added a commit that references this issue
on May 15, 2026 Coordinator sync after #1415 / graphistry/pyg-bench#12 closeout:
- [POST-RERUN] #880 residual: tag-cooccurrence join-aggregation bucket #1415 is closed.
- graphistry/pyg-bench#12 is closed via graphistry/pyg-bench#15.
- fix(test): route IC6 cuDF assertion through Arrow-safe helper #1437 and graphistry/pyg-bench#16 landed the supporting cuDF/DGX hardening.
- DGX SF0.1 IC6
tag-cooccurrence/gfqlnow reportsstatus: ok,issue_refs: []. - SF1 IC6 OOM is split to graphistry/pyg-bench#18 and is not a [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880 blocker.
- Remaining [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880 residual verification is now graphistry/pyg-bench#19 for IC3, IC4, and IC11.
- Follow-up filing: graphistry/pyg-bench#20 tracks the IC6 Cypher classification mismatch; Test hardening: replace direct cuDF .to_pandas().to_dict() conversions in GFQL lowering tests #1439 tracks the pygraphistry cuDF
.to_pandas().to_dict()test sweep.
Final #880 benchmark-side closeout receipt after graphistry/pyg-bench#21:
- PR: https://github.com/graphistry/pyg-bench/pull/21
- merge commit:
c332f12c8f76d8763163957576c353cc9984269c - merged at: 2026-05-15 15:07 UTC
- GitHub smoke CI: passed
What closed:
- graphistry/pyg-bench#19 is complete for the last known
#880-attributed benchmark residual lanes:- IC3 /
cross-country-messages - IC4 /
new-topics - IC11 /
job-referral
- IC3 /
- All three now report GFQL
status=ok,issue_refs=[]. - The stale runner/config
partial+graphistry/pygraphistry#880classification was removed.
Fresh residual evidence:
- DGX SF0.1 artifact:
results/runs/dgx-spark-issue-19-sf01-closeout/ - Target rows:
cross-country-messages gfql ok []new-topics gfql ok []job-referral gfql ok []
- Scan of the same artifact found no remaining
graphistry/pygraphistry#880-attributed GFQL partial lanes. - Remaining GFQL partials are unrelated and carry empty issue refs:
named-shortest-friends,shortest-path,expand-order-limit.
Validation:
./bin/lintpassed./bin/testpassed:116 passed- review skill converged after 5 waves, with waves 4 and 5 clean
Notes:
- This is a benchmark-side closeout for the [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880 residual umbrella. It does not change direct-Cypher blockers or Meta: Prioritized direct-Cypher wrong-row bugfix tranches (92 cases) #1353 wrong-row counts.
- The SF1 IC3 retry exited
137before probe artifacts under DGX resource pressure; the accepted receipt is the lower-memory SF0.1 run above.
Tracker implication: graphistry/pyg-bench#19 can be marked complete, and #880 no longer has a benchmark-side
gfql partialresidual attributed to it in the fresh closeout artifact.Non-blocking performance/resource follow-up from the closed #880 / #1415 IC6 lane is complete on the benchmark side.
Merged:
- graphistry/pyg-bench#25 closed by graphistry/pyg-bench#26
- PR: https://github.com/graphistry/pyg-bench/pull/26
- merge commit:
993d95b6f4830a83b30840eb869e8e01e8b84b29 - final head before merge:
ebff1b6a8c95516f493f0659db7a4666d64bf8f1
Scope:
- This does not reopen [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880. The [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880/[POST-RERUN] #880 residual: tag-cooccurrence join-aggregation bucket #1415 correctness closeout remains complete.
- This closes the SF1 resource/performance follow-up that was split after IC6 native GFQL became correct at SF0.1.
What changed:
- IC6 /
tag-cooccurrenceSF1 GFQL now uses bounded friend batches instead of fullfriend x post x tagmaterialization. - Default batch size is
friend_batch_size=512. - Batch results are validated against staged
post_hasCreatorexpected(friendId, postId)pairs, with scalar fallback only for missing friends. - Result metadata records
resource_strategy.materialization=bounded_friend_batches,friend_batch_size=512, andvalidation=post_has_creator_expected_pairs. - No pygraphistry source change was needed.
Receipts:
- DGX CPU:
status=ok,latency_ms=156.505,peak_rss_mib=563.3 - DGX RAPIDS 26.02:
status=ok,latency_ms=500.86,peak_rss_mib=901.4 - DGX RAPIDS 25.02:
status=ok,latency_ms=584.58,peak_rss_mib=814.9 - PR CI: GitHub Smoke passed before merge
- Local:
./bin/lintpassed;./bin/testpassed (126 passed)
Tracker implication:
- The non-blocking IC6 SF1 resource follow-up mentioned in [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880 is no longer open on the benchmark side.
- Direct IC6 Cypher remains a separate Cypher lowering does not support WITH ... UNWIND after MATCH-introduced graph aliases #1000 blocker and is not part of [FEA] GFQL bindings_table (row bindings) from chain using Yannakakis prune #880/igraph conversion misses binding #25.
Summary
Umbrella for benchmark-visible GFQL row-bindings / joined-row semantics still marked workaround-backed
partialinpyg-bench.Fresh Rerun Receipt (2026-05-09 PT)
results/runs/local-snb-interactive-closeout-2026-05-09gfql, status=partial, issue_ref=graphistry/pygraphistry#880Active Post-Rerun Child Split
okwith empty issue refssnb-interactive-c8dee7f018passed 2/2 GFQL probes, 0 partials, empty issue_refsok,issue_refs=[]Prior Closed Split Wave (kept for traceability)
Final Closeout Checklist
#880-attributedgfql partiallanes.Non-Blocking Follow-Up