<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url><loc>https://smollergraph.nenuadrian.com/</loc><lastmod>2026-10-24</lastmod></url>
<url><loc>https://smollergraph.nenuadrian.com/about/</loc></url>
<url><loc>https://smollergraph.nenuadrian.com/ep001-graph-databases/</loc><lastmod>2026-10-21</lastmod><image:image><image:loc>https://i.ytimg.com/vi/DFNrCJRnUac/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/DFNrCJRnUac/maxresdefault.jpg</video:thumbnail_loc><video:title>How graph databases work: Neo4j and Kùzu | Building smollerGraph #1</video:title><video:description>We start a series that builds smollerGraph, a small graph database, from scratch in C++, heading towards a knowledge graph that mvGPT can ask for facts. Before writing any code, we look at the property graph model, why following relationships beats joining tables for queries that walk many hops, and Cypher, on a small graph about animals. Then we run a food chain query on Neo4j and Kùzu, compare how each of them keeps its graph, and write a first graph in C++, kept in memory, with a walk down the food chain and GoogleTest tests.</video:description><video:player_loc>https://www.youtube.com/embed/DFNrCJRnUac</video:player_loc><video:duration>1971</video:duration><video:publication_date>2026-10-21</video:publication_date><video:tag>graph database</video:tag><video:tag>knowledge graph</video:tag><video:tag>neo4j</video:tag><video:tag>kuzu</video:tag><video:tag>kùzu</video:tag><video:tag>cypher</video:tag><video:tag>gql</video:tag><video:tag>property graph</video:tag><video:tag>database internals</video:tag><video:tag>index-free adjacency</video:tag><video:tag>csr</video:tag><video:tag>embedded database</video:tag><video:tag>bloodhound</video:tag><video:tag>cybersecurity</video:tag><video:tag>ldbc</video:tag><video:tag>c++</video:tag><video:tag>from scratch</video:tag><video:tag>smollergraph</video:tag><video:tag>mvgpt</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep002-pages-on-disk/</loc><lastmod>2026-10-21</lastmod><image:image><image:loc>https://i.ytimg.com/vi/oi8U7nDbq1U/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/oi8U7nDbq1U/maxresdefault.jpg</video:thumbnail_loc><video:title>Graph database in C++: pages on disk | Building smollerGraph #2</video:title><video:description>We move smollerGraph&#39;s graph out of memory and onto disk, in pages of 4 KiB that a pager reads and writes, the way SQLite&#39;s file format does. Nodes and relationships become 32-byte records in those pages, with each node at the head of a chain of its relationships, as in Neo4j&#39;s record format, and the tests from episode one pass without a change. Along the way the code gets a Docker build and GitHub Actions, and sg load and sg walk keep the graph in a folder between runs.</video:description><video:player_loc>https://www.youtube.com/embed/oi8U7nDbq1U</video:player_loc><video:duration>1742</video:duration><video:publication_date>2026-10-21</video:publication_date><video:tag>graph database</video:tag><video:tag>c++</video:tag><video:tag>storage engine</video:tag><video:tag>pages</video:tag><video:tag>fixed-size records</video:tag><video:tag>record store</video:tag><video:tag>index-free adjacency</video:tag><video:tag>pread</video:tag><video:tag>pwrite</video:tag><video:tag>docker</video:tag><video:tag>github actions</video:tag><video:tag>googletest</video:tag><video:tag>database internals</video:tag><video:tag>from scratch</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep003-how-slow-is-it/</loc><lastmod>2026-10-21</lastmod><image:image><image:loc>https://i.ytimg.com/vi/8yGPJej4jGQ/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/8yGPJej4jGQ/maxresdefault.jpg</video:thumbnail_loc><video:title>Graph database benchmark: Neo4j vs Kùzu | Building smollerGraph #3</video:title><video:description>We measure smollerGraph against Neo4j and Kùzu on a made-up social graph of a hundred thousand people and a million relationships, generated with a fixed seed so each machine gets an identical one. sg load reports how long loading takes, a new sg bench command times a two-hop walk from a thousand people, and a Python script loads the graph into Kùzu and Neo4j, in Docker, to ask them for those people too. We chart the results and go through why smollerGraph is slow where it&#39;s slow, and quick where it&#39;s quick, for now.</video:description><video:player_loc>https://www.youtube.com/embed/8yGPJej4jGQ</video:player_loc><video:duration>1220</video:duration><video:publication_date>2026-10-21</video:publication_date><video:tag>graph database</video:tag><video:tag>benchmark</video:tag><video:tag>neo4j</video:tag><video:tag>kuzu</video:tag><video:tag>kùzu</video:tag><video:tag>c++</video:tag><video:tag>cypher</video:tag><video:tag>database performance</video:tag><video:tag>two-hop query</video:tag><video:tag>storage engine</video:tag><video:tag>social graph</video:tag><video:tag>from scratch</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep004-drawing-the-graph/</loc><lastmod>2026-10-22</lastmod><image:image><image:loc>https://i.ytimg.com/vi/n5onlxgmHaY/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/n5onlxgmHaY/maxresdefault.jpg</video:thumbnail_loc><video:title>Graph visualization in the browser with D3.js | Building smollerGraph #4</video:title><video:description>We give smollerGraph a UI of its own, after its code gets checked on each push by cpplint, against Google&#39;s style guide, and by clang-tidy, and its errors move to Abseil&#39;s absl::Status. A new sg serve command answers HTTP requests with the graph as JSON, through cpp-httplib, and a page in the browser draws it with D3&#39;s force simulation. A walk lights up the nodes each hop reaches, and clicking a node opens an inspector that shows its record as it&#39;s kept on disk, with its page, its offset, its bytes and its chain of relationships.</video:description><video:player_loc>https://www.youtube.com/embed/n5onlxgmHaY</video:player_loc><video:duration>2961</video:duration><video:publication_date>2026-10-22</video:publication_date><video:tag>graph visualization</video:tag><video:tag>d3</video:tag><video:tag>d3.js</video:tag><video:tag>abseil</video:tag><video:tag>absl status</video:tag><video:tag>cpplint</video:tag><video:tag>clang-tidy</video:tag><video:tag>force directed graph</video:tag><video:tag>graph database</video:tag><video:tag>c++</video:tag><video:tag>cpp-httplib</video:tag><video:tag>http server</video:tag><video:tag>json api</video:tag><video:tag>svg</video:tag><video:tag>javascript</video:tag><video:tag>neo4j browser</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep005-buffer-pool/</loc><lastmod>2026-10-22</lastmod><image:image><image:loc>https://i.ytimg.com/vi/CVeog8Y-Y8A/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/CVeog8Y-Y8A/maxresdefault.jpg</video:thumbnail_loc><video:title>Database buffer pool in C++: keeping pages in memory | Building smollerGraph #5</video:title><video:description>We give smollerGraph a buffer pool, the part of a database that keeps pages in memory, after counting the pages it reads and writes. Loading a million relationships read and wrote over six million of them, a system call each. The pool has frames, a page table, pins and dirty pages, and a clock that picks the page to evict. A latch keeps sg serve&#39;s threads out of each other&#39;s way, and we measure it all again against Neo4j and Kùzu, and look at why databases keep a pool of their own instead of using mmap.</video:description><video:player_loc>https://www.youtube.com/embed/CVeog8Y-Y8A</video:player_loc><video:duration>1290</video:duration><video:publication_date>2026-10-22</video:publication_date><video:tag>buffer pool</video:tag><video:tag>database internals</video:tag><video:tag>page cache</video:tag><video:tag>clock algorithm</video:tag><video:tag>cache eviction</video:tag><video:tag>c++</video:tag><video:tag>graph database</video:tag><video:tag>mmap</video:tag><video:tag>storage engine</video:tag><video:tag>neo4j</video:tag><video:tag>kuzu</video:tag><video:tag>database performance</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep006-name-index/</loc><lastmod>2026-10-22</lastmod><image:image><image:loc>https://i.ytimg.com/vi/enZnr29PbZQ/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/enZnr29PbZQ/maxresdefault.jpg</video:thumbnail_loc><video:title>B+ tree index in C++: finding a node by name | Building smollerGraph #6</video:title><video:description>We give smollerGraph an index on names, a B+ tree in a file of its own, read through the buffer pool, so opening a graph no longer reads each node to build a map of names in memory. Its leaves hold the names in order, the pages above them say which page holds which names, and splits grow it a level at a time. The graph finds nodes through it, the UI suggests names as they&#39;re typed, and we measure what the index gives and what it costs.</video:description><video:player_loc>https://www.youtube.com/embed/enZnr29PbZQ</video:player_loc><video:duration>1284</video:duration><video:publication_date>2026-10-22</video:publication_date><video:tag>b+ tree</video:tag><video:tag>btree</video:tag><video:tag>database index</video:tag><video:tag>database internals</video:tag><video:tag>c++</video:tag><video:tag>graph database</video:tag><video:tag>buffer pool</video:tag><video:tag>storage engine</video:tag><video:tag>autocomplete</video:tag><video:tag>prefix search</video:tag><video:tag>neo4j</video:tag><video:tag>kuzu</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep007-cypher-subset/</loc><lastmod>2026-10-22</lastmod><image:image><image:loc>https://i.ytimg.com/vi/-Q3X6d6g7Gk/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/-Q3X6d6g7Gk/maxresdefault.jpg</video:thumbnail_loc><video:title>Writing a Cypher query parser and planner in C++ | Building smollerGraph #7</video:title><video:description>We teach smollerGraph a subset of Cypher, the query language Neo4j and Kùzu speak, starting from a lexer and a recursive descent parser for MATCH patterns and what they RETURN. A planner turns a pattern into steps named after Neo4j&#39;s operators, a NodeIndexSeek through our B+ tree when the start has a name, an AllNodesScan when it doesn&#39;t, and an Expand for each hop, and EXPLAIN shows them. An executor runs the plan, sg query prints the answers, and the UI gets a query box for the questions we asked Neo4j in episode one.</video:description><video:player_loc>https://www.youtube.com/embed/-Q3X6d6g7Gk</video:player_loc><video:duration>1703</video:duration><video:publication_date>2026-10-22</video:publication_date><video:tag>cypher</video:tag><video:tag>query parser</video:tag><video:tag>query planner</video:tag><video:tag>recursive descent parser</video:tag><video:tag>lexer</video:tag><video:tag>query execution</video:tag><video:tag>graph database</video:tag><video:tag>c++</video:tag><video:tag>neo4j</video:tag><video:tag>kuzu</video:tag><video:tag>explain plan</video:tag><video:tag>database internals</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep008-deploy/</loc><lastmod>2026-10-22</lastmod><image:image><image:loc>https://i.ytimg.com/vi/IciL4H_Vne8/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/IciL4H_Vne8/maxresdefault.jpg</video:thumbnail_loc><video:title>Deploying a graph database to a VPS with Docker | Building smollerGraph #8</video:title><video:description>We put smollerGraph on a VPS with a small script, deploy.sh, which sends the committed code over SSH, and Docker Compose builds it there and runs it in two containers. Caddy serves the page and passes the API&#39;s requests on to sg serve, which nothing outside can reach. Then we open the UI from anywhere, walk the food chain, inspect a record and ask a question in Cypher, all on the server.</video:description><video:player_loc>https://www.youtube.com/embed/IciL4H_Vne8</video:player_loc><video:duration>532</video:duration><video:publication_date>2026-10-22</video:publication_date><video:tag>deployment</video:tag><video:tag>vps</video:tag><video:tag>docker</video:tag><video:tag>docker compose</video:tag><video:tag>ssh</video:tag><video:tag>caddy</video:tag><video:tag>reverse proxy</video:tag><video:tag>graph database</video:tag><video:tag>c++</video:tag><video:tag>dreamhost</video:tag><video:tag>self hosting</video:tag><video:tag>devops</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep009-properties/</loc><lastmod>2026-10-24</lastmod><image:image><image:loc>https://i.ytimg.com/vi/_mgZeulSdyg/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/_mgZeulSdyg/maxresdefault.jpg</video:thumbnail_loc><video:title>Property graph storage and WHERE in C++ | Building smollerGraph #9</video:title><video:description>We give smollerGraph&#39;s nodes and relationships properties, kept as in Neo4j&#39;s record format: a third file of 32-byte records, each with a key, a value and the next property&#39;s id, so a node&#39;s properties form a chain, like its relationships. The facts we load get properties in braces, read by our Cypher parser, and Cypher gets WHERE, with each filter planned as early as it can run, and RETURN of any property. The UI&#39;s inspector shows a node&#39;s properties as they&#39;re kept on disk, and we check what they cost a walk.</video:description><video:player_loc>https://www.youtube.com/embed/_mgZeulSdyg</video:player_loc><video:duration>2269</video:duration><video:publication_date>2026-10-24</video:publication_date><video:tag>graph database</video:tag><video:tag>property graph</video:tag><video:tag>properties</video:tag><video:tag>cypher</video:tag><video:tag>where clause</video:tag><video:tag>query planner</video:tag><video:tag>predicate pushdown</video:tag><video:tag>storage engine</video:tag><video:tag>record format</video:tag><video:tag>c++</video:tag><video:tag>neo4j</video:tag><video:tag>kuzu</video:tag><video:tag>database internals</video:tag><video:tag>smollergraph</video:tag></video:video></url>
<url><loc>https://smollergraph.nenuadrian.com/ep010-a-real-graph/</loc><lastmod>2026-10-24</lastmod><image:image><image:loc>https://i.ytimg.com/vi/Y0RBey5eKms/maxresdefault.jpg</image:loc></image:image><video:video><video:thumbnail_loc>https://i.ytimg.com/vi/Y0RBey5eKms/maxresdefault.jpg</video:thumbnail_loc><video:title>Canvas vs SVG: drawing a Wikidata graph | Building smollerGraph #10</video:title><video:description>We load a real graph into smollerGraph: the mammals and birds on Wikidata, 21,834 species, genera, families, orders and classes. Their names don&#39;t fit, so nodes and properties get records of 64 bytes, and nodes get a label, which our facts and our Cypher learn to read. The page we built would draw every node with SVG, so we redo it: it draws what a query returns on a canvas, with a table, a plan, a history, a search and an inspector, and the server says what each query cost. Then we measure SVG against a canvas in Chromium, from 500 nodes to 20,000.</video:description><video:player_loc>https://www.youtube.com/embed/Y0RBey5eKms</video:player_loc><video:duration>2546</video:duration><video:publication_date>2026-10-24</video:publication_date><video:tag>graph visualization</video:tag><video:tag>canvas</video:tag><video:tag>svg</video:tag><video:tag>d3</video:tag><video:tag>d3-force</video:tag><video:tag>force directed graph</video:tag><video:tag>wikidata</video:tag><video:tag>knowledge graph</video:tag><video:tag>sparql</video:tag><video:tag>taxonomy</video:tag><video:tag>graph database</video:tag><video:tag>c++</video:tag><video:tag>neo4j browser</video:tag><video:tag>cypher</video:tag><video:tag>smollergraph</video:tag></video:video></url>
</urlset>
