Advanced Query (Datalog)
Når én filterlinje ikke rækker — regler, der forbinder, udleder og fortætter
- Du læser en Datalog-regel og udpeger :find, :where og joinet. ·· Succeskriterium: Du forklarer ud fra en given regel, hvilken variabel der danner joinet.
- Du skriver en regel, der forbinder to kriterier på tværs af blokke. ·· Succeskriterium: Din regel giver den forventede træfmængde fra to betingelser.
- Du fortætter en træfmængde med et aggregat. ·· Succeskriterium: Du grupperer med count og får ét tal pr. gruppe.
En simpel query filtrerer én property og bliver en visning. Men i det øjeblik du vil forbinde to ting — åbne opgaver fra et kvartals møder, grupperet efter projekt — stopper filterlinjen. Datalog begynder præcis dér: du beskriver relationen som en regel, og mium udleder resten.
Hvor filterlinjen stopper
En filterlinje prøver blokke enkeltvis mod faste kriterier. Den kan ikke forbinde på tværs af blokke, udlede noget eller regne noget sammen. Rapporter med flere kriterier klikker du ellers sammen i hånden fra flere visninger — og vedligeholder dem på samme måde. Datalog vender det om: én regel, der beskriver relationerne, og en engine, der udregner dem.
Anatomien i en regel
En Datalog-regel har to dele: :find siger, hvilken størrelse du vil se, :where lister betingelserne — én pr. linje. Variabler som ?task forbinder linjerne; dukker den samme variabel op flere gange, er det et join.
[:find ?task
:where
[?task "type" "task"]
[?task "status" "offen"]
[?task "von-meeting" ?m]
[?m "tag" "q3"]]
;; offene Aufgaben aus Q3-Meetings — ein Join über ?m5 byggesten til Advanced Query
- Reglen beskriver målet (:find), ikke søgevejen — du siger hvad, ikke hvordan.
- Hver :where-linje er en betingelse; fælles variabler forbinder dem til et join.
- Aggregater fortætter: count, sum, max, min, avg over træfmængden.
- En regel kan genbruges — giv den et navn, og den bliver en visning for hele teamet.
- Sæt grænser: rekursive eller ubegrænsede joins kræver en grænse, ellers bliver udregningen dyr.
Eksempel: tæl åbne opgaver pr. projekt
[:find ?projekt (count ?task)
:where
[?task "type" "task"]
[?task "status" "offen"]
[?task "projekt" ?projekt]]
;; ein Report: pro Projekt die Zahl offener AufgabenFør/efter — simpel query vs. Datalog
| Evne | Simpel query | Datalog |
|---|---|---|
| Kriterier | én property | vilkårligt mange |
| Forbinde på tværs af blokke | nej | ja (join via variabler) |
| Udlede / aggregere | nej | count··sum··group |
| Genbrugelig | som visning | som navngiven regel |
| Læringskurve | minutter | stejlere, til gengæld mægtigere |
Et ærligt spørgsmål
Hvor mange af dine rapporter bygger du om hver uge, fordi de forbinder flere kriterier, som ingen filterlinje kan rumme? Svaret afgør, om Datalogs stejlere læringskurve betaler sig for dig — eller om en simpel query allerede rækker.
- Tag en rapport, du i dag klikker sammen i hånden fra flere visninger. Skriv med ord, hvilken størrelse du vil se til sidst, og hvilke betingelser der skal være sande for den — én betingelse pr. linje. Oversæt det derefter til en Datalog-regel med :find og :where, og udpeg den variabel, der danner joinet.⏱ 5 min
💡 Begynd med den størrelse, du vil se, efter :find, og skriv først :where-linjerne bagefter. Den variabel, der står i to linjer, er dit join — markér den først.
Løsningsforslag: Efter :find står den størrelse, du vil se, fx opgaven eller projektet. Nedenunder sætter du én :where-linje pr. betingelse: typen er opgave, status er åben, og via møde-variablen hænger opgaven på et kvartals møde. Den samme møde-variabel i to linjer er joinet. Til en optælling lægger du count om opgave-variablen og grupperer efter projektet — ét tal pr. projekt, uden eksport.
Hvad kan Datalog, som en simpel query ikke kan?
Beskriv, hvad der tæller — resten regner mium.
Én regel, og din anden hjerne bygger rapporten — og holder den ajour, mens du tænker. Ingen eksport, ingen sammenklikning; en følgesvend, der forstår dine kriterier.
Reserver din plads··gratis →