Cookbook de patterns Datalog··5 recettes pour les power-users de mium
Des requêtes prêtes à copier, des pièges assumés
Transcription
Et si une requête Datalog n'était pas l'outil que vous redoutez, mais une recette que vous copiez et ajustez une seule fois ? C'est exactement le propos de ce cookbook — cinq recettes du quotidien de mium, chacune utile en soi, chacune avec un point honnête où elle ne tient pas.
Datalog est un langage de requête logique des années soixante-dix que Rich Hickey a redécouvert avec Datomic pour le travail quotidien des bases de données. mium utilise un dialecte Datalog pour interroger son propre index de blocs — vos notes, arêtes et propriétés deviennent des données auxquelles vous posez des questions précises. Vous n'avez pas à apprendre le langage de fond en comble ; vous avez besoin de motifs qui fonctionnent déjà.
La recette une répond à la question de sprint standard : quelles tâches sont ouvertes et doivent être livrées avant la fin du trimestre ? La requête filtre sur l'échéance dans la fenêtre trimestrielle et sur le statut, et renvoie le propriétaire. Le point honnête : les chaînes de date ISO ne tiennent que si l'échéance est entretenue de façon cohérente comme année-mois-jour. Les formats mixtes cassent la comparaison en silence — la requête renvoie alors un ensemble vide, pas une erreur.
La recette deux vous montre les nœuds centraux de votre coffre : les dix blocs les plus souvent référencés. Ce sont souvent des termes, des personnes, des projets — les endroits où votre savoir converge. Le compromis : le comptage traite à égalité les embeds transclusifs et les pures wikilinks d'affichage. Qui ne veut compter que les vraies références sémantiques ajoute un filtre sur un marqueur de propriété.
La recette trois lit la piste d'audit d'un seul bloc : qui a changé quoi, et quand ? La requête lit l'historique des transactions à l'envers pour un ID de bloc donné. Le prérequis est que l'historique soit activé — le défaut depuis mium zéro virgule quatre. Dans les coffres plus anciens, les arêtes nécessaires manquent, et pour les blocs très anciens l'historique peut être compacté et ne montrer que le dernier état.
La recette quatre agrège les tags clients à travers tous les coffres en une liste de fréquences triée, et la recette cinq traque les orphelins — des notes sans backlink entrant, les impasses de votre coffre. Toutes deux supposent une discipline de propriétés et de namespace ; sans elle, elles renvoient des ensembles vides au lieu de connaissance. Et le détecteur d'orphelins avec son not-join est coûteux — sur les grands coffres, il a sa place dans un passage cron nocturne, non dans la session interactive.
Datalog n'est pas un instrument universel, et c'est le message le plus important : pour le plein texte dans le contenu du bloc, pour les coffres non structurés et pour le butinage vague, il y a de meilleures voies. Mais là où votre question est précise et vos propriétés entretenues, votre second cerveau vous rend, sur une requête prête à copier, exactement la réponse qui dort depuis longtemps dans les blocs. Quelle recette convient chez vous — et laquelle tourne dans le vide — vous en dit plus sur votre coffre que sur le langage.
Ce cookbook s'adresse aux power-users de mium et aux profils de développeurs qui ont déjà effleuré [[advanced-query-datalog]] et cherchent des exemples concrets, prêts à copier. Cinq recettes, chacune autonome — qui n'a besoin que du détecteur d'orphelins saute directement à la recette 5. Datalog lui-même est un langage de programmation logique des années 1970 ; Rich Hickey l'a redécouvert avec Datomic (Cognitect, depuis 2012) pour le travail quotidien des bases de données. mium utilise un dialecte Datalog pour interroger son propre index de blocs.
Recettes
Les cinq recettes sont indépendantes les unes des autres. Picorez ce dont vous avez besoin, ou lisez de façon linéaire — les deux ordres fonctionnent. Chaque recette a : un problème, une requête, optionnellement un encart sur le piège.
Recette 1··Tâches ouvertes avec échéance dans le trimestre courant
La question de sprint standard : quelles tâches sont ouvertes et doivent être livrées avant la fin du trimestre ? La requête filtre sur `frist::` dans la fenêtre Q et sur `status:: offen`, et renvoie le propriétaire.
[:find ?block ?frist ?owner
:where [?block :frist ?frist]
[?block :status "offen"]
[(>= ?frist "2026-04-01")]
[(<= ?frist "2026-06-30")]
[?block :owner ?owner]]Recette 2··Top 10 des hubs de backlinks
Quels blocs sont référencés le plus souvent ? Le top 10 par arêtes `:links-to` entrantes sont les nœuds centraux de votre coffre — souvent des termes, des personnes, des projets.
[:find (count ?backlink) ?target
:where [?backlink :links-to ?target]
:order-by [(count ?backlink) :desc]
:limit 10]Recette 3··Piste d'audit d'un bloc
Qui a changé quoi, et quand, sur un bloc ? La requête lit l'historique des transactions à l'envers pour un ID de bloc donné et renvoie `tx`, `attr`, `value` et le drapeau `added`.
[: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]]Recette 4··Agrégation de tags inter-coffres
À quelle fréquence chaque tag client apparaît-il à travers tous les coffres ? La requête groupe sur `tags::` avec le préfixe de namespace `#kunde-` et renvoie une liste de fréquences triée.
[:find (count ?block) ?tag
:where [?block :tags ?tag]
[(re-pattern "^#kunde-") ?tag]
:group-by ?tag
:order-by [(count ?block) :desc]]Recette 5··Détecteur de notes orphelines
Quelles notes n'ont aucun backlink entrant et ne sont pas archivées ? Ces orphelins sont les impasses du coffre — candidats au rangement, à la liaison ou à l'archivage.
[:find ?block ?title
:where [?block :title ?title]
[?block :archiv? false]
(not-join [?block]
[?other :links-to ?block])]Quand ces recettes ne conviennent PAS
Les requêtes Datalog ne sont pas un instrument universel. Trois situations dans lesquelles ces recettes ne tiennent pas :
- Recherche plein texte dans le contenu du bloc — Datalog filtre sur les propriétés et les arêtes, non sur la prose. Pour « trouver tout bloc contenant `Auftragsbestätigung` dans son texte », l'index plein texte de mium est le bon instrument, non une requête Datalog.
- Coffres très peu structurés, sans discipline de propriétés — les cinq recettes supposent toutes que `frist::`, `status::`, `owner::`, `tags::` sont entretenus de façon cohérente. Dans un coffre où 80 % des blocs ne portent aucune propriété, les requêtes renvoient des ensembles vides, non de la connaissance. La discipline de propriétés est un travail préalable, non un effet secondaire.
- Explorations ad hoc à la question floue — Datalog récompense les questions précises. Qui veut juste « voir un peu ce qu'il y a dans le coffre » va plus vite avec la vue graphe ou la navigation par backlinks qu'avec une requête qui reste encore à concevoir.
Une question honnête
Laquelle des cinq recettes a convenu chez vous, laquelle a tourné dans le vide ? Si vous en mettez une en production : qu'avez-vous paramétré autrement — fenêtre Q décalée, namespace de tags modifié, limite augmentée ? Et si aucune ne convient : à quel endroit avons-nous manqué la lacune ? Les recettes de cookbook vivent du frottement contre des coffres réels — vos retours sur la recette #6 qui manque ici sont les bienvenus. Pour aller plus loin dans cette vague : [[advanced-query-datalog]] pour les bases du langage, [[simple-query]] pour l'entrée plus douce sans syntaxe Datalog.