# Graph Store: modernc.org/sqlite ## Ziel `graph-state.json` wurde vollständig durch SQLite ersetzt. Die Umstellung optimiert drei Engpässe großer Knowledge-Graphs: 1. Embeddings werden nicht mehr als lange JSON-Dezimalzahlen gespeichert. 2. Ein Flush serialisiert nicht mehr den vollständigen Graphen. 3. Eine unveränderte KB-Synchronisation erzeugt keine erneuten Graphwrites. ## Implementierung - Treiber: `modernc.org/sqlite v1.37.1` - API: Go `database/sql` - CGO: nicht erforderlich - Datenbank: `BRAIN_DATA_DIR/graph.db` - Vektoren: binäre `float32`-BLOBs - Modellschutz: gespeicherter Name und Ollama-Digest; bei Änderung automatische Vector-Invalidierung - Journal: WAL - Flush: inkrementelle Upserts/Deletes innerhalb einer Transaktion - Export: `VACUUM INTO` über `GET /api/state/export` `modernc.org/libc` ist passend zur verwendeten SQLite-Version auf `v1.65.7` festgesetzt. ## Verhalten bei identischer KB-Basis Ein leistungsfähiges System kann den Graphen inklusive Embeddings und Beziehungen aufbauen. Der exportierte `graph.db` lässt sich anschließend auf ein schwächeres System kopieren. Wichtig sind stabile Dokument-IDs und dasselbe Embedding-Modell. Nach dem Import führt das Zielsystem weiterhin einen Quellenabgleich durch: - unverändert: Node, Edge und Vector bleiben bestehen; - Metadatenänderung ohne Textänderung: nur die Node-Zeile wird aktualisiert; - Titel, Summary, Kategorien oder Keywords geändert: der alte Vector wird gelöscht und selektiv neu erzeugt; - Quelle entfernt: zugehörige Nodes, Vektoren und verwaiste Edges werden gelöscht. ## Keine Legacy-Migration Die aktuelle Umgebung ist Staging. Deshalb gibt es absichtlich keinen Importpfad aus `graph-state.json`. Eine alte JSON-Datei wird im Status nur als `legacy_json_present` gemeldet und ansonsten ignoriert. ## Speicherarme Startkonfiguration SQLite wird mit einem kleinen Page-Cache von ungefähr 8 MiB, deaktiviertem mmap und dateibasiertem temporärem Speicher geöffnet. Der vollständige Graph und die Embeddings liegen bereits im Go-Arbeitsspeicher; ein zusätzlicher großer SQLite-Cache würde den Speicherbedarf nur verdoppeln. Vor dem Öffnen prüft der Dienst außerdem, ob `BRAIN_DATA_DIR` tatsächlich beschreibbar ist.