Round-006 cartesian/params/labels probe (~85 queries × both engines @ d7cf23d; scripts in session scratchpad probe-r6-cart/).
SILENT-WRONG (both engines):
- Bare
count(*) ignores relationship uniqueness the row lane enforces — one MATCH, two cardinalities again but in the fixed-hop/comma domain: self-loop fixture MATCH (a)-->(b)-->(c) rows=1 vs count()=2; branching comma (a)-->(b), (a)-->(c) rows=2 vs count()=9 (out-deg² products incl. illegal same-edge pairs); grouped branching count equally wrong. count(a)/sum/collect/count(DISTINCT)/chain-grouped counts are all correct — only the bare-count lane rides the edge product. A guard exists for aggregates needing path multiplicity (typed decline) — count(*) slips around it.
- List-valued
$param in =/property-map runs as isin (WHERE n.v = $l, l=[30,70] → matches members; oracle: scalar=list false → 0 rows). Literal spelling differs too (pandas 0 rows conformant; polars typed error) — param substitution into filter_by_dict semantics leak.
Typed-gap deviations: 3. Nonexistent node label = hard GFQLSchemaError column-not-found (incl. OPTIONAL arms, where openCypher says all-null rows); relationships correctly 0-row. Pandas OPTIONAL-arm error leaks binder-internal column name. 4. String-param vs numeric column: pandas typed; polars RAW polars.ComputeError (error-contract divergence).
NIE inventory: comma-cartesian is node-only (disconnected relationship arms decline; MATCH (a:X) MATCH (b:Y) rejected while comma form works); polars fall-offs (IN $empty/mixed lists, XOR over labels, labels() projection).
QUIET inventory: shared-alias joins with correct trail semantics, label conjunction/OR/NOT, params in all positions incl. shadowing, missing-param typed. Fix order: 1 → 2 → 4 (error contract) → 3 (needs semantics decision: strict-schema vs openCypher missing-as-absent — flag for owner).
Round-006 cartesian/params/labels probe (~85 queries × both engines @ d7cf23d; scripts in session scratchpad probe-r6-cart/).
SILENT-WRONG (both engines):
count(*)ignores relationship uniqueness the row lane enforces — one MATCH, two cardinalities again but in the fixed-hop/comma domain: self-loop fixtureMATCH (a)-->(b)-->(c)rows=1 vs count()=2; branching comma(a)-->(b), (a)-->(c)rows=2 vs count()=9 (out-deg² products incl. illegal same-edge pairs); grouped branching count equally wrong.count(a)/sum/collect/count(DISTINCT)/chain-grouped counts are all correct — only the bare-count lane rides the edge product. A guard exists for aggregates needing path multiplicity (typed decline) — count(*) slips around it.$paramin=/property-map runs as isin (WHERE n.v = $l, l=[30,70] → matches members; oracle: scalar=list false → 0 rows). Literal spelling differs too (pandas 0 rows conformant; polars typed error) — param substitution into filter_by_dict semantics leak.Typed-gap deviations: 3. Nonexistent node label = hard GFQLSchemaError column-not-found (incl. OPTIONAL arms, where openCypher says all-null rows); relationships correctly 0-row. Pandas OPTIONAL-arm error leaks binder-internal column name. 4. String-param vs numeric column: pandas typed; polars RAW polars.ComputeError (error-contract divergence).
NIE inventory: comma-cartesian is node-only (disconnected relationship arms decline;
MATCH (a:X) MATCH (b:Y)rejected while comma form works); polars fall-offs (IN $empty/mixed lists, XOR over labels, labels() projection).QUIET inventory: shared-alias joins with correct trail semantics, label conjunction/OR/NOT, params in all positions incl. shadowing, missing-param typed. Fix order: 1 → 2 → 4 (error contract) → 3 (needs semantics decision: strict-schema vs openCypher missing-as-absent — flag for owner).