[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"readme:minigraf":3},"\u003Ch1>Minigraf\u003C\u002Fh1>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fcrates.io\u002Fcrates\u002Fminigraf\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fcrates\u002Fv\u002Fminigraf.svg\" alt=\"crates.io\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Fminigraf\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fdocs.rs\u002Fminigraf\u002Fbadge.svg\" alt=\"docs.rs\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Factions\u002Fworkflows\u002Frust.yml\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Factions\u002Fworkflows\u002Frust.yml\u002Fbadge.svg\" alt=\"Build Status\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Factions\u002Fworkflows\u002Flint.yml\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Factions\u002Fworkflows\u002Flint.yml\u002Fbadge.svg\" alt=\"Lint Status\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fcodecov.io\u002Fgh\u002Fproject-minigraf\u002Fminigraf\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fcodecov.io\u002Fgh\u002Fproject-minigraf\u002Fminigraf\u002Fbranch\u002Fmain\u002Fgraph\u002Fbadge.svg\" alt=\"Coverage\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf#license\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT%20OR%20Apache--2.0-blue.svg\" alt=\"License: MIT OR Apache-2.0\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fdoc.rust-lang.org\u002Fedition-guide\u002Frust-2024\u002Findex.html\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Frust-2024-orange.svg\" alt=\"Rust Edition\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Fblob\u002FHEAD\u002FCargo.toml\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FMSRV-1.89-orange.svg\" alt=\"MSRV\" \u002F>\u003C\u002Fa>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Embedded graph memory for AI agents, mobile apps, and the browser\u003C\u002Fstrong> — the SQLite of bi-temporal graph databases\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>A tiny, self-contained graph database with \u003Cstrong>Datalog queries\u003C\u002Fstrong> and \u003Cstrong>bi-temporal time travel\u003C\u002Fstrong>. Think SQLite, but for connected data with full history.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fminigraf-playground.vercel.app\u002F\" rel=\"nofollow ugc noopener\">Try it in your browser — no install needed →\u003C\u002Fa>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fproject-minigraf.github.io\u002Fminigraf-visualizer\u002F#sample=careers&amp;tx=7&amp;e=:alice&amp;view=map\" rel=\"nofollow ugc noopener\">Watch time travel in the visualizer →\u003C\u002Fa>\u003C\u002Fstrong> Scrub transaction time and valid time, and see the graph change.\u003C\u002Fp>\n\u003Ch2>Vision\u003C\u002Fh2>\n\u003Cp>Minigraf is a \u003Cstrong>single-file embedded graph database\u003C\u002Fstrong> that lets you:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>✅ \u003Cstrong>Query relationships with Datalog\u003C\u002Fstrong> - Recursive rules, natural graph traversal\u003C\u002Fli>\n\u003Cli>✅ \u003Cstrong>Time travel through history\u003C\u002Fstrong> - Bi-temporal queries (transaction time + valid time)\u003C\u002Fli>\n\u003Cli>✅ \u003Cstrong>Window functions\u003C\u002Fstrong> - \u003Ccode>sum\u002Fcount\u002Fmin\u002Fmax\u002Favg\u002Frank\u002Frow-number :over (partition-by … :order-by …)\u003C\u002Fcode> in \u003Ccode>:find\u003C\u002Fcode> clauses\u003C\u002Fli>\n\u003Cli>✅ \u003Cstrong>Prepared statements\u003C\u002Fstrong> - Parse + plan once with \u003Ccode>$slot\u003C\u002Fcode> bind tokens, execute thousands of times\u003C\u002Fli>\n\u003Cli>✅ \u003Cstrong>Embed anywhere\u003C\u002Fstrong> - Native, WASM, mobile, IoT - one \u003Ccode>.graph\u003C\u002Fcode> file\u003C\u002Fli>\n\u003Cli>✅ \u003Cstrong>Zero configuration\u003C\u002Fstrong> - Just \u003Ccode>Minigraf::open(\"data.graph\")\u003C\u002Fcode> and you're done\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Status\u003C\u002Fstrong>: See \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Fblob\u002FHEAD\u002FROADMAP.md\" rel=\"nofollow ugc noopener\">ROADMAP.md\u003C\u002Fa> for planned work and current direction.\u003C\u002Fp>\n\u003Cp>In v2, the ordinary aggregates are \u003Ccode>count\u003C\u002Fcode>, \u003Ccode>count-distinct\u003C\u002Fcode>, \u003Ccode>sum\u003C\u002Fcode>, \u003Ccode>sum-distinct\u003C\u002Fcode>, \u003Ccode>min\u003C\u002Fcode> and \u003Ccode>max\u003C\u002Fcode>. Average is available only as a window function, for example \u003Ccode>(avg ?score :over (:order-by ?score))\u003C\u002Fcode> (#777).\u003C\u002Fp>\n\u003Ch2>Why Datalog?\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Datalog is fundamentally better for graphs than SQL-like languages:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Recursive by design\u003C\u002Fstrong> - Multi-hop traversals are natural, not an afterthought\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Simpler to implement\u003C\u002Fstrong> - Smaller spec = more reliable, faster to production\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Perfect for temporal\u003C\u002Fstrong> - Time is just another dimension in relations\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Proven at scale\u003C\u002Fstrong> - 40+ years of research, production use (Datomic, XTDB)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Graph-native\u003C\u002Fstrong> - Facts (Entity-Attribute-Value) are literally edges\u003C\u002Fli>\n\u003Cli>\u003Cstrong>LLM-friendly\u003C\u002Fstrong> - The small, uniform grammar (\u003Ccode>[?e :attr ?v]\u003C\u002Fcode> patterns, no JOIN variants, no subquery nesting) is easy for AI coding assistants to generate correctly from a few examples; the entire language fits in a system prompt\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2>Installation\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-toml\">[dependencies]\nminigraf = \"2.0.11\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Or via cargo:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sh\">cargo add minigraf\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Requires Rust 1.89 or newer (the minimum supported Rust version, set in \u003Ccode>Cargo.toml\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch2>Known issues\u003C\u002Fh2>\n\u003Cp>Bugs present in the current release, with affected versions, workarounds and fix versions, are listed in the pinned \u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Fissues\u002F421\" rel=\"nofollow ugc noopener\">Known issues in the current release\u003C\u002Fa>\u003C\u002Fstrong> issue. The most important one on v2.x:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Two values of the same attribute for one entity written in a single \u003Ccode>transact\u003C\u002Fcode> (or retracted in a single \u003Ccode>retract\u003C\u002Fcode>) can read back as one value (\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fproject-minigraf\u002Fminigraf\u002Fissues\u002F371\" rel=\"nofollow ugc noopener\">#371\u003C\u002Fa>). Write or retract each value of a multi-valued attribute in its own call. The fix\u003C\u002Fli>\n\u003C\u002Ful>\n",1793926095593]