Advanced Query (Datalog)
En simpel query filtrerer én property. Datalog forbinder mange — på tværs af blokke, med udledning og aggregat, til en rapport med flere kriterier.
- ··Datalog er et regelsprog: du beskriver, hvad der skal være sandt, ikke hvordan der søges.
- ··Regler forbinder blokke på tværs af flere kriterier, udleder nyt og aggregerer — det kan en filterlinje ikke.
- ··Når reglen først er defineret, bliver den en genbrugelig visning — rapporten bygger sig selv.
Transskription
Hvad nu hvis din rapport ikke skulle klikkes sammen af ti visninger, men opstod af én eneste regel — en regel, der beskriver, hvad der tæller, og regner sig selv om? I de næste minutter hører du, hvor filterlinjen stopper, og hvor Datalog begynder.
En simpel query filtrerer én property og bliver en visning. Det rækker, så længe du prøver én ting. Men i det øjeblik du vil forbinde to — åbne opgaver fra et kvartals møder, grupperet efter projekt — stopper filterlinjen. Den prøver blokke enkeltvis mod faste kriterier; den forbinder intet, udleder intet, regner intet sammen.
Datalog vender det om. Du beskriver ikke søgevejen, du beskriver målet. Du siger, hvad der skal være sandt, og overlader hvordan til enginen. Det er kernen i ethvert deklarativt sprog, og databaseforskningen har dokumenteret fordelen konsistent helt tilbage til grundlaget for Datalog-teorien.
En regel har to dele. Den ene siger, hvilken størrelse du vil se. Den anden lister betingelserne, linje for linje. Variabler forbinder linjerne — dukker den samme variabel op mere end én gang, er det et join, en bro på tværs af blokke. Det er præcis her, en filterlinje bliver til en forbundet rapport.
Tre byggesten bærer dig langt. For det første beskriver reglen målet, ikke vejen. For det andet er hver betingelseslinje ét kriterium, og fælles variabler forbinder dem til et join. For det tredje fortætter aggregater træfmængden — du tæller, summerer, grupperer, og mange blokke bliver til ét tal pr. gruppe.
Den magt koster. En ubegrænset eller rekursiv regel kan gennemløbe hele bestanden flere gange. Sæt grænser, tjek tempoet, og gem først en regel som fast visning, når den bliver ved med at være hurtig nok. Og uden rene properties griber ingen regel — datapleje er stadig den stille forudsætning.
Et ærligt spørgsmål til sidst: hvor mange af dine rapporter bygger du om hver uge, fordi de forbinder flere kriterier, som ingen filterlinje kan rumme? Er tallet højt, betaler den stejlere læringskurve sig. Beskrevet én gang som en regel bygger din anden hjerne rapporten — og holder den ajour, mens du tænker.
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.