(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~%" (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))
(loop for i in (direct-instances node kb)
do
(format f "- ~a~%"
(node-number i)
(uri-name-for-node-with-equivalents i kb labels merge-same ))
)
(format f "
~%"))
(t
(format f "~a~%" (node-number node)
(format nil "~a" (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)
(length (satisfiable-children node kb))))
(loop for child in children
do (subtree child))
(when include-instances
(loop for i in (direct-instances node kb)
do
(format f "~a~%" (node-number i)
(uri-name-for-node i))
))
(format f "
~%")))))))
(format f "")
(subtree (or root !owl:Thing))
(format f "
")
)))
(reverse inorder)))
(defun annotation-property-html-list (kb count inorder stream)
(let ((props
(loop for name being the hash-keys of (kb-name2entity kb)
using (hash-value type-entity)
when (eq (car type-entity) :annotation-property)
collect
(multiple-value-bind (abbrev namespace)
(maybe-abbreviate-namespace name)
(cons name (or namespace abbrev))))))
(loop for prop in (sort props 'string-lessp :key 'cdr)
do
(format stream "- ~a (~a)
~%" (incf count)
(uri-name-for-node (make-uri (car prop)))
(cdr prop))
(push (make-uri (car prop)) inorder)))
(values count inorder))
(defmethod propertytree-report ((kb kb) &key stream (include-annotation-properties t) count (use-labels t) merge-same dont-show)
(let ((role-taxonomy (#"getTaxonomy" (#"getRBox" (kb-kb kb))))
(labels (and use-labels (rdfs-labels kb)))
(inorder nil))
(let ((f stream))
(labels ((subtree (jnode kind)
(let ((node (#"getName" jnode)))
(unless (stringp node)
(setq node (aterm-to-sexp node)))
(when (equal node !owl:Thing)
(setq node !rdf:Property))
(setq node (make-uri node))
(cond ((eq node !rdf:Property)
(setq node
(ecase kind
(:object-property !owl:ObjectProperty)
(:annotation-property !owl:AnnotationProperty)
(:datatype-property !owl:DatatypeProperty))))
((not (eq (property-type node kb) kind))
(return-from subtree)))
(let* ((top (member node (list !owl:ObjectProperty !owl:AnnotationProperty !owl:DatatypeProperty !rdf:Property)))
(jchildren (#"getSubs" jnode))
(children (remove !owl:Nothing (mapcar (lambda(c)
(if (stringp c) c (aterm-to-sexp c)))
(mapcar #"getName" (set-to-list jchildren)))
:test 'equalp)))
(when top
(format f "- ~a
" (uri-name-for-node node)))
(cond ((and (null children) (not top))
(format f "- ~a
~%" (incf count) (uri-name-for-node node))
(push node inorder))
(t
(unless top
(format f "- ~a
" (incf count) (uri-name-for-node node))
(push node inorder))
(loop for jchild in (set-to-list jchildren)
do (subtree jchild kind))
(when (and (equal node !owl:AnnotationProperty) include-annotation-properties)
(multiple-value-setq (count inorder) (annotation-property-html-list kb count inorder f)))
(unless top
(format f "
~%"))))
(when top
(format f "
" (uri-name-for-node node)))
))))
(format f "")
(subtree (#"getTop" role-taxonomy) :annotation-property)
(subtree (#"getTop" role-taxonomy) :datatype-property)
(subtree (#"getTop" role-taxonomy) :object-property)
(format f "
")
(reverse inorder)))
))
(defmethod write-ontology-report ((kb kb) &key root fname
include-instances merge-same dont-show (use-labels t) )
(let* ((*current-labels* (rdfs-labels kb))
(onts (sparql '(:select (?me ) () (?me !rdf:type !owl:Ontology)) :kb kb :use-reasoner :jena :flatten t))
(me (car onts))
(loaded-from (kb-loaded-from kb))
(*want-hrule* nil))
(with-open-file (f fname :direction :output :if-exists :supersede :if-does-not-exist :create)
(write-string "" f)
(format f "~a" loaded-from)
(write-string "" f)
(loop for me in onts
for props = (sparql `(:select (?p ?o) () (,me ?p ?o)) :kb kb :use-reasoner :jena )
do
(if (> (length props) 1)
(format f "Ontology: ~a
" (uri-full me))
(format f "Ontology: ~a
" (uri-full me)))
(when (> (length props) 1) (format f "Ontology Annotations
"))
(loop for ( p o) in props unless (eq p !rdf:type)
do
(format f "~a: ~a
" (maybe-abbreviate-namespace (uri-full p))
(if (uri-p o) (uri-full o) o))))
(format f "
Class Tree
")
(let ((inorder (classtree-report kb :stream f :root root :dont-show dont-show :include-instances include-instances)))
(format f "
Property Tree
")
(let ((inorder2 (propertytree-report kb :stream f :count (1- (length inorder)))))
(format f "
Class Descriptions
")
(loop for thing in inorder
for count from 1
do (format f "~a
~%" count (tree-tooltip kb (uri-full thing) :width 800)))
(format f "Property Descriptions
")
(loop for thing in inorder2
for count from (length inorder)
do (format f "~a
~%" count (tree-tooltip kb (uri-full thing) :width 800))))
(write-string " " f))
fname)))