law_query
Une requête LawQL déterministe sur le CLIR d'une formalisation : une question sur le modèle de l'acte lui-même, pas sur une affaire. Relations : nodes(id,kind,package,package_name,path), edges(from,to,role), anchors(node,anchor,act,locator,path), labels(node,lang,text,status), fields(node,field,value,value_kind), rules(id,strength,head_predicate,head_polarity,head_variables,body_variables,body_predicates), norms(id,modality,goal_kind,condition_predicates), positions(norm,kind,bearer_type), windows(norm,kind,deadline), imports(package,imported,semantic_hash), links(from,to,kind: imports|alias|subtype|produces|reads|anchored), literals(node,context,predicate,polarity), variables(node,context,name,type), interpretations(id,predicate,role). Fonctions : anchor, labels, short, contains, overlaps, starts_with, ends_with, position, derivation ; exists/not exists sur une variable liée ; égalité et appartenance seulement, sans arithmétique ni comparaisons d'ordre. Périmètre : corpus par package.name (par exemple kz.corpus.labour_code, pas un nom de fichier) ou un glob ; sans corpus, toute la tranche du profil ; un périmètre hors profil est vide (CORPUS_EMPTY). Exemples : from r in rules where r.head_predicate == "urn:…#eligible" select r.id as producer, r.strength as strength, anchor(r.id) as anchors — qui produit ; from l in literals where l.predicate == "urn:…#eligible" select l.node as reader, l.context as context — qui lit ; query eligible over "pkg" { for x: Person; where applicant(x); select eligible(x); } — inférence par le noyau. C'est une orchestration au-dessus du CLIR et du noyau ; aucune sémantique juridique nouvelle n'est implémentée ici. Au lieu du texte, une question du catalogue avec arguments : producers, readers, anchors-of, imports-of, links-of, type-step (les paramètres predicate/node/type sont des URN, pkg un package.name ou un glob). La réponse structurelle est une queryPage : resultHash du queryResult complet, snapshot (hachage de la liste des paquets du périmètre), rowCount, rows selon rowLimit (20, au plus 5000) et rowOffset, next avec le snapshot pour continuer ; full: true renvoie le queryResult complet quand le périmètre est un seul paquet. Chaque ligne porte sa provenance (nœuds CLIR) ; une réponse vide porte l'entonnoir explain (emptyAt nomme la clause) ; les erreurs portent des codes LDC-Qxxxx avec des indices ; un produit de sources trop large est refusé avant exécution (QUERY_TOO_BROAD), une continuation sur un autre instantané — SNAPSHOT_CHANGED.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| case | No | l'affaire pour query-over ; elle remplace la clause case | |
| full | No | renvoyer le queryResult complet au lieu d'une page ; seulement quand le périmètre est un seul paquet | |
| limit | No | un plafond explicite des matérialisations eval() (il ne borne PAS les lignes — voir rowLimit) | |
| query | No | inline LawQL | |
| corpus | No | le périmètre de l'instantané : un package.name (par exemple kz.corpus.labour_code) ou un glob sur package.name ; sans corpus, toute la tranche du profil | |
| engine | No | il y a un moteur — le noyau ; l'implémentation de référence est appelée par sa propre commande | lawc |
| question | No | le nom d'une question du catalogue corpus/ql/questions (producers, readers, anchors-of, imports-of, links-of, type-step) ou d'un lint ; à la place de query | |
| rowLimit | No | combien de lignes dans structuredContent (20 ; le budget peut le baisser) | |
| snapshot | No | le hachage d'instantané de next.snapshot de la page précédente : une continuation sur un autre instantané est refusée (SNAPSHOT_CHANGED) | |
| arguments | No | les paramètres de la question : un objet « nom → chaîne » (predicate, node, type — des URN ; pkg — un package.name ou un glob) | |
| rowOffset | No | à partir de quelle ligne (0) ; la continuation vient de next avec snapshot ; requêtes structurelles seulement |