(in-package :cl-user) (defmethod classtree-report ((kb kb) &key root stream include-instances merge-same dont-show (use-labels t)) (let ((unsatisfiable (equivalents !owl:Nothing kb)) (equivalents-seen (make-hash-table)) (labels (and use-labels (rdfs-labels kb))) (inorder nil) (node2number (make-hash-table)) (count 0) (me (car (sparql '(:select (?me ) () (?me !rdf:type !owl:Ontology)) :kb kb :use-reasoner :jena :flatten t))) (props (sparql '(:select (?p ?o) () (?me !rdf:type !owl:Ontology) (?me ?p ?o)) :kb kb :use-reasoner :jena )) (loaded-from (kb-loaded-from kb))) (macrolet ((satisfiable-children (node kb) `(set-difference (children ,node ,kb) unsatisfiable :test 'eq))) (let ((f stream)) (labels ((node-number (node) (or (prog1 (gethash node node2number) (princ ".")) (progn (push node inorder) (setf (gethash node node2number) (incf count))))) (subtree (node) (unless (or (gethash node equivalents-seen) (member node dont-show)) (let ((children (satisfiable-children node kb))) (when (and (equal node !owl:Thing) unsatisfiable) (setq children (append children (list !owl:Nothing)))) (cond ((and (null children) (or (not include-instances) (not (instances node kb)))) (format f "
  • ~a
  • " (node-number node) (multiple-value-bind (name equivs) (uri-name-for-node-with-equivalents node kb labels merge-same) (loop for equiv in equivs do (setf (gethash equiv equivalents-seen) t)) name)) ) ((and (null children) include-instances (instances node kb)) (format f "~a~%")) (t (format f "~a