From: <jen...@us...> - 2008-01-07 09:47:12
|
Revision: 347 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=347&view=rev Author: jenslehmann Date: 2008-01-07 01:47:05 -0800 (Mon, 07 Jan 2008) Log Message: ----------- continued OWL API reasoner Modified Paths: -------------- trunk/lib/components.ini trunk/src/dl-learner/org/dllearner/reasoning/OWLAPIReasoner.java Modified: trunk/lib/components.ini =================================================================== --- trunk/lib/components.ini 2008-01-06 20:08:33 UTC (rev 346) +++ trunk/lib/components.ini 2008-01-07 09:47:05 UTC (rev 347) @@ -6,6 +6,7 @@ org.dllearner.kb.SparqlEndpoint org.dllearner.kb.SparqlEndpointRestructured # reasoners +org.dllearner.reasoning.OWLAPIReasoner org.dllearner.reasoning.DIGReasoner org.dllearner.reasoning.FastRetrievalReasoner org.dllearner.reasoning.KAON2Reasoner Modified: trunk/src/dl-learner/org/dllearner/reasoning/OWLAPIReasoner.java =================================================================== --- trunk/src/dl-learner/org/dllearner/reasoning/OWLAPIReasoner.java 2008-01-06 20:08:33 UTC (rev 346) +++ trunk/src/dl-learner/org/dllearner/reasoning/OWLAPIReasoner.java 2008-01-07 09:47:05 UTC (rev 347) @@ -110,6 +110,8 @@ Collection<ConfigOption<?>> options = new LinkedList<ConfigOption<?>>(); StringConfigOption type = new StringConfigOption("reasonerType", "FaCT++ or Pellet", "FaCT++"); type.setAllowedValues(new String[] {"FaCT++", "Pellet"}); + // closure-Option? siehe: + // http://owlapi.svn.sourceforge.net/viewvc/owlapi/owl1_1/trunk/tutorial/src/main/java/uk/ac/manchester/owl/tutorial/examples/ClosureAxiomsExample.java?view=markup options.add(type); return options; } @@ -170,6 +172,16 @@ // instantiate Pellet reasoner reasoner = new org.mindswap.pellet.owlapi.Reasoner(manager); } + + // compute class hierarchy and types of individuals + // (done here to speed up later reasoner calls) + try { + reasoner.classify(); + reasoner.realise(); + } catch (OWLReasonerException e) { + e.printStackTrace(); + } + factory = manager.getOWLDataFactory(); // read in primitives @@ -303,19 +315,47 @@ } private TreeSet<Concept> getMoreGeneralConcepts(Concept concept) { - return null; + Set<Set<OWLClass>> classes = null; + try { + classes = reasoner.getSuperClasses(getOWLAPIDescription(concept)); + } catch (OWLReasonerException e) { + e.printStackTrace(); + throw new Error("OWL API classification error."); + } + return getFirstClasses(classes); } private TreeSet<Concept> getMoreSpecialConcepts(Concept concept) { - return null; + Set<Set<OWLClass>> classes = null; + try { + classes = reasoner.getSubClasses(getOWLAPIDescription(concept)); + } catch (OWLReasonerException e) { + e.printStackTrace(); + throw new Error("OWL API classification error."); + } + return getFirstClasses(classes); } private TreeSet<AtomicRole> getMoreGeneralRoles(AtomicRole role) { - return null; + Set<Set<OWLObjectProperty>> properties; + try { + properties = reasoner.getSuperProperties(getOWLAPIDescription(role)); + } catch (OWLReasonerException e) { + e.printStackTrace(); + throw new Error("OWL API classification error."); + } + return getFirstProperties(properties); } private TreeSet<AtomicRole> getMoreSpecialRoles(AtomicRole role) { - return null; + Set<Set<OWLObjectProperty>> properties; + try { + properties = reasoner.getSubProperties(getOWLAPIDescription(role)); + } catch (OWLReasonerException e) { + e.printStackTrace(); + throw new Error("OWL API classification error."); + } + return getFirstProperties(properties); } @Override @@ -330,6 +370,7 @@ } } + // TODO @Override public SortedSet<Individual> retrieval(Concept concept) { OWLDescription d = getOWLAPIDescription(concept); @@ -351,24 +392,10 @@ e.printStackTrace(); throw new Error("GetConcepts() reasoning error in OWL API."); } - // the OWL API returns a set of sets; each inner set consists of - // atomic classes - Set<AtomicConcept> concepts = new HashSet<AtomicConcept>(); - for(Set<OWLClass> classes : result) { - // take one element from the set and ignore the rest - // (TODO: we need to make sure we always ignore the same concepts) - OWLClass concept = classes.iterator().next(); - concepts.add(new AtomicConcept(concept.getURI().toString())); - } - return concepts; + return getFirstClassesNoTopBottom(result); } @Override - public Map<Individual, SortedSet<Individual>> getRoleMembers(AtomicRole atomicRole) { - return null; - } - - @Override public boolean isSatisfiable() { try { return reasoner.isSatisfiable(factory.getOWLThing()); @@ -378,6 +405,49 @@ } } + // OWL API often returns a set of sets of classes, where each inner + // set consists of equivalent classes; this method picks one class + // from each inner set to flatten the set of sets + private TreeSet<Concept> getFirstClasses(Set<Set<OWLClass>> setOfSets) { + TreeSet<Concept> concepts = new TreeSet<Concept>(conceptComparator); + for(Set<OWLClass> innerSet : setOfSets) { + // take one element from the set and ignore the rest + // (TODO: we need to make sure we always ignore the same concepts) + OWLClass concept = innerSet.iterator().next(); + if(concept.isOWLThing()) { + concepts.add(new Top()); + } else if(concept.isOWLNothing()) { + concepts.add(new Bottom()); + } else { + concepts.add(new AtomicConcept(concept.getURI().toString())); + } + } + return concepts; + } + + private Set<AtomicConcept> getFirstClassesNoTopBottom(Set<Set<OWLClass>> setOfSets) { + Set<AtomicConcept> concepts = new HashSet<AtomicConcept>(); + for(Set<OWLClass> innerSet : setOfSets) { + // take one element from the set and ignore the rest + // (TODO: we need to make sure we always ignore the same concepts) + OWLClass concept = innerSet.iterator().next(); + if(!concept.isOWLThing() && !concept.isOWLNothing()) + concepts.add(new AtomicConcept(concept.getURI().toString())); + } + return concepts; + } + + private TreeSet<AtomicRole> getFirstProperties(Set<Set<OWLObjectProperty>> setOfSets) { + TreeSet<AtomicRole> roles = new TreeSet<AtomicRole>(roleComparator); + for(Set<OWLObjectProperty> innerSet : setOfSets) { + // take one element from the set and ignore the rest + // (TODO: we need to make sure we always ignore the same concepts) + OWLObjectProperty property = innerSet.iterator().next(); + roles.add(new AtomicRole(property.getURI().toString())); + } + return roles; + } + private Set<Concept> owlClassesToAtomicConcepts(Set<OWLClass> owlClasses) { Set<Concept> concepts = new HashSet<Concept>(); for(OWLClass owlClass : owlClasses) @@ -389,6 +459,10 @@ return new AtomicConcept(owlClass.getURI().toString()); } + public OWLObjectProperty getOWLAPIDescription(AtomicRole role) { + return factory.getOWLObjectProperty(URI.create(role.getName())); + } + public OWLDescription getOWLAPIDescription(Concept concept) { if (concept instanceof AtomicConcept) { return factory.getOWLClass(URI.create(((AtomicConcept)concept).getName())); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |