Kennisbank Nederland — van platte zinnen naar relaties
Voor E · van B · 24 september 2026
E, na de Kennisatlas: "Omdat we geen neo4j of andere database met relaties gebruiken krijg je deze tekst plat … een andere Jan van Scorelstraat kan dus niet zomaar deze data pakken … Verder weten we niet dat dit een schilder is, het jaartal is niet een waarde waar we iets mee kunnen, welke andere schilders in die tijd of welke werken … We missen relaties! En mi casa gaat juist om relaties." En: "Wij horen een database met alle straten, pleinen, lanen, etc. van Nederland te hebben … Je zou zelfs op meest voorkomende kunnen sorteren en daarna over elk feit dat boeiend is dit opnemen voor een agent die het verder gaat verrijken. Dit op zichzelf kan een enorm waardevolle database worden die er volgens mij nog niet is in Nederland. De logica moeten we echt even goed uitdenken en de databasekeuze hiervoor omdat het groot gaat worden. Afbeeldingen die we onderweg opslaan moeten naar een losse CDN direct naar zilch33. Het werk is redelijk simpel en kan door goedkope agents worden uitgevoerd."
Dit stuk is de logica, de databasekeuze en de eerste stappen. Het vervangt §2.1–2.2 van het kennisgraafplan waar het erover heen gaat: daar was de graaf een afgeleide van tekst; hier is de relatie het feit en de tekst de weergave.
In één minuut
- Feit = relatie + bron; zin = weergave. "Je bent genoemd naar Jan van Scorel" wordt: straat →genoemd naar→ persoon Q282708, met bron. Carmen maakt de zin, in de taal en de context van het moment.
- Ieder ding één keer, met een gedeelde sleutel. Jan van Scorel is één knoop (Wikidata Q282708) voor alle 22 straten in het land die naar hem heten. Wat over de plek gaat (hoofdas van de Schildersbuurt) hangt aan de Utrechtse straat; wat over de man gaat (leerling van Jacob Cornelisz., leraar van Maarten van Heemskerck, geboren 1495 in Schoorl) hangt aan hém, en elke straat erft het.
- Meest voorkomende eerst, precies zoals je zegt. In Nederland hebben 30.723 straten een naamgever in Wikidata, verdeeld over 8.569 naamgevers; de top 30 dekt er al 7.057 (molen 647, Wilhelmina 593, Beatrix 516, Rembrandt 193, Vermeer 141, Van Gogh 140, Vondel 139, Mozart 137). Eén verrijking van Rembrandt bedient 193 straten. Dat scheelt geen procenten maar ordes van grootte aan tokens.
- Alle straten van Nederland hebben we al bijna: de BAG (Kadaster, CC0) kent 270.989 openbare ruimten van het type Weg, met een vaste sleutel; die halen we in één keer binnen als de ruggengraat.
- Databasekeuze: PostgreSQL op zilch33 als de kennisbank, met knopen, relaties, bronnen en media in gewone tabellen; agents schrijven via één kleine API; de demo leest ervan. Geen Neo4j nu; als we later paden van wisselende lengte willen, kan de graafextensie van Postgres (Apache AGE) erbij zonder verhuizing.
- Beelden naar een losse beeldbank op zilch33 (map plus Caddy, later S3-achtig), nooit in git; in de kennisbank alleen de url, de licentie en de bron.
- Goedkope agents doen het werk: code haalt op en telt, Haiku extraheert relaties met citaat, code keurt, Sonnet kiest per ding wat boeiend is; Opus alleen voor het ontwerp. Op het abonnement, in porties.
- Dit bestaat nog niet in Nederland: Wikidata dekt 13 % van de straten en kent geen plekverhalen; gemeenten hebben losse lijsten; de BAG kent geen betekenis. Een kennisbank die straat, naamgever, plek, tijd en bron verbindt, is nieuw, en hij groeit met elke bezoeker die zijn adres typt.
1 · Eerst: wat is Wikidata, en welke database van straten hebben we
Wikidata is de vrije, gestructureerde zusterdatabank van Wikipedia (CC0, publiek domein): geen artikelen maar dingen met een vast nummer (Jan van Scorel = Q282708) en eigenschappen als relaties: beroep, geboortedatum, leerling van, genoemd naar. Het is dus precies de vorm die wij zoeken, en we mogen alles vrij overnemen. Wat Wikidata over Jan van Scorel weet, gestructureerd en zonder één zin tekst: kunstschilder; geboren 10-08-1495 in Schoorl; overleden 16-12-1562 in Utrecht; leerling van Jacob Cornelisz. van Oostsanen, Jan Gossaert, Cornelis Willemsz; leraar van Maarten van Heemskerck; werken "Maria Magdalena", "Salomo en de koningin van Sheba", "Landschap met Bathseba"; en 22 straten, lanen, pleinen, een kade en een park die naar hem heten.
De database met alle straten is de BAG, de Basisregistratie Adressen en Gebouwen van het Kadaster (CC0): elke openbare ruimte (straat, laan, plein, kade, pad, steeg, dijk …) heeft een vaste sleutel, een type, een woonplaats en een gemeente, met geometrie. Landelijk 270.989 van het type Weg (PDOK, 24-09). We gebruiken de BAG al voor huizen; de openbare ruimten halen we in één keer binnen als ruggengraat van de kennisbank. Elke straat in Nederland staat daarmee op dag één in de bank, ook zonder één feit: "nog stil", zoals in de Kennisatlas.
Daarnaast, per straat, wat we al bevragen: OpenStreetMap (naamgever als Wikidata-nummer, ODbL), het Rijksmonumentenregister (RCE, CC BY), 3DBAG, de BGT en de topografie (PDOK), de bomenkaarten, en voor de tekstbronnen Wikipedia (CC BY-SA) en de registeromschrijvingen. Beeld: Europeana, de beeldbank van de RCE, Wikimedia Commons, de Kadaster-tijdreis. Alles staat met licentie en dekking in R10.
2 · Het model: dingen, relaties, bronnen, weergave
2.1 Dingen (knopen)
| Soort | Sleutel | Voorbeeld |
|---|---|---|
| straat (openbare ruimte) | BAG-id | Jan van Scorelstraat, Utrecht |
| plaats, gemeente, buurt | BAG-woonplaats, CBS-code | Utrecht, BU03440532 |
| persoon, plaats-elders, ding, gebeurtenis | Wikidata Q-nummer | Q282708 Jan van Scorel; molen; eik; Slag bij … (alleen als naamgever, zie §5) |
| jaar | getal | 1495, 1910 |
| gebouw, pand | BAG-pand-id | Wilhelminapark 25 |
| monument | RCE-nummer | 514405 |
| water, park, station | TOP10NL-id | de Minstroom |
| bron | uitgever + url | BAG, Wikidata, RCE, DUIC |
| beeld, kaart | media-id in de beeldbank | foto Wittevrouwensingel 1910 |
Een ding heeft een label in nl en en, een beschrijving, en verder niets: alles wat het "weet" zijn relaties.
2.2 Relaties (kanten)
Eén relatie: van, werkwoord, naar (een ding of een getal), bron, peildatum, zekerheid (zeker, vrij zeker,
vermoeden), sinds/tot waar tijd een rol speelt, en citaat als hij uit tekst komt. Het werkwoord komt uit een
vaste, kleine lijst, zoals de 35 werkwoorden van het mensenweb (concept v3 §7). Voor de plek onder meer:
| Groep | Werkwoorden |
|---|---|
| naam | genoemd naar · draagt dezelfde naam als · heette vroeger · kreeg haar naam in (jaar) |
| ligging | ligt in · grenst aan · kruist · is de voortzetting van · loopt van … naar |
| tijd | aangelegd in · gebouwd in · gesloopt in · geboren in · overleden in · leefde van … tot |
| mens en werk | is een (schilder) · leerling van · leraar van · maakte · ontworpen door · gebouwd door |
| stenen | staat aan · is een monument · heeft dakvorm · telt (n) panden · bomen van soort |
| verhaal | staat op (beeld) · staat in (krant, jaar, aantal) |
Jouw handgeschreven zin over de Jan van Scorelstraat wordt zes relaties: straat →genoemd naar→ Q282708 (DUIC); Q282708 →is een→ kunstschilder (Wikidata); Q282708 →leefde van→ 1495 →tot→ 1562 (Wikidata); straat →hoofdas van→ Schildersbuurt (DUIC); straat →aangelegd na→ Stadhouderslaan, ~15 jaar (DUIC, vermoeden); straat →voortzetting van→ Stadhouderslaan, →kruist→ Minstroom (DUIC).
2.3 Weergave
De zin is een functie van relaties, taal en context. Aan de deur, kort: "Je heet naar Jan van Scorel, schilder, geboren in 1495." In de kamer, dieper: "… leerling van Jacob Cornelisz. van Oostsanen, leraar van Maarten van Heemskerck; drie straten verderop heten ook naar zijn tijdgenoten." Op tafel gedrukt: de kant met bron en peildatum. Het model schrijft de zin (Haiku, één beurt), de code geeft het de relaties en keurt dat er niets in de zin staat dat niet in een relatie staat. Bron is spraakrecht blijft gelden: een relatie met bron "gezegd" mag klinken, "afgeleid" alleen kiezen.
3 · De logica: meest voorkomende eerst, dan de boeiende feiten
- Ruggengraat: alle 270.989 openbare ruimten uit de BAG in de kennisbank, met type, woonplaats, gemeente, en de CBS-buurt uit de geometrie. Code, eenmalig, een avond.
- Naamgevers koppelen, in volgorde van voorkomen: eerst de 30.723 straten die Wikidata al aan een naamgever koppelt (8.569 dingen); dan OpenStreetMap; dan Amsterdam en Rotterdam (open verklaringen); dan een naam-matcher op de rest (een "Rembrandtlaan" zonder koppeling hoort bij Q5598), met Haiku als scheidsrechter bij twijfel, altijd met citaat. Sorteer de dingen op aantal straten: de top 500 bedient naar schatting de helft van alle gekoppelde straten (meting volgt bij stap 1).
- Per ding één keer verrijken: alle Wikidata-relaties (beroep, leven, leerlingen, leraren, werken, plaatsen), de Wikipedia-inleiding als citaatbron, beelden met vrije licentie. Code waar het kan; Haiku extraheert relaties uit tekst met citaat; code keurt. Kosten per ding: centen; per straat: nul, want hij erft.
- Boeiend kiezen: per ding kiest Sonnet, op de gekeurde relaties, wat leuk of gewichtig is voor een huis om te zeggen (E's regel: geen oorlog, ramp, dood; wel "gewichtig"), en markeert dat. Een tweede agent verrijkt alleen wat boeiend is verder: tijdgenoten, werken, verbanden tussen naamgevers in dezelfde buurt (de Schildersbuurt: elf schilders geboren tussen 1610 en 1638).
- Per plek: wat plekgebonden is (aangelegd in, voortzetting van, monumenten, bomen, water) komt per straat, uit de bronnen die we al hebben, in porties en op verzoek: waar bezoekers hun adres typen, groeit de bank het eerst.
- Weergave en teruglezen: Carmen en het huis lezen relaties; de Kennisatlas toont per ding zijn straten en per straat zijn relaties; het huis-web en de stadsgraaf worden hieruit gevoed in plaats van afgeleid.
4 · Databasekeuze
| SQLite (nu) | PostgreSQL op zilch33 | Neo4j | |
|---|---|---|---|
| Schaal | prima tot miljoenen rijen (gemeten, R11) | ruim voldoende; heel Nederland met tien relaties per straat is ~3 miljoen rijen | ruim voldoende |
| Meerdere schrijvers (agents, de app) | één schrijver | ja | ja |
| Relatievragen | recursieve query's | recursieve query's; later Apache AGE (Cypher) in dezelfde database | Cypher |
| Beheer | een bestand | een container, back-up, rollen | een tweede systeem, tweede plek om te wissen |
| Licentie | publiek domein | PostgreSQL (vrij) | GPLv3 (Community), weergave niet vrij |
Advies: PostgreSQL in een container op zilch33 (16 kernen, 30 GB, 226 GB vrij), naast de demo, met:
- tabellen
ding,relatie,bron,media,werkwoord(de vaste lijst), plusstraatals vaste view op de BAG-ruggengraat; alles metbron_id,peildatum,zekerheid,versie; - één kleine API (Hono, zoals de app) met een sleutel: agents schrijven relaties met bron, nooit rechtstreeks in de database; de app leest met een cache;
- de mensenlaag (het web van een eigenaar) blijft in de app-database, gescheiden, zoals in het kennisgraafplan: de kennisbank kent geen mensen, alleen stenen, namen, tijd en bronnen;
- git houdt alleen code en de handgeschreven laag; de data leeft in Postgres met een nachtelijke dump als back-up.
Neo4j pas als een concrete vraag het nodig maakt (paden van wisselende lengte in productie, een analist met Cypher); dan eerst AGE in Postgres proberen. De vorm van de data is wat telt; die is met dit model vanaf nu goed.
5 · Beelden en andere media
Beelden gaan nooit in git. Op zilch33 komt een losse beeldbank: een map per bron (/srv/micasa-beeld/<bron>/…), een
Caddy-blok dat hem als beeld.micasa.bijt.me serveert (A en E zetten Caddy), en een upload-endpoint met sleutel voor
de agents. Later kan dat een S3-achtige dienst worden (MinIO) zonder dat de urls veranderen. In de kennisbank staat per
beeld: url, bron, licentie (alleen CC0, publiek domein, CC BY, CC BY-SA), maker, jaar, en de relatie "staat op" naar
straat of ding. Geen beelden onder BY-NC, geen AI-bewerking van historische foto's van echte adressen (D9), geen
herkenbare mensen.
6 · Wie doet wat (goedkoop, in porties, op het abonnement)
| Stap | Werk | Wie | Kosten |
|---|---|---|---|
| Ruggengraat BAG, CBS-buurten | import, sleutels, views | code (Sonnet bouwt) | 0 |
| Naamgevers uit Wikidata en OSM, sorteren op voorkomen | bulk-query's (QLever), koppeltabel | code (Sonnet bouwt) | 0 |
| Verrijking per ding | Wikidata-relaties (code); relaties uit tekst met citaat | code + Haiku | centen per ding |
| Keuring | citaat letterlijk, namen en getallen, stoplijst, werkwoord uit de lijst | code | 0 |
| Boeiend kiezen, verbanden per buurt | op gekeurde relaties | Sonnet, één keer per ding of buurt | centen |
| Weergave (de zin) | uit relaties, per taal en context | Haiku, of sjablonen in code | centen |
| Ontwerp en API | model, tabellen, API, migratie van de huidige voorraad | Opus (één keer) | abonnement |
| Steekproeven en de grens bij gevoelige namen | smaak | E | — |
Alles draait van de Mac op het abonnement in porties (zoals vandaag), of later als nachtjob op een eigen machine met
een setup-token; nooit op de demo-server. De bestaande voorraad (1.656 zinnen, 339 naamgevers, 1.121 weetjes) wordt
niet weggegooid: de naamgevers en de weetjes zijn al half gestructureerd, en de zinnen hebben elk een citaat en een
broncache, dus de relaties worden eruit gehaald zonder nieuwe bronnen op te halen.
7 · Eerste stappen, klein en meetbaar
- Meting (vandaag, code, nul kosten): de 8.569 naamgevers met hun aantal straten, gesorteerd; hoeveel dekt de top 100, 500, 1.000. Plus: de Wikidata-relaties van de 339 Utrechtse naamgevers als eerste vulling.
- Proef relatie-extractie (één avond, Haiku, centen): jouw Scorel-zin en de twintig vergelijkingsstraten uit de broncache → relaties met citaat, gekeurd door code; de Kennisatlas toont per straat de relaties naast de zin.
- Ontwerp (Opus, één sessie): tabellen, API en migratie; Postgres-container op zilch33 (met A, want zilch33 en Caddy zijn van A en jou); beeldbank-map en Caddy-blok als voorstel voor jullie.
- Ruggengraat (één avond, code): alle openbare ruimten van Nederland in de bank; de Kennisatlas krijgt een landkaart van "waar weten we al iets".
- Meest voorkomende eerst (porties, Haiku): de top 500 naamgevers verrijken; daarna per plek waar bezoekers komen.
- Weergave: Carmen en het huis lezen relaties; het huis-web en de stadsgraaf voeden zich uit de bank.
Niets hiervan raakt zaterdag; stap 1 en 2 kunnen nu.
8 · Versneld plan (24 september, nacht) — de demo van zaterdag is afgezegd
E: "Zaterdag demo heb ik nu afgezegd. We kunnen door. Dit zijn belangrijke zaken die we wel willen inbouwen voordat we een demo geven. Laten we de plannen opnieuw bekijken, maar wat mij betreft kunnen we versnellen." Dus geen bevriezing meer; de kennisbank gaat vóór de demo, in vier banen die naast elkaar lopen. Opus bouwt de samengestelde stukken, Sonnet en Haiku het afgebakende en het bulkwerk; B keurt elke stap, A merge't en deployt.
| Baan | Wat | Wie | Wanneer |
|---|---|---|---|
| 1 · De bank | migratie en lib/kennis/bank.mjs (SQLite in STATE_DIR, schema §2), vaste lijsten, import: alle straten van Nederland (Wikidata 232.724 met BAG-id; Utrecht compleet), 8.536 naamgevers met 77.921 relaties, 30.823 straat→naamgever, jaren en weetjes; routes/kennis.mjs (GET met ETag, POST met sleutel, keuring per rij) |
B (Opus S9) | gestart 24-09 nacht; klaar 25-09 |
| 2 · Relaties uit tekst | relatie-extractie met citaat uit de broncache (proza, oogst, handgeschreven, jaarweetjes) en de plek-kant per straat (monumenten, water, groen, aangelegd, maten) als relaties; huis-zelf en straatmaten als relaties | B (Haiku op het abonnement, in porties; code keurt) | 25–27-09 |
| 3 · Graaf en infra | knoop/kant als projectie uit kennisbank + mensenlaag; de stadsgraaf (Sigma) op de bank; deploy/kennisbank/ (Postgres, beeldbank) voor E; signalenlaag |
A | vanaf 25-09 |
| 4 · Weergave | Carmen en het huis lezen relaties (gezegd en gedrukt) achter een vlag, met dezelfde steekproef als meetlat; Kennisatlas en Stand van de data op de bank | B | 27–29-09 |
| 5 · Meer bronnen | Amsterdam en Rotterdam (verklaringen), Locatieserver voor de rest van de BAG-straten, Europeana/Commons-beelden in de beeldbank, naam-matcher voor straten zonder Wikidata-koppeling | B (Sonnet/Haiku) | week 40 |
Nieuwe demo pas als baan 1–4 staan en de steekproef zegt dat Carmen uit relaties beter praat dan uit zinnen.