Datalog-Patterns Cookbook··5 opskrifter til mium-power-users
Kopiérbare queries, ærlige faldgruber
- Du læser og parametriserer de fem cookbook-queries til dit eget vault. ·· Succeskriterium: Du tilpasser Q-vinduet, tag-namespacet og grænsen korrekt i tre opskrifter uden at bryde syntaksen.
- Du benævner per opskrift det ærlige sted, hvor den ikke bærer, og dens forudsætning. ·· Succeskriterium: Du tilordner fem faldgruber (datoformat, kant-tælling, historik, namespace, not-join-omkostning) fejlfrit til deres opskrift.
- Du afgør, hvornår en Datalog-query er det forkerte middel, og en anden vej trækker. ·· Succeskriterium: Du genkender i fem tilfælde, om Datalog, fritekst-indekset eller graf-visningen giver det rigtige svar.
Dette cookbook henvender sig til mium-power-users og udvikler-profiler, der allerede har strejfet [[advanced-query-datalog]] og søger konkrete, kopiérbare eksempler. Fem opskrifter, hver selvstændig — den, der kun har brug for forældreløs-detektoren, springer direkte til opskrift 5. Datalog selv er et logik-programmeringssprog fra 1970'erne; Rich Hickey genopdagede det med Datomic (Cognitect, siden 2012) til praktisk database-hverdag. mium bruger en Datalog-dialekt til at forespørge sit eget blok-indeks.
Opskrifter
De fem opskrifter er uafhængige af hinanden. Pluk det, du har brug for, eller læs lineært — begge rækkefølger virker. Hver opskrift har: et problem, en query, eventuelt et faldgrube-callout.
Opskrift 1··Åbne tasks med frist i det aktuelle kvartal
Standard-sprint-spørgsmålet: hvilke tasks er åbne og skal leveres inden kvartalets udgang? Querien filtrerer over `frist::` i Q-vinduet og `status:: offen`, og returnerer owner.
[:find ?block ?frist ?owner
:where [?block :frist ?frist]
[?block :status "offen"]
[(>= ?frist "2026-04-01")]
[(<= ?frist "2026-06-30")]
[?block :owner ?owner]]Opskrift 2··Top-10 backlink-hubs
Hvilke blokke refereres oftest? Top-10 efter indgående `:links-to`-kanter er de centrale knuder i dit vault — ofte begreber, personer, projekter.
[:find (count ?backlink) ?target
:where [?backlink :links-to ?target]
:order-by [(count ?backlink) :desc]
:limit 10]Opskrift 3··Audit-trail for en blok
Hvem har ændret hvad og hvornår på en blok? Querien læser transaction-historikken baglæns for et givet blok-ID og returnerer `tx`, `attr`, `value` og `added`-flaget.
[:find ?tx ?attr ?value ?added
:where [?block :db/id "<((uuid))>"]
[?tx :tx/affected-block ?block]
[?tx :tx/attr ?attr]
[?tx :tx/value ?value]
[?tx :tx/added ?added]]Opskrift 4··Tag-aggregering på tværs af vaults
Hvor ofte optræder hvert kunde-tag på tværs af alle vaults? Querien grupperer over `tags::` med namespace-præfikset `#kunde-` og returnerer en sorteret hyppighedsliste.
[:find (count ?block) ?tag
:where [?block :tags ?tag]
[(re-pattern "^#kunde-") ?tag]
:group-by ?tag
:order-by [(count ?block) :desc]]Opskrift 5··Forældreløs-note-detektor
Hvilke noter har ingen indgående backlinks og er ikke arkiverede? Disse forældreløse er vaultets blinde ender — kandidater til oprydning, sammenkædning eller arkivering.
[:find ?block ?title
:where [?block :title ?title]
[?block :archiv? false]
(not-join [?block]
[?other :links-to ?block])]Når disse opskrifter IKKE passer
Datalog-queries er ikke et universalinstrument. Tre situationer, hvor disse opskrifter ikke bærer:
- Fritekst-søgning i blok-indholdet — Datalog filtrerer over properties og kanter, ikke over prosa. Til „find hver blok, der indeholder `Auftragsbestätigung` i teksten”, er mium-fritekst-indekset det rigtige instrument, ikke en Datalog-query.
- Meget ustrukturerede vaults uden property-disciplin — alle fem opskrifter forudsætter, at `frist::`, `status::`, `owner::`, `tags::` plejes konsistent. I et vault, hvor 80 % af blokkene ikke bærer nogen properties, returnerer querierne tomme mængder, ikke indsigt. Property-disciplin er forarbejde, ikke en bivirkning.
- Ad hoc-udforskninger med uklart spørgsmål — Datalog belønner præcise spørgsmål. Den, der bare vil „se lidt på, hvad der står i vaultet”, kommer hurtigere frem med graf-visningen eller backlink-browsing end med en query, der først skal designes.
Et ærligt spørgsmål
Hvilken af de fem opskrifter passede hos dig, og hvilken løb ud i det tomme? Hvis du sætter en af dem i produktion: hvad parametriserede du anderledes — flyttede Q-vinduet, ændrede tag-namespacet, hævede grænsen? Og hvis ingen passer: hvor overså vi hullet? Cookbook-opskrifter lever af at gnubbe sig op ad rigtige vaults — tilbagemeldinger om, hvilken opskrift #6 der mangler her, er velkomne. Videre i denne bølge: [[advanced-query-datalog]] for sprogets grundlag, [[simple-query]] for den blidere indgang uden Datalog-syntaks.
- Tag opskrift 1 og tilpas den til dit aktuelle kvartal og dine property-navne. Tjek på forhånd med et re-pattern-filter, om dine frist-værdier overhovedet plejes konsistent som YYYY-MM-DD — og notér, hvor mange blokke der falder gennem nettet.⏱ 15 min
💡 Kør først kun de to dato-sammenligninger, uden status-filteret. Bliver resultatet tomt, selvom du har åbne frister, er det næsten altid datoformatet, ikke logikken.
Løsningsforslag: Q-vinduet sættes til dine egne kvartalsgrænser (fx 2026-07-01 til 2026-09-30), property-navnene tilpasses din egen konvention. Re-pattern-for-filteret afdækker de blandede formater — typisk dukker et par blokke op med 15.07.2026 eller Jul 15, der skal normaliseres til YYYY-MM-DD før querien. Først derefter bærer frist-filteret pålideligt. - Lad opskrift 5 (forældreløs-detektor) køre over dit vault én gang, og tæl træfferne. Afgør per forældreløs, om den skal kædes sammen, arkiveres eller slettes — og overvej, om kørslen er bærbar interaktivt hos dig eller hører til i et cron-job.⏱ 20 min
💡 Hvis querien tydeligt hænger interaktivt, er dit vault stort nok til not-join-omkostningen. Pleje så i stedet en has-backlinks?-property og filtrér direkte på den.
Løsningsforslag: Forældreløs-listen er det ærligste spejl af vaultet: ægte blinde ender kædes sammen eller arkiveres, bevidste enkelt-noter (indbakke, dagbog) bliver. På små vaults kører opskriften interaktivt; fra omkring halvtreds tusind blokke vandrer den ind i en natlig cron-kørsel eller erstattes af en plejet has-backlinks?-property, der undgår det dyre not-join.
Hvorfor returnerer opskrift 1 (frist-filter) en tom mængde i stedet for en fejl ved blandede datoformater?
Hvad tæller opskrift 2 (backlink-hubs) med som standard, som man bevidst måtte filtrere fra?
Hvornår er en Datalog-query det forkerte middel?
Hvorfor hører forældreløs-detektoren (opskrift 5) til i en natlig cron-kørsel på store vaults?