mium
Schrift
Drop #82··Datalog-Patterns Cookbook

Datalog-Patterns Cookbook··5 Rezepte für mium-Power-User

Kopierbare Queries, ehrliche Gotchas

Team Mut
baut mium··Falktron, Oelde
audio··3:00
▶ Audio folgt
Transkript

Was, wenn eine Datalog-Query nicht das Werkzeug wäre, das Du fürchtest, sondern ein Rezept, das Du kopierst und einmal anpasst? Genau darum geht es in diesem Cookbook — fünf Rezepte aus dem mium-Alltag, jedes für sich brauchbar, jedes mit einer ehrlichen Stelle, an der es nicht trägt.

Datalog ist eine Logik-Abfragesprache aus den siebziger Jahren, die Rich Hickey mit Datomic für den praktischen Datenbank-Alltag wiederentdeckt hat. mium nutzt einen Datalog-Dialekt, um den eigenen Block-Index abzufragen — Deine Notizen, Kanten und Properties werden zu Daten, über die Du präzise Fragen stellst. Du musst die Sprache nicht von Grund auf lernen; Du brauchst Muster, die schon funktionieren.

Rezept eins beantwortet die Standard-Sprint-Frage: welche Tasks sind offen und müssen bis zum Quartalsende geliefert sein? Die Query filtert über die Frist im Quartals-Fenster und den Status, und gibt den Owner zurück. Die ehrliche Stelle: ISO-Datums-Strings tragen nur, wenn die Frist konsistent als Jahr-Monat-Tag gepflegt ist. Mischformate brechen den Vergleich still — die Query liefert dann eine leere Menge, keinen Fehler.

Rezept zwei zeigt Dir die zentralen Knoten Deines Vaults: die zehn am häufigsten referenzierten Blöcke. Das sind oft Begriffe, Personen, Projekte — die Stellen, an denen Dein Wissen zusammenläuft. Der Trade-off: die Zählung behandelt transklusive Embeds und reine Anzeige-Wikilinks gleichwertig. Wer nur echte semantische Verweise zählen will, filtert zusätzlich auf einen Property-Marker.

Rezept drei liest den Audit-Trail eines einzelnen Blocks: wer hat wann was geändert? Die Query liest die Transaction-History reverse für eine gegebene Block-ID. Voraussetzung ist, dass die History aktiviert ist — Standard seit mium null Komma vier. In älteren Vaults fehlen die nötigen Kanten, und bei sehr alten Blöcken kann die History komprimiert sein und nur den letzten Stand zeigen.

Rezept vier aggregiert Kunden-Tags über alle Vaults hinweg zu einer sortierten Häufigkeitsliste, und Rezept fünf spürt Orphans auf — Notizen ohne eingehende Backlinks, die toten Enden Deines Vaults. Beide setzen Property- und Namespace-Disziplin voraus; ohne sie liefern sie leere Mengen statt Erkenntnis. Und der Orphan-Detektor mit seinem not-join ist teuer — bei großen Vaults gehört er nachts in einen Cron-Lauf, nicht in die interaktive Sitzung.

Datalog ist kein Universalwerkzeug, und das ist die wichtigste Botschaft: für Volltext im Block-Inhalt, für unstrukturierte Vaults und für vages Stöbern gibt es bessere Wege. Aber dort, wo Deine Frage präzise ist und Deine Properties gepflegt sind, gibt Dir Dein Zweitgehirn auf eine kopierbare Query genau die Antwort zurück, die in den Blöcken längst steckt. Welches Rezept bei Dir passt — und welches ins Leere läuft — sagt Dir mehr über Deinen Vault als über die Sprache.

Dieses Cookbook richtet sich an mium-Power-User und Dev-Profile, die mit [[advanced-query-datalog]] schon Berührung hatten und konkrete, kopierbare Beispiele suchen. Fünf Rezepte, jedes self-contained — wer nur den Orphan-Detektor braucht, springt direkt zu Rezept 5. Datalog selbst ist eine Logik-Programmiersprache aus den 1970ern; Rich Hickey hat sie mit Datomic (Cognitect, seit 2012) für den praktischen Datenbank-Alltag wiederentdeckt. mium nutzt einen Datalog-Dialekt für die Abfrage des eigenen Block-Index.

Rezepte

Die fünf Rezepte sind unabhängig voneinander. Cherry-pick, was Du brauchst, oder lies linear — beide Reihenfolgen funktionieren. Jedes Rezept hat: ein Problem, eine Query, optional eine Gotcha-Callout.

Rezept 1··Offene Tasks mit Frist im aktuellen Quartal

Standard-Sprint-Frage: welche Tasks sind offen und müssen bis zum Quartalsende geliefert sein? Die Query filtert über `frist::` im Q-Fenster und `status:: offen`, gibt Owner zurück.

[:find ?block ?frist ?owner
 :where [?block :frist ?frist]
        [?block :status "offen"]
        [(>= ?frist "2026-04-01")]
        [(<= ?frist "2026-06-30")]
        [?block :owner ?owner]]

Rezept 2··Top-10 Backlink-Hubs

Welche Blöcke werden am häufigsten referenziert? Die Top-10 nach eingehenden `:links-to`-Kanten sind die zentralen Knoten Deines Vaults — oft Begriffe, Personen, Projekte.

[:find (count ?backlink) ?target
 :where [?backlink :links-to ?target]
 :order-by [(count ?backlink) :desc]
 :limit 10]

Rezept 3··Audit-Trail eines Blocks

Wer hat wann was an einem Block geändert? Die Query liest die Transaction-History reverse für eine gegebene Block-ID und gibt `tx`, `attr`, `value`, `added`-Flag zurück.

[: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]]

Rezept 4··Cross-Vault Tag-Aggregation

Wie häufig tritt jeder Kunden-Tag über alle Vaults hinweg auf? Die Query gruppiert über `tags::` mit Namespace-Präfix `#kunde-` und liefert eine sortierte Häufigkeitsliste.

[:find (count ?block) ?tag
 :where [?block :tags ?tag]
        [(re-pattern "^#kunde-") ?tag]
 :group-by ?tag
 :order-by [(count ?block) :desc]]

Rezept 5··Orphan-Notiz-Detektor

Welche Notizen haben keine eingehenden Backlinks und sind nicht archiviert? Diese Orphans sind die toten Enden des Vaults — Kandidaten für Aufräumen, Verknüpfen oder Archivieren.

[:find ?block ?title
 :where [?block :title ?title]
        [?block :archiv? false]
        (not-join [?block]
          [?other :links-to ?block])]

Wann diese Rezepte NICHT passen

Datalog-Queries sind kein Universalwerkzeug. Drei Situationen, in denen diese Rezepte nicht tragen:

  1. Volltext-Suche im Block-Inhalt — Datalog filtert über Properties und Kanten, nicht über Prosa. Für „finde alle Blöcke, die `Auftragsbestätigung` im Text enthalten“ ist der mium-Full-Text-Index das richtige Werkzeug, nicht eine Datalog-Query.
  2. Sehr unstrukturierte Vaults ohne Property-Disziplin — alle fünf Rezepte setzen voraus, dass `frist::`, `status::`, `owner::`, `tags::` konsistent gepflegt sind. In einem Vault, in dem 80 % der Blöcke keine Properties tragen, liefern die Queries leere Mengen, nicht Erkenntnis. Property-Disziplin ist Vorarbeit, nicht Nebeneffekt.
  3. Ad-hoc-Explorationen mit unklarer Fragestellung — Datalog belohnt präzise Fragen. Wer „mal schauen, was im Vault so steht“ will, ist mit Graph-View oder Backlink-Browsing schneller als mit einer Query, die erst noch entworfen werden muss.

Ehrliche Frage

Welches der fünf Rezepte hat bei Dir gepasst, welches lief ins Leere? Falls Du eines davon produktiv einsetzt: was hast Du anders parametriert — Q-Fenster verschoben, Tag-Namespace verändert, Limit erhöht? Und falls keines passt: an welcher Stelle haben wir die Lücke übersehen? Cookbook-Rezepte leben davon, dass sie an realen Vaults reiben — Rückmeldungen, welches Rezept #6 hier fehlt, sind willkommen. Weiterführend in dieser Wave: [[advanced-query-datalog]] für die Sprach-Grundlagen, [[simple-query]] für den einfacheren Einstieg ohne Datalog-Syntax.

Die Frühjahrsschule ist vorbei. Tag 93 ansehen → Das Spiel starten →