Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/knut

.nornir/README.md

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