HCLS/PartOfInference
< HCLS
Here's how I used LSW to compute the inferred part of relations using Pellet for the gene ontology cellular component and biological process ontologies. (there was only 1 part of relation in molecular function)
(defun do-inferred-part-of (source dest) ;; read the KB (setq *default-kb* (load-kb-jena source)) ;; loop through all classes c asking for the subclass of (some part_of c) (time (setq *inferred-part-of* (loop for c in (descendants !owl:Thing *default-kb*) for part-of = (descendants (manch (some !<http://purl.org/obo/owl/obo#part_of> c)) *default-kb*) when part-of collect (cons c part-of)) foo nil)) ;; create a simple ontology with just these part relations and dump it. (with-ontology inferred-part-of-ont () ((annotation-property !<http://purl.org/obo/owl/obo#part_of>) (loop for c in (loop for i in *inferred-part-of* collect (car i)) collect (class c :partial)) (loop for (whole . parts) in *inferred-part-of* collect (loop for p in parts collect (class p :partial (annotation !<http://purl.org/obo/owl/obo#part_of> whole))))) (write-rdfxml inferred-part-of-ont dest)))
Generates a bunch of stuff that looks like this:
<owl:Class rdf:about="http://purl.org/obo/owl/GO#GO_0000015"> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0005575"/> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0005622"/> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0005623"/> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0005737"/> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0005829"/> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0044424"/> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0044444"/> <obo:part_of rdf:resource="http://purl.org/obo/owl/GO#GO_0044464"/> </owl:Class>
For cellular component, there are 810 explicit part of relations, and 20000 inferred.