Cookbook de patterns Datalog··5 recettes pour les power-users de mium
Des requêtes prêtes à copier, des pièges assumés
- Vous lisez et paramétrez les cinq requêtes du cookbook pour votre propre coffre. ·· Critère de réussite : Vous ajustez correctement la fenêtre Q, le namespace de tags et la limite dans trois recettes, sans casser la syntaxe.
- Vous nommez, par recette, le point honnête où elle ne tient pas, et son prérequis. ·· Critère de réussite : Vous associez sans faute cinq pièges (format de date, comptage d'arêtes, historique, namespace, coût du not-join) à leur recette.
- Vous décidez quand une requête Datalog est le mauvais moyen et qu'une autre voie l'emporte. ·· Critère de réussite : Vous reconnaissez dans cinq cas si Datalog, l'index plein texte ou la vue graphe donne la bonne réponse.
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.
- Prenez la recette 1 et adaptez-la à votre trimestre courant et à vos noms de propriétés. Vérifiez au préalable avec un filtre re-pattern si vos valeurs d'échéance sont seulement entretenues de façon cohérente comme YYYY-MM-DD — et notez combien de blocs passent à travers le filet.⏱ 15 min
💡 Exécutez d'abord les deux seules comparaisons de date, sans le filtre de statut. Si le résultat reste vide alors que vous avez des échéances ouvertes, c'est presque toujours le format de date, non la logique.
Solution : La fenêtre Q est réglée sur vos propres bornes de trimestre (par exemple 2026-07-01 à 2026-09-30), les noms de propriétés adaptés à votre propre convention. Le pré-filtre re-pattern met au jour les formats mixtes — typiquement quelques blocs surgissent avec 15.07.2026 ou Jul 15, qu'il faut normaliser en YYYY-MM-DD avant la requête. Ce n'est qu'ensuite que le filtre d'échéance tient de façon fiable. - Faites tourner la recette 5 (détecteur d'orphelins) une fois sur votre coffre et comptez les résultats. Décidez par orphelin s'il faut le lier, l'archiver ou le supprimer — et considérez si le passage est tenable en interactif chez vous ou a sa place dans un job cron.⏱ 20 min
💡 Si la requête rame visiblement en interactif, votre coffre est assez grand pour le coût du not-join. Entretenez alors plutôt une propriété has-backlinks? et filtrez directement dessus.
Solution : La liste des orphelins est le miroir le plus honnête du coffre : les vraies impasses sont liées ou archivées, les notes ponctuelles assumées (boîte de réception, journal) restent. Sur les petits coffres, la recette tourne en interactif ; à partir d'environ cinquante mille blocs, elle migre vers un passage cron nocturne ou est remplacée par une propriété has-backlinks? entretenue, qui évite le coûteux not-join.
Pourquoi la recette 1 (filtre d'échéance) renvoie-t-elle un ensemble vide plutôt qu'une erreur sur des formats de date mixtes ?
Que compte la recette 2 (hubs de backlinks) par défaut, qu'il faudrait filtrer délibérément ?
Quand une requête Datalog est-elle le mauvais moyen ?
Pourquoi le détecteur d'orphelins (recette 5) a-t-il sa place dans un passage cron nocturne sur de grands coffres ?