knut
A pure-Rust columnar ↔ graph fabric — read/write Apache GraphAr, bulk-load FalkorDB, and serve Cypher over Arrow Flight SQL, with Bifröst streaming Iceberg tables into a live graph by CDC (Spark-Connect or Spark-free). One Arrow pipe from the lakehouse to a queryable graph.
⚡ part of the nordisk constellation
Mashup — one Arrow pipe: columnar lake → live graph
knut carries graph data the whole way from a columnar lake to a live, queryable graph in one Arrow pipe (no JVM required) — the rows marked NA are categories the rivals have no concept for:
| capability | knut | GraphAr (official) | Neo4j / GDS | Spark + GraphFrames |
| Pure-Rust GraphAr — 5 formats (Parquet/CSV/ORC/JSON/Arrow), local or object store | ✅ | ◐ (C++/Java/Py) | ✗ | ◐ |
| Cypher over Arrow Flight SQL server — ADBC / Power BI / DataFusion clients, Arrow out | ✅ | NA | ◐ | ✗ |
Iceberg → graph CDC fabric — snapshot-incremental + changelog (_change_type → MERGE / DETACH DELETE) |
✅ | NA | ✗ | ◐ |
Spark-free Iceberg ingestion (skade IcebergSource, no JVM) |
✅ | NA | ✗ | ✗ |
Bulk columnar RecordBatch → live graph DB (FalkorDB UNWIND/CREATE) |
✅ | ◐ | ✅ | ✅ |
| Mature graph-algorithm library + production graph engine | ◐ | ✗ | ✅ | ✅ |
Rows marked NA: the rival has no such category. The measured numbers are below.
Benchmarks
The Arrow pipe — knut's own arms
Storage formats round-tripped through the GraphAr writer/reader, the Bifröst CDC fabric, the FalkorDB bulk path, and the Thund streaming window operators.
telem_cores_busy_avg is the average number of CPU cores busy while the arm ran — a single-digit value on a 32-core host means the arm is serial by construction, not that the box was idle. Blank cells are metrics that arm does not report.
Borrowed arms — nornir's own suite, measured here by accident
These arms measure nornir, not knut. knut/xtask pins nornir = "0.5" from crates.io, and that published runner predates the NORNIR_BENCH_ONLY arm filter — so the filter was accepted and silently ignored, and nornir's suite ran alongside knut's. They are kept in their own table so they can never be read as knut's numbers; the fix is a newer runner, not an edit to this file.
SQL for Power BI lives next door (2026-09-09)
knut's Flight SQL server (graphar-flight) speaks Cypher — the graph. Power BI, the Arrow Flight SQL ODBC driver and ADBC speak SQL, and that dialect is skade-flight in the skade repo: DataFusion over the Iceberg warehouse, streamed Arrow, ODBC escapes translated, 129 Power Query statement shapes green. Two dialects, two services, one wire; korp mounts both. The knut bridge — graph tables as DataFusion table providers in that same session — is the next step, not done.
Read the real docs
- 📖 The complete manual —
docs/manual.pdf— every subsystem chapter (graphar, graphar-falkordb, graphar-flight, Bifröst, pipelines) plus the test & bench matrix. - 📄 Full overview —
.nornir/README-full.md— the detailed pitch, architecture, quickstart, per-crate reference, and the full test matrix. - 📝
docs/book.md— the manual, as Markdown. Search it withnornir docs search knut "<query>".