docs(gfql): start-here nav with perf/reference hubs; result-first benchmark pages - #2017
docs(gfql): start-here nav with perf/reference hubs; result-first benchmark pages#2017lmeyerov wants to merge 29 commits into
Conversation
41bf7fe to
350ef4b
Compare
350ef4b to
cab184f
Compare
|
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. |
|
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). |
|
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. |
…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
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
…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
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
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
…4j run) 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
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh1i1
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
090ad9e to
60d39f0
Compare
|
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 |
|
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. |
…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
|
Editorial pass 1 (owner items 1–5, 7–12 on engines; 6 started) at 3dbf8fc. Preview rebuilds from this head in a few minutes:
|
…run records, identical results) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HdYcPgiafGGutW9KfG3gg1
|
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. |
…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
|
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. |
Summary
Docs-only. Base is
masterbecausedevelopwas promoted and deleted in #2016. Two changes to the GFQL docs, no page moves, no product code, no benchmark numbers changed.1. GFQL navigation: short start path + two hubs.
gfql/indexhad one 22-entry User Guide toctree. It now has:Guides: Performance and Benchmarks (
gfql/perf/index: engines, performance, indexing, index_adjacency, remote, both benchmark pages), Language Reference (gfql/reference/index: where, return, predicates, datetime_filtering, builtin_calls, combo, translate, policy, strict_mode, schema, wire_protocol_examples, loading_graph_data)Developer Resources: spec, validation (unchanged)
Every existing URL is unchanged: the hubs are new index pages that list the existing files, so first-time readers see four pages and experienced readers expand a hub.
gfql/loading_graph_datawas not in any toctree before; it now sits in the reference hub. The bench-number policy pinsgfql/index.rstandgfql/benchmark_filter_pagerank.rstby path, which is another reason not to move files.2. Benchmark pages: result first, one limits section, plain technical English.
gfql/benchmark_filter_pagerankandgfql/benchmark_graphframesnow open with the measured outcome and which engine to use, and move all measurement rules into one "Method and limits" section per page. Removed: repeated inline caveats, self-referential wording ("honest", "stated plainly", "documented, not hidden"), triple restatement of the same numbers, and the trailing "What this shows / Why this matters / For more" sections. Sentences are short and active.Numbers: unchanged. The filter/PageRank page still prints every figure through
:bench:roles with bothbench-provenanceblocks andbench-disclosures. Every GraphFrames literal was re-derived fromgfql/_static/graphframes/results.json(ratios recompute to the published 43x/7.4x/2.3x/14.7x/0.33x and 42x/8.7x/1.3x/10.5x/0.23x). Two edits to unverifiable text: the host memory is now "about 120 GB" (the exact 119 GB figure has no source in the repo), and Friendster node/edge counts cite SNAP. The Cypher example's--comments are now//(valid Cypher; removes a Sphinx lexer warning).Follow-up (not in this PR): migrating the GraphFrames literals to
:bench:cells needs a new exporter kind in pyg-bench.Validation
rstcheck --config docs/.rstcheck.cfgon all five touched.rst: cleanpython -m pytest docs/test_bench_numbers.py: 26 passedsphinx-build -b html(Sphinx 9.1, no Docker): exit 0; zero warnings on touched pages; remaining warnings are pre-existing (missingdemos/in a bare checkout, API duplicate targets)gfql/page is in exactly one toctree (scripted check over 36 pages); rendered sidebar matches the table above## [Development]→### Docstest-docslane skipped because itneeds: python-lint-types, which skips on docs-only changes (pre-existing workflow gap, not changed here). The Read the Docs PR build is the CI evidence for this PR.Slop audit criteria followed the anti-style guide in
~/Work/research/ai-slop-anti-guide(result first, no self-assessment residue, one caveat per claim, named comparison scope).Owner review wave (second commit)
gfql/overview: opens with the positioning (only open-source in-process Cypher on dataframes; columnar/vectorized framing alongside DuckDB/ClickHouse); the empty hidden toctree that made the page render as a folder is removed.livejournal_tasks.svg,orkut_tasks.svg) are rendered fromresults.jsonbygfql_bench_charts.pyunder the same sync test as the Neo4j charts.bench-provenanceaccepts several run ids and renders one Measurement block with reader-facing fields only and caveats folded in; the separate "About these measurements" box is gone from this page. Run provenance strings now lead with the RAPIDS base image (pyg-bench [BUG] Neptune p3.16 instance does not start #220, vendored byte-identical).Wave 3 (owner review, 2026-09-04)
policy.max_compute_commit_driftagainst the checkout (git history permitting; per-run waivers with reasons ride in the artifact), and a new:bench-tally:role derives "N of M queries faster" from cells so counts never go stale by hand.gfql/performance: no release-pinned headings; every hand-typed legacy figure removed; SNB tables with the databases' wins stated; five-engine q1–q9 boards; one Measurement block.aboutexamples 3–7 gain tested Cypher twins (example 4 now returns rows on its own sample graph); marketing filler removed.Wave 3 evidence (2026-09-04, commits a3e4e91 + 751b37b)
polars-gpucolumn (pyg-bench ci(mypy) #222/[FEA] Remote hypergraph #230):performance.rstprints tallies (GFQL Polars beats Kuzu 8/9 at 20k and 8/9 at 100k; Memgraph 7/9 and 6/9; Neo4j 9/9 and 8/9; GPU beats CPU 4/9 at 100k) and names every loss, including GPU q8 at 100k.benchmark_graphframes.rstnow prints cells only — host-Spark GraphFrames baselines for LiveJournal and Orkut, GFQL GPU PageRank with the cuGraph solver stage split out (shaded in the charts: LJ 890.9 ms query / 59.3 ms solver, 18.3x vs GraphFrames; Orkut 2,795.7 ms / 151.4 ms, 12.5x), and the released code's LJ filter/hop rows as diagnostic cells. The Juneresults.jsonand the parity file are removed; charts render from cells and are tested on a synthetic ladder.bench-provenanceblock over both ladder runs.bench-tally(this PR), PR-template checklist and a fixed load-breach classifier in pyg-bench (Dev/hypergraph fixes #231, [FEA] RDF/sparql support - neptune, ... #234).docs/test_bench_numbers.py36 passed; RTD preview checked in Chrome after build.🤖 Generated with Claude Code
https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1