Skip to content

docs(gfql): publish final performance results and simplify engine guides - #2017

Open
lmeyerov wants to merge 31 commits into
masterfrom
docs/gfql-nav-and-benchmark-copy
Open

lmeyerov wants to merge 31 commits into
masterfrom
docs/gfql-nav-and-benchmark-copy

Conversation

@lmeyerov

@lmeyerov lmeyerov commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Status 2026-09-15. Rebased onto current master 65c359b (head a489e9a). The vendored-number freshness contract is intentionally RED: the vendored SNB runs are from f7a7253, now 20 compute commits behind master, past the 12-commit policy. The fix is a single re-vendor once the open performance PRs (#2084, #2086, #2087) land, since those change the published numbers again; re-vendoring now would be thrown away and would churn the measured prose twice. Not ready to merge — per the landing rule this goes last, after the benchmarks win.

GFQL documentation now gives readers a short start path, separate performance and language-reference hubs, and an engine guide tied to measured results. Existing page URLs are preserved. The performance hub leads with the speedup case study and separates examples and architecture from benchmark tables and methodology.

The benchmark pages use verified publication cells for values, ratios, query tallies, and generated charts. This refresh includes GraphBench Q1–Q9 at 20k/100k from PyGraphistry d20c6ae1af73e64b05aa4b24459dfd3ba247edf9 and SNB SF0.1/SF1 from f7a7253bc95d9cc0663bd130a53a03f2f355cbcd. The source revisions remain distinct. The final artifact is byte-identical to merged pyg-bench #267; #268 records and enforces matching CPU placement. Historical database measurements keep their original dates and methods.

The engine guide explains input-based auto selection, frame conversion, unsupported-query behavior, and when Polars-GPU still executes CPU operations. Indexed message-content and creator lookups lead the measured four-engine SNB comparisons at both scales. The full tables retain every eligible result. GraphBench 20k q8 is explicitly identified as CPU-only under Polars-GPU. Instrumented GPU diagnostics are excluded from published timings.

The editorial pass addresses the recorded review items: shorter prose, defined lookup terms, consolidated engine decisions and memory guidance, simpler comparison tables, and one provenance section per page. The Neo4j/GDS and GraphFrames case studies retain their measured scope and limits. Benchmark contracts enforce source freshness, correct references, derived tallies, and chart synchronization.

Validation on the final data and prose:

  • Benchmark contracts: 37 passed, one intentional skip; source freshness passes without a new waiver.
  • Relevant documentation examples: two passed, two skipped because those pages have no runnable blocks; 32 other pages were outside this check.
  • RST checks passed. A clean full HTML build passed with RTD content-copy steps and the pinned ipykernel version. Repository-wide warnings remain, including a Cypher lexer warning for $ parameters in the case study; none point to the four final edited pages.
  • All 90 internal article links on those pages resolve. Engine/performance layouts were inspected in Chrome; benchmark tables and all five case-study SVGs resolve.
  • Upstream publication: 1,414 tests passed and 131 skipped locally and in PR/main CI; strict publication regression checks pass with no exceptions. Current-master GPU integration passed 926 tests with no skips, and the fresh 30-point automatic sentinel gate passed unchanged bounds.

Review previews:

Performance changes and private benchmark/TCK companions are merged. This public documentation PR is the remaining owner review and merge step. Final head 048b454673dcf673ba23784d938f9ab73845f02b passed GitHub CI with 57 successful jobs and 11 conditional skips, plus CodeQL. Read the Docs build 34554961 passed on that exact head. Eleven hosted pages match the locally verified tables and headings; all six SVG assets load, and the final source/run identifiers were checked through the preview source link. The hosted performance page was also inspected in Chrome. The skipped route/TCK/GPU jobs do not add coverage; the separately recorded merged-master and private-companion validation remains the evidence for those areas.

@lmeyerov

lmeyerov commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

READY (cab184f) but LAST per the landing order: rebased on master; 59 green + 10 skipped + RTD; re-vendor from the master re-measure follows before the final merge.

@lmeyerov

lmeyerov commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Re-vendored from the master re-measure: docs/source/_data/gfql_benchmarks.json now equals pyg-bench published/docs-numbers.json at pyg-bench main af1513f (PR graphistry/pyg-bench#249: SNB SF0.1/SF1 arms and q1–q9 20k/100k boards at pygraphistry master 5a6586f, sentinel baseline at 86de0f5). 166 of 262 cells changed, all within noise of the 4 September board except the seeded SNB shapes, which are the release wins (pandas message-content 10.06→1.66 ms, seed-lookup 30.12→3.91 ms; polars seed-lookup 21.82→10.19 ms). Losses stay on the pages through the same cells (100k q8 Kuzu 9.7 ms vs polars 14.0 ms; polars tag-cooccurrence 30.2→31.7 ms, inside its 17% run-to-run spread). The SNB pre-landing disclosure is gone (both scales are the release measurement); the GraphFrames note now says #2024 has landed since and the ladder was not re-run. docs/test_bench_numbers.py 37 pass. Stays open until the rest of the queue lands (merges last).

@lmeyerov

lmeyerov commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

CI receipt at 090ad9e: 59 check-runs success, 10 skipped by the path filter (docs-only change). docs/test_bench_numbers.py 37 pass locally; the vendored JSON equals pyg-bench main af1513f.

@lmeyerov

lmeyerov commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto master 1a41079 (60d39f0, docs only, clean). Expect the docs-numbers contract test to be RED on this head by design: the vendored boards were measured at 5a6586f and the landed 0.60 stack put them 19 compute commits behind master (policy allows 12). Rather than waive, the SNB arms, q1–q9 boards and sentinel are being re-measured at master 1a41079 on dgx now; this PR gets re-vendored from that run, with any cell that moved called out here. The three 0.59.0-era runs (GraphFrames ladder ×2, filter-pagerank) get explicit drift waivers with the reason stated in the pyg-bench PR. Review the prose and structure via the RTD preview meanwhile: https://pygraphistry--2017.org.readthedocs.build/en/2017/gfql/index.html

@lmeyerov

lmeyerov commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

CI on 60d39f0: 59 green, 11 filter-skipped. Correction to my note above: CI does not run docs/test_bench_numbers.py on this PR (it is among the skips), so CI green here is not evidence for the numbers. Locally that test fails on drift (19 compute commits past the policy's 12) until the re-vendor from the master 1a41079 re-measure lands.

@lmeyerov

lmeyerov commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Editorial pass 1 (owner items 1–5, 7–12 on engines; 6 started) at 3dbf8fc. Preview rebuilds from this head in a few minutes:

  • engines: https://pygraphistry--2017.org.readthedocs.build/en/2017/gfql/engines.html — the opening and the old 'Switching engines' section are one 'Switch engines with one keyword' section; the [F1]–[F5] footnotes are gone (their facts live in the decision table notes and three plain rules under it); 'When not to use Polars' is merged into that table; 'Parity and fallback rules' is three bullets under 'Same results on every engine'; 'Methodology' and the committed-artifact sentence are gone; 'Coming from another graph tool' states what GFQL removes and what you gain, and no longer describes competitors' strengths; the memory note has no parentheticals. Prose is about 40% shorter; every table and code block is kept.
  • perf hub: https://pygraphistry--2017.org.readthedocs.build/en/2017/gfql/perf/index.html — two reader tracks: 'See what it is worth' (case study vs Neo4j + GDS first, then the boards, then GraphFrames) and 'Get the speed on your data' (engine, adjacency index, indexing guide, remote GPU), plus a short reference list.
  • Editorial policy started at agents/skills/docs-review/SKILL.md (plain-language rules, a jargon table with replacements, AI-writing tells, review procedure). Jargon pass on the other perf pages is next; queued with your further items in plan.md before any edit.

@lmeyerov

lmeyerov commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Jargon pass (item 6) at 777475d across performance, index_adjacency, indexing, benchmark_filter_pagerank, benchmark_graphframes, overview: 'seeded' → 'from known nodes' except the two defining first uses; 'receipt' / 'committed artifact' → 'run record'; 'parity' → 'identical results'; 'point lookup' → 'single-node lookup by id'; 'lane' → 'path'. No number changed. Items 1–12 from your list are now all applied; add more per page and I queue them in plan.md before editing.

@lmeyerov

lmeyerov commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Re-vendored at d660e33 from the master 1a41079 re-measure (pyg-bench #251, publishing now). docs/test_bench_numbers.py passes locally including the drift policy (37 passed). Cells that moved more than 15% vs the 5a6586f vendoring: graphbench.20k.q4.polars_gpu 16.41 → 4.53 ms (the GPU tiny-point outlier did not reproduce), graphbench.20k.q8.polars_gpu 2.17 → 2.53, snb.sf01.message_creator.gfql_pandas_idx 2.87 → 2.33; everything else within run-to-run spread. Verdict changes on the boards: 100k q5 polars vs Kuzu is now a tie (0.97×, was a weak 1.12× win); 20k q8 is a tie (1.10×); 100k q8 stays the one loss. Board prose on performance.rst updated to the new verdicts; the tallies are roles and follow the cells automatically.

@lmeyerov
lmeyerov marked this pull request as draft September 13, 2026 05:29
@lmeyerov
lmeyerov force-pushed the docs/gfql-nav-and-benchmark-copy branch from d660e33 to 762b011 Compare September 14, 2026 18:32
@lmeyerov lmeyerov changed the title docs(gfql): start-here nav with perf/reference hubs; result-first benchmark pages docs(gfql): publish final performance results and simplify engine guides Sep 14, 2026
@lmeyerov
lmeyerov marked this pull request as ready for review September 14, 2026 18:33
lmeyerov and others added 10 commits September 15, 2026 03:15
…chmark pages

- gfql/index: Start Here (about, overview, quick, cypher) + Guides hubs
  gfql/perf/index and gfql/reference/index + Developer Resources; no page
  moved, URLs unchanged; loading_graph_data joins the reference hub
- benchmark_filter_pagerank, benchmark_graphframes: lede states result and
  engine to use; one "Method and limits" section; numbers unchanged and
  re-verified against bench cells / results.json; Cypher comments use //
- CHANGELOG: [Development] / Docs

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…provenance block

- overview: positioning paragraph (only open-source in-process Cypher on
  dataframes; columnar/vectorized framing); remove empty hidden toctree that
  rendered the page as a folder; trim marketing wording
- benchmark_filter_pagerank: retitle as a case study, list it under Start
  Here; lede says what is compared and the outcome; drop the above-the-fold
  caveat paragraph; add a pipeline lead sentence
- benchmark_graphframes: lede says what is compared and the 7-of-8 outcome;
  add per-task bar charts rendered from results.json by gfql_bench_charts.py
  (byte-reproducible, covered by the chart sync test)
- _ext/gfql_bench: bench-provenance accepts several runs and renders one
  Measurement block (reader-facing fields only; caveats folded in via
  :disclosures:)
- vendor pyg-bench published numbers (runtime strings now name the RAPIDS base
  image; pyg-bench #220); numbers unchanged

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…e 6/8); wrap chart strings

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…engines table, tested Cypher twins

- index: Start Here = about, overview, speedup case study; quick + cypher
  head the Language Reference hub (spec linked)
- benchmark_filter_pagerank: "Speedup Case Study" title
- indexing / index_adjacency: plain-language titles and cross-refs
- overview: one "Why GFQL?" list (was Why + Key Features), engine-design and
  launch blog links
- engines: opening note boxes folded into prose; "coming from" table with
  concrete change + measurement pointer; Memgraph row; PuppyGraph removed;
  section "Parity and fallback rules"
- about: examples 3-7 gain tested Cypher twins; example 4 pattern now returns
  rows on the sample graph; sample-graph block is executable in the doc lane
- slop words removed across gfql pages (leverage/seamless/honest/powerful/
  critical gap); no numbers added

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…NB matrix; cell-derived tallies; drift enforcement

- vendor pyg-bench published/docs-numbers.json @ main 7426456 (relane board
  with Kuzu/Memgraph/Neo4j, snb_aligned SF0.1/SF1, drift waivers)
- _ext/gfql_bench_data: :bench-tally: (strict "N of M" from cells, registers
  refs) and max_compute_commit_drift enforcement via git rev-list on
  graphistry/compute, honoring policy.drift_waivers; None on shallow clones
- performance.rst: no release-pinned headings; legacy untraceable literals
  removed; SNB tables with losses stated; five-engine q1-q9 boards; single
  Measurement block with caveats; q8 rendered as a result (cold binding)
- overview: where GFQL wins and where databases win, with links
- tests: tally, drift (fail / waived / unknown), vendored runs within policy

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…s diagnostic

- vendor pyg-bench published numbers with results/filter-pagerank-059-20260904
  (GFQL CPU/GPU re-measured at 3fb216d under the pinned PageRank contract)
- lede states CPU-vs-Neo4j on both graphs and the Twitter GPU ratio; the
  GPlus GPU time renders via :bench-diag: with the selection caveat, and no
  GPlus GPU-vs-CPU ratio is claimed; alt texts follow the cells
- gplus_pipeline chart drops the withdrawn ratio annotation

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
Vendor the pyg-bench publication (graphbench-q1q9-{20k,100k}-20260904:
pandas, polars, polars-gpu at 3fb216d; Memgraph/Neo4j lanes of 2026-08-12).
performance.rst gains the polars-gpu column, tallies for GPU-vs-CPU and
GFQL-vs-each-database, and names every loss (Kuzu q4/q8, Memgraph q3/q5/q6/q7,
Neo4j q5, GPU q8). Provenance block retargeted to the new runs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…e the PageRank solver

Vendor pyg-bench's GraphFrames ladder publication (LiveJournal and Orkut:
host-Spark GraphFrames baselines, GFQL GPU PageRank with the solver stage as
a component cell, and the released code's LJ filter/hop rows as diagnostic
cells behind #2023). The page now prints cells only, with one multi-run
provenance block; the June saved results and the stale parity file are
gone. The chart generator reads the ladder cells (no results.json), draws
the solver share as the solid part of each GFQL PageRank bar and the rest
of the query as the light part, marks unmeasured systems, and is tested on
a synthetic ladder. Friendster is named as the next rung with the reason it
waits on #2024.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…ly with a label

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
lmeyerov and others added 21 commits September 15, 2026 03:15
…he measured ceiling

Vendor pyg-bench's second ladder publication: GFQL filter/hop cells and
ratios for LiveJournal and Orkut at the head of #2024 (disclosed as
pre-landing in the provenance block), and the Friendster rung (1.8B edges,
filter + 1-hop on the CPU streaming path, 106 GB peak of a 119 GB host).
The page opens with that ceiling, prints wins and losses side by side
(GPU PageRank 18.3x/12.5x; CPU faster on filter and 1-hop; GraphFrames
wins 2-hop on both graphs; the GPU streaming executor loses every hop),
gains a Friendster table and chart, and keeps the released code's 2-hop
as a diagnostic before-state sentence.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…nt (T2.9.10)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…ntence from the performance lede (review round 4: A5, B2)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
… a Fastest column

Review round 4: the q1-q9 and SNB boards made the reader compare digits to
see who won. bench-board renders a board from published cells (same gate as
the :bench: role), bolds the fastest cell on each row, names it in a last
column, and prints a dash for a system that has no number for that query.
The four boards on the performance page now use it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…ocks; values unchanged)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…rs) and say where the loss comes from

Review round 4: the published GFQL SNB column ran without indexes while the
databases ran with theirs. The boards now print the indexed pandas and
polars arms (pyg-bench snb-aligned-indexed-20260904) next to Kuzu, Neo4j
and Memgraph; the prose says the index engages only on the hop-shaped
rows (2.5-3x there) and that the point lookups keep a ~20 ms per-call
floor in the chain pipeline (#2027). The un-indexed run stays in the
provenance block as the before-state.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
…ger-vs-streaming and igraph-conversion answers

Re-vendors pyg-bench docs-numbers (batch C/D): CPU PageRank cells for LiveJournal and
Orkut (GraphFrames wins; solver share shown), Friendster 2-hop cell, Friendster ceiling
text (GPU stops at 1-hop, PageRank does not fit on either path), engine guidance for CPU
PageRank (#2032), streaming-vs-eager note; charts regenerated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh1i1
…ures in GiB from the receipts

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh1i1
… and the gates added

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh1i1
…index-resolved seeds

Vendors pyg-bench published/docs-numbers.json at main 5cf81ae (byte-identical):
the SF0.1 indexed GFQL cells come from the #2038 head with the pre-landing
disclosure, SF1 stays the release measurement. The SNB prose states the
native op-list arm, where the resident indexes now engage, the hop rows they
do not change, and the open issues behind the remaining gaps. Release-notes
Performance paragraph names the native seed resolution and the sentinel's
native op-list points.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RhboAkmjP5eXbCCkX1BMt
…(pyg-bench #249)

docs/source/_data/gfql_benchmarks.json = pyg-bench published/docs-numbers.json
after the release close-out re-measure at pygraphistry master 5a6586f (SNB
SF0.1/SF1 arms, q1-q9 20k/100k boards); provenance directive names the master
runs; the SNB pre-landing disclosure is gone (both scales are the release
measurement) and the GraphFrames ladder note says the fix has since landed
without a re-run.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QztW7jYsDd66e8rb8pJNQA
…tent, docs-review editorial policy

engines: one keyword section replaces the duplicated opening and switching sections; footnote citations folded into the decision table and three plain rules; 'when not to use Polars' merged into the table; parity section cut to three bullets; internal process prose removed; competitor table states benefits; plain sentences in the memory note. perf hub: case study first, then the boards, then a separate track for getting the speed on your data, with a reference list. agents/skills/docs-review: the editorial policy (plain language, jargon table, AI-writing tells, review procedure).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HdYcPgiafGGutW9KfG3gg1
…run records, identical results)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HdYcPgiafGGutW9KfG3gg1
…measure (pyg-bench #251); board prose follows the new verdicts

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HdYcPgiafGGutW9KfG3gg1
@lmeyerov
lmeyerov force-pushed the docs/gfql-nav-and-benchmark-copy branch from 048b454 to a489e9a Compare September 15, 2026 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant