Repository navigation
Cypher lowering does not support WITH ... UNWIND after MATCH-introduced graph aliases #1000
Description
Activity
Second measured manifestation from
pyg-benchon 2026-03-31:LDBC SNB Interactiveinteractive-complex-6(Tag co-occurrence) hits the same family- GFQL covers it via a 1..2-hop friend plus local tag co-occurrence aggregation workaround under
#880 - direct Cypher currently fails earlier with:
[invalid-cypher-syntax] Invalid Cypher query syntaxThe common shape is still:
MATCH ...WITH collect(distinct friend) AS friendsUNWIND friends AS fMATCH ...
So
#1000now has at least two official SNB manifestations:interactive-complex-9interactive-complex-6
Benchmark rerun against isolated ambient
graphistry v0.53.11frompyg-benchshows the old#1000lane is now split rather than uniformly blocked.Artifact:
results/runs/local-snb-interactive-v05311-rerun/
Observed on March 31, 2026:
interactive-complex-9/recent-network-messagesnow gets past the oldWITH collect(distinct friend) -> UNWIND -> MATCHblocker and fails later atgraphistry/pygraphistry#981:[unsupported-cypher-query] Cypher row lowering currently supports one MATCH source alias at a time | field: where | value: 'NOT friend = root'
interactive-complex-6/tag-cooccurrencestill reproduces#1000with the narrower carried-scalar shape:WITH knownTagId, collect(distinct friend) AS friendsUNWIND friends AS fMATCH (f)<-[:HAS_CREATOR]-(post:Post), ...- current message is still
[invalid-cypher-syntax] Invalid Cypher query syntax
So the fix in
v0.53.11clearly helped, but the remaining benchmark-visible residual seems to be theWITH scalar, collect(alias) AS list -> UNWIND -> MATCHvariant rather than the simplerWITH collect(alias) AS list -> UNWIND -> MATCHform.- added a commit that references this issue
on Apr 2, 2026 Benchmark update from
pyg-benchon April 2, 2026.We reran official SNB Interactive complex 6 (
tag-cooccurrence) on latestmastercommita916c183busing the benchmark harness ondgx-spark.Important benchmark-side correction first: the initial latest-master rerun was dying in our harness during fixture load because
tag-cooccurrencedid not yet have a narrowcore_fastfixture/spec path. We fixed that on the benchmark side and reran.Current measured result after the harness fix:
- backend: direct Cypher
- status:
parser_gap - issue ref:
#1000 - error:
[invalid-cypher-syntax] Invalid Cypher query syntax - probe notes still classify it as the carried-scalar
WITH knownTagId, collect(distinct friend) AS friends -> UNWIND -> MATCHboundary
Matching GFQL workaround lane on the same query is still
partialunder#880.Measured benchmark artifact details:
- local artifact:
results/runs/dgx-spark-snb-interactive-ic6-origin-master-a916c183b-fresh-r3/ - setup latency:
2084.248 ms - GFQL query latency:
431.218 ms - fixture timings:
csv_load=1089.63 ms,derivation=223.773 ms,graph_bind=770.845 ms
So the practical benchmark conclusion is: merged
#1000did not yet unblock the officialinteractive-complex-6query shape we care about. If useful, I can provide the exact official query text + harness params next.Adding exact residual repro instructions from
pyg-benchso teammates can verify the latest benchmark-visible#1000shape without reconstructing it from prior comments.This is the current measured residual after the
#1000merge:- official SNB query:
interactive-complex-6/tag-cooccurrence - latest tested PyGraphistry master commit:
a916c183b - measured artifact:
results/runs/dgx-spark-snb-interactive-ic6-origin-master-a916c183b-fresh-r3/ - direct Cypher status:
parser_gap - error:
[invalid-cypher-syntax] Invalid Cypher query syntax
Exact local benchmark command:
cd /home/lmeyerov/Work/pyg-bench PYGRAPHISTRY_PATH=/path/to/parent/of/graphistry/package \ uv run python scripts/run_suite.py \ --suite snb-interactive \ --config configs/suites/snb-interactive-ic6-conformance-sf1.yaml \ --output-dir /tmp/pyg-bench-ic6-1000-reproNotes:
PYGRAPHISTRY_PATHmust be the parent directory containinggraphistry/, not the package directory itself.- The first latest-master DGX rerun only exposed a benchmark-harness fixture-gap on our side. The result below is from the corrected benchmark harness with
tag-cooccurrenceon the narrowcore_fastfixture path.
Exact official query text used by the benchmark:
MATCH (knownTag:Tag { name: $tagName }) WITH knownTag.id as knownTagId MATCH (person:Person { id: $personId })-[:KNOWS*1..2]-(friend) WHERE NOT person=friend WITH knownTagId, collect(distinct friend) as friends UNWIND friends as f MATCH (f)<-[:HAS_CREATOR]-(post:Post), (post)-[:HAS_TAG]->(t:Tag{id: knownTagId}), (post)-[:HAS_TAG]->(tag:Tag) WHERE NOT t = tag WITH tag.name as tagName, count(post) as postCount RETURN tagName, postCount ORDER BY postCount DESC, tagName ASC LIMIT 10
Exact official parameters used by the benchmark fixture:
personId = 4398046511333tagName = "Carl_Gustaf_Emil_Mannerheim"
What to inspect after the run:
/tmp/pyg-bench-ic6-1000-repro/probe-results.jsonbackend = cypherquery_id = tag-cooccurrencestatus = parser_gapissue_refs = ["graphistry/pygraphistry#1000"]error_type = GFQLSyntaxErrorerror_message = [invalid-cypher-syntax] Invalid Cypher query syntax ...
The benchmark-side interpretation is still the same residual family we were discussing earlier:
WITH knownTagId, collect(distinct friend) AS friendsUNWIND friends AS fMATCH ...
So from the benchmark perspective,
#1000is not actually cleared for the officialinteractive-complex-6query shape yet.- official SNB query:
- added 2 commits that reference this issue
on Apr 2, 2026 Benchmark rerun update from
pyg-benchon refreshed currentmaster14dafaf6b951954d8de840f9236f3e874249ebac.Official SNB lane:
- query:
interactive-complex-6/tag-cooccurrence - artifact:
/home/lmeyerov/Work/pyg-bench/results/runs/dgx-spark-snb-interactive-ic6-origin-master-14dafaf6b9-fresh-r4 - command:
uv run python scripts/run_dgx_spark_suite.py --suite snb-interactive --config configs/suites/snb-interactive-ic6-conformance-sf1.yaml --output-dir results/runs/dgx-spark-snb-interactive-ic6-origin-master-14dafaf6b9-fresh-r4 --graphistry-repo-path /tmp/pygraphistry-origin-master-14dafaf6b --host-uv
Measured outcome on
dgx-spark:GFQL:partialunder#880- direct
Cypher: stillparser_gapunder#1000 - error:
[invalid-cypher-syntax] Invalid Cypher query syntax | suggestion: Check Cypher clause structure and punctuation. - benchmark-side classification note:
Official query text hits the current WITH -> UNWIND continuation parser/front-end boundary after graph aliases are introduced.
Timing from the same run:
setup_latency_ms = 1964.749query_latency_ms = 393.61csv_load = 1007.418 msderivation = 209.915 msgraph_bind = 747.416 ms
So on refreshed current master, the official carried-scalar
WITH knownTagId, collect(distinct friend) AS friends -> UNWIND -> MATCHbenchmark shape is still not cleared.- query:
- added 11 commits that reference this issue
on Apr 2, 2026 Fresh benchmark-side rerun after
origin/mastermoved tocec32d1812678c57eb19f25771db1dde8a7eee83(Merge pull request #1027 from graphistry/fix/issue-1000-dynamic-pattern-properties).Pinned DGX artifact:
/home/lmeyerov/Work/pyg-bench/results/runs/dgx-spark-snb-interactive-ic6-origin-master-cec32d181-fresh-r1
Command:
uv run python scripts/run_dgx_spark_suite.py --suite snb-interactive --config configs/suites/snb-interactive-ic6-conformance-sf1.yaml --output-dir results/runs/dgx-spark-snb-interactive-ic6-origin-master-cec32d181-fresh-r1 --graphistry-repo-path /tmp/pygraphistry-origin-master-cec32d181 --host-uv
Current measured outcome on official
interactive-complex-6/tag-cooccurrence:gfql: stillpartial- direct
cypher: still blocked - exact direct-Cypher failure remains:
[invalid-cypher-syntax] Cypher WITH after post-WITH MATCH WHERE is not yet supported in the current GFQL Cypher compiler
Timing from this rerun:
setup_latency_ms = 1981.264query_latency_ms = 395.825
Interpretation:
#1027alone is not sufficient to clear the benchmark-visibleIC6residual- the next meaningful benchmark rerun for this lane should be after
#1039lands /origin/mastermoves again
Fresh benchmark-side rerun after
origin/mastermoved tocd7c7bc23ca26a502d2c9f02419f7cc567f8110a(Merge pull request #1039 from graphistry/fix/issue-1000-linear-aggregate-overlap).Pinned DGX artifact:
/home/lmeyerov/Work/pyg-bench/results/runs/dgx-spark-snb-interactive-ic6-origin-master-cd7c7bc23-fresh-r1
Command:
uv run python scripts/run_dgx_spark_suite.py --suite snb-interactive --config configs/suites/snb-interactive-ic6-conformance-sf1.yaml --output-dir results/runs/dgx-spark-snb-interactive-ic6-origin-master-cd7c7bc23-fresh-r1 --graphistry-repo-path /tmp/pygraphistry-origin-master-cd7c7bc23 --host-uv
Current measured outcome on official
interactive-complex-6/tag-cooccurrence:gfql: stillpartial- direct
cypher: nowok
Timing from this rerun:
setup_latency_ms = 1836.562query_latency_ms = 178593.167- direct
cyphermeasured query time =178176.52 ms - untimed direct
cypherwarmup also took about180851.923 ms
Interpretation:
#1039clears the benchmark-visible#1000correctness blocker for the officialIC6lane- the remaining headline problem on this exact benchmark lane is no longer syntax/lowering correctness, it is extremely slow execution on the current CPU host-uv path
- added a commit that references this issue
on Apr 3, 2026
Summary
Resolved on April 3, 2026 by PR #1039.
Direct Cypher support for the exact official
LDBC SNB Interactiveinteractive-complex-6/tag-cooccurrencequery is now landed onmaster.Resolution
cd7c7bc23ca26a502d2c9f02419f7cc567f8110aFinal measured state
As of April 3, 2026:
masterdgx-sparkhost-CPU conformance rerun reportscypher = okforinteractive-complex-6/home/lmeyerov/Work/pyg-bench/results/runs/dgx-spark-issue-1000-ic6-1037-mergecheckObserved benchmark notes on April 3, 2026:
cypher:okgfql: suite summary stillpartial, but that reflects a separate GFQL adapter/workaround lane and was not part of the direct-Cypher#1000closeoutcypherdirect query latency:177912.063 mscypherrows returned:0Exact benchmark repro that is now fixed
Residual benchmark repro comment:
Exact official query:
Exact parameters:
personId = 4398046511333tagName = "Carl_Gustaf_Emil_Mannerheim"