# Konsept: Kunnskapsgrafen (Utforsking og redigering) **Filsti:** `docs/concepts/kunnskapsgrafen.md` ## 1. Konsept Kunnskapsgrafen er Sidelinjas kjerne — et levende nettverk av Temaer, Aktører, Faktoider, Episoder og Segmenter. Inspirert av Logseq og Obsidian bygger den seg opp organisk gjennom daglig bruk og skaper "serendipity" (lykketreff) i research-fasen ved å synliggjøre uventede forbindelser. ## 2. Brukeropplevelse ### 2.1 Organisk vekst Grafen vokser gjennom daglig bruk av Sidelinja: 1. **Chat-meldinger** med `#`-tags oppretter automatisk `MENTIONS`-relasjoner i grafen. 2. **AI-behandling i editoren** trekker ut aktører og faktoider fra innlimt tekst (se `docs/proposals/editor.md`). 3. **Podcastfabrikken** kobler episode-segmenter til temaer og aktører. 4. **Møtereferater** trådes automatisk mot temaer og aktører av AI-referenten. ### 2.2 Visuell utforsking En interaktiv graf-visning (se `docs/features/visuell_graf.md`) lar redaksjonen: - Navigere nettverket rundt en Aktør eller et Tema (2-3 ledd ut) - Dra streker mellom noder for å opprette nye relasjoner - Filtrere etter nodetype, relasjonstype, tidsperiode eller fritekst - Bruke `PART_OF`-hierarkier for fleksibel prosjektorganisering uten stive mappestrukturer ### 2.3 Søk Full-text search på norsk (`to_tsvector('norwegian', ...)`) gjør det mulig å søke på tvers av alle episoder, segmenter og faktoider. ## 3. Komponenter | Feature | Rolle i Kunnskapsgrafen | |---|---| | Kunnskapsgraf datamodell | Nodes/edges i PostgreSQL (se `docs/features/kunnskapsgraf_og_relasjoner.md`) | | Visuell graf | Interaktiv D3.js/Vis.js-visning (se `docs/features/visuell_graf.md`) | | Chat | Mentions (`#`/`@`) oppretter edges automatisk (se `docs/features/chat.md`) | | Editor (AI-knapp) | Trekker ut aktører/faktoider til grafen (se `docs/proposals/editor.md`) | ## 4. Entity Resolution (Merge Entities) Grafen vokser organisk via `#`-mentions, men dette skaper uunngåelig fragmentering: `#Jonas`, `#Støre` og `#Jonas Gahr Støre` ender som tre separate noder. Uten en strategi for sammenslåing dør serendipity-effekten — faktoidene spres over duplikater som AI-en tror er ulike konsepter. **Løsning: Merge Entities admin-verktøy (Lag 2)** 1. Velg autoritativ node (Node A) og duplikat(er) (Node B, C, ...) 2. Flytt alle `graph_edges` som peker på Node B → Node A (`UPDATE graph_edges SET source_id/target_id = A WHERE ... = B`) 3. Flytt alle `messages`-mentions som refererer til Node B → Node A 4. Legg til `name` fra Node B som alias i `entities.aliases` på Node A 5. Slett Node B (`DELETE FROM nodes` → cascader) `aliases`-arrayet i `entities`-tabellen finnes allerede og er indeksert med GIN — autocomplete søker i både `name` og `aliases`, noe som forebygger fremtidige duplikater. **Forebygging:** Autocomplete bør vise eksisterende entiteter med matchende aliases *før* brukeren oppretter nye. "Mente du #Jonas Gahr Støre?" ved skriving av `#Støre`. ## 5. Datamodell Den tekniske datamodellen (nodes-supertabell, graph_edges, detailtabeller, deterministiske UUIDs, tilgangsstyring via node_access) er dokumentert i `docs/features/kunnskapsgraf_og_relasjoner.md`.