Un grand merci à @grtjn pour avoir fourni le moyen d'accéder au document pré-changement. Pour déterminer la différence entre les documents, j'ai trouvé un moyen inspiré par ce blog post. La solution que j'ai trouvé à travailler ressemble à ceci:
xquery version '1.0-ml';
import module namespace trgr='http://marklogic.com/xdmp/triggers' at '/MarkLogic/triggers.xqy';
declare function local:diff($seq1 as item()*, $seq2 as item()*) as item()* {
let $map1 := map:new($seq1 ! map:entry(fn:string(.), .))
let $map2 := map:new($seq2 ! map:entry(fn:string(.), .))
return map:keys($map1 - $map2) ! map:get($map1,.)
};
declare variable $trgr:uri as xs:string external;
declare variable $after := doc($trgr:uri)/sem:triples/sem:triple;
declare variable $before := xdmp:eval('doc("'||$trgr:uri||'")',(),
<options xmlns="xdmp:eval"><isolation>different-transaction</isolation></options>)/sem:triples/sem:triple;
declare variable $added_triples := local:diff($after, $before);
declare variable $added_graph := xdmp:document-get-collections($trgr:uri);
declare variable $deleted_triples := local:diff($before, $after);
declare variable $deleted_graph := xdmp:eval('xdmp:document-get-collections("'||$trgr:uri||'")',(),
<options xmlns="xdmp:eval"><isolation>different-transaction</isolation></options>);
xdmp:log(fn:concat('***** Trigger processing: ', $trgr:uri, '*****')),
xdmp:log('***** added triples *****'),
xdmp:log($added_graph),
xdmp:log($added_triples),
xdmp:log('***** deleted triples *****'),
xdmp:log($deleted_graph),
xdmp:log($deleted_triples)
J'ai créé 3 pre-commit
déclencheurs, un pour chacun des trgr:document-content
: les options create
, modify
et delete
, tout en invoquant le module ci-dessus. Une requête de mise à jour SPARQL entraîne le déclenchement du module ci-dessus une ou plusieurs fois, l'impression des listes de triplets ajoutés et supprimés.
Couple d'observations:
- Une seule instruction de mise à jour SPARQL peut créer, modifier et supprimer plusieurs documents, donc déclenchera plusieurs fois le module.
- Les instructions INSERT semblent toujours créer de nouveaux documents, de sorte que vous n'obtiendrez jamais de triplets et de triplets supprimés dans le même appel.
- Le code suppose qu'il existe une seule collection pour un document, qui est le graphique nommé pour les triplets gérés. Cela nécessitera un travail supplémentaire s'il doit y avoir plusieurs collections par document.
Merci! C'est exactement ce dont j'avais besoin pour commencer. – hhp