You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by en...@apache.org on 2011/08/19 16:48:33 UTC

svn commit: r1159654 - in /incubator/stanbol/branches/jena-reasoners/reasoners/owlapi: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/stanbol/ src/main/java/org/apache/stanbol/reasoners/ src/main/...

Author: enridaga
Date: Fri Aug 19 14:48:32 2011
New Revision: 1159654

URL: http://svn.apache.org/viewvc?rev=1159654&view=rev
Log:
Implementation of the abstract OWLAPi reasoning services (STANBOL-185).

Added:
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/pom.xml   (with props)
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/AbstractOWLApiReasoningService.java
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/InconsistentInputException.java
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningService.java
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningServiceException.java
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/test/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/test/java/
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/test/resources/
Modified:
    incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/   (props changed)

Propchange: incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Aug 19 14:48:32 2011
@@ -0,0 +1,3 @@
+.settings
+.classpath
+.project

Added: incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/pom.xml
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/pom.xml?rev=1159654&view=auto
==============================================================================
--- incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/pom.xml (added)
+++ incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/pom.xml Fri Aug 19 14:48:32 2011
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<parent>
+		<artifactId>stanbol-parent</artifactId>
+		<groupId>org.apache.stanbol</groupId>
+		<version>0.9.0-incubating-SNAPSHOT</version>
+		<relativePath>../../../trunk/parent</relativePath>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.apache.stanbol.reasoners.owlapi</artifactId>
+	<packaging>bundle</packaging>
+	<name>Apache Stanbol Reasoners: OWLApi</name>
+	<version>0.1</version>
+
+	<description>API to use an OWLApi based reasoner</description>
+	<build>
+		<!-- make it an OSGi bundle -->
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-scr-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Import-Package>
+						org.semanticweb.owlapi.apibinding.*,
+						org.semanticweb.owlapi.model.*,
+						org.semanticweb.owlapi.reasoner.*,
+						org.semanticweb.owlapi.util.*,
+						org.slf4j.*
+						</Import-Package>
+					</instructions>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+	<dependencies>
+
+		<!-- Diagnostic dependencies -->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+
+		<!-- Dependencise for testing -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.scr.annotations</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.compendium</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<!--dependency>
+			<groupId>owlapi</groupId>
+			<artifactId>owlapi</artifactId>
+			<type>jar</type>
+			<scope>provided</scope>
+		</dependency-->
+
+		<!-- Stanbol dependencies -->
+		<dependency>
+			<groupId>org.apache.stanbol</groupId>
+			<artifactId>org.apache.stanbol.owl</artifactId>
+		</dependency>
+	</dependencies>
+</project>

Propchange: incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/pom.xml
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/AbstractOWLApiReasoningService.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/AbstractOWLApiReasoningService.java?rev=1159654&view=auto
==============================================================================
--- incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/AbstractOWLApiReasoningService.java (added)
+++ incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/AbstractOWLApiReasoningService.java Fri Aug 19 14:48:32 2011
@@ -0,0 +1,299 @@
+package org.apache.stanbol.reasoners.owlapi;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.semanticweb.owlapi.apibinding.OWLManager;
+import org.semanticweb.owlapi.model.OWLAxiom;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
+import org.semanticweb.owlapi.model.OWLOntologyManager;
+import org.semanticweb.owlapi.model.SWRLRule;
+import org.semanticweb.owlapi.reasoner.InconsistentOntologyException;
+import org.semanticweb.owlapi.reasoner.OWLReasoner;
+import org.semanticweb.owlapi.util.InferredAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredClassAssertionAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredDataPropertyCharacteristicAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredDisjointClassesAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredEquivalentClassAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredEquivalentDataPropertiesAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredEquivalentObjectPropertyAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredInverseObjectPropertiesAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredObjectPropertyCharacteristicAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredOntologyGenerator;
+import org.semanticweb.owlapi.util.InferredPropertyAssertionGenerator;
+import org.semanticweb.owlapi.util.InferredSubClassAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredSubDataPropertyAxiomGenerator;
+import org.semanticweb.owlapi.util.InferredSubObjectPropertyAxiomGenerator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This abstract class implements basic methods for a reasoning service based on
+ * OWLApi
+ */
+public abstract class AbstractOWLApiReasoningService implements
+		OWLApiReasoningService {
+	private final Logger log = LoggerFactory.getLogger(getClass());
+
+	private OWLOntologyManager manager = null;
+
+	/**
+	 * A unique instance of OWLOntologyManager to be used to place a target
+	 * ontology. We don't want to use the manager bound to the input ontologies
+	 * for that, we don't want to interfere with it.
+	 * 
+	 * Other {@see OWLApiReasoningService}s may want to change this.
+	 * 
+	 * @return
+	 */
+	protected OWLOntologyManager getOWLOntologyManager() {
+		// We want a single instance here
+		if (manager == null) {
+			manager = OWLManager.createOWLOntologyManager();
+		}
+		return manager;
+	}
+
+	/**
+	 * Method to be implemented by subclasses.
+	 * 
+	 * @param ontology
+	 * @return
+	 */
+	protected abstract OWLReasoner getReasoner(OWLOntology ontology);
+
+	/**
+	 * Generic method for running the reasoner
+	 * 
+	 * @param input
+	 * @param generators
+	 * @return
+	 */
+	public Set<OWLAxiom> run(OWLOntology input,
+			List<InferredAxiomGenerator<? extends OWLAxiom>> generators)
+			throws OWLApiReasoningServiceException, InconsistentInputException {
+		try {
+			// Get the manager
+			OWLOntologyManager manager = getOWLOntologyManager();
+
+			// Get the reasoner
+			OWLReasoner reasoner = getReasoner(input);
+			log.debug("Running {} reasoner on {} ", reasoner.getClass(),
+					input.getOntologyID());
+
+			// To generate inferred axioms
+			InferredOntologyGenerator inferred = new InferredOntologyGenerator(
+					reasoner, generators);
+
+			// We fill an anonymous ontology with the result, the return the
+			// axiom
+			// set
+			Set<OWLAxiom> axioms = new HashSet<OWLAxiom>();
+			try {
+				OWLOntology output = manager.createOntology();
+				inferred.fillOntology(manager, output);
+				log.debug("Temporary ID is {}", output.getOntologyID());
+				axioms = manager.getOntology(output.getOntologyID())
+						.getAxioms();
+				// We remove the ontology from the manager
+				manager.removeOntology(output);
+			} catch (OWLOntologyCreationException e) {
+				log.error("An exception have been thrown when instantiating the ontology");
+			}
+
+			return axioms;
+		} catch (InconsistentOntologyException inconsistent) {
+			/**
+			 * TODO Add report. Why it is inconsistent?
+			 */
+			throw new InconsistentInputException();
+		} catch (Exception exception) {
+			log.error("An exception have been thrown while executing method run()");
+			throw new OWLApiReasoningServiceException();
+		}
+	}
+
+	/**
+	 * Merges the SWRL rules in the input ontology, then calls
+	 * run(OWLOntology,List<InferredAxiomGenerator<? extends OWLAxiom>>)
+	 * 
+	 * @param ontology
+	 * @param rules
+	 * @param generators
+	 * @return
+	 */
+	public Set<OWLAxiom> run(OWLOntology ontology, List<SWRLRule> rules,
+			List<InferredAxiomGenerator<? extends OWLAxiom>> generators)
+			throws OWLApiReasoningServiceException, InconsistentInputException {
+		log.debug("Called method run(OWLOntology,List<SWRLRule>,List)");
+		OWLOntologyManager manager = getOWLOntologyManager();
+		try {
+			log.debug("Create a input ontology to merge rules in.");
+			OWLOntology input = manager.createOntology();
+			Set<SWRLRule> ruleSet = new HashSet<SWRLRule>();
+			ruleSet.addAll(rules);
+			manager.addAxioms(input, ruleSet);
+			input = manager.getOntology(input.getOntologyID());
+			log.debug("Created ontology: {}", input);
+			log.debug("Calling the run method.");
+			return run(input, generators);
+		} catch (OWLOntologyCreationException e) {
+			log.error(
+					"An error have been thrown while attempting to create ontology. Message was: {}",
+					e.getLocalizedMessage());
+			// TODO Add explanation of this exception
+			throw new OWLApiReasoningServiceException();
+		}
+	}
+
+	/**
+	 * {@see InferredAxiomGenerator}s to use for the classify() reasoning
+	 * method.
+	 * 
+	 * Subclasses may want to change this.
+	 * 
+	 * @return
+	 */
+	protected List<InferredAxiomGenerator<? extends OWLAxiom>> getClassifyAxiomGenerators() {
+		List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<InferredAxiomGenerator<? extends OWLAxiom>>();
+		gens.add(new InferredClassAssertionAxiomGenerator());
+		gens.add(new InferredSubClassAxiomGenerator());
+		gens.add(new InferredEquivalentClassAxiomGenerator());
+		gens.add(new InferredDisjointClassesAxiomGenerator());
+		return gens;
+	}
+
+	/**
+	 * {@see InferredAxiomGenerator}s to use for the enrich() reasoning method.
+	 * 
+	 * Subclasses may want to change this.
+	 * 
+	 * @return
+	 */
+	protected List<InferredAxiomGenerator<? extends OWLAxiom>> getEnrichAxiomGenerators() {
+		List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<InferredAxiomGenerator<? extends OWLAxiom>>();
+		// Classes
+		gens.add(new InferredClassAssertionAxiomGenerator());
+		gens.add(new InferredSubClassAxiomGenerator());
+		gens.add(new InferredEquivalentClassAxiomGenerator());
+		gens.add(new InferredDisjointClassesAxiomGenerator());
+		// data properties
+		gens.add(new InferredDataPropertyCharacteristicAxiomGenerator());
+		gens.add(new InferredEquivalentDataPropertiesAxiomGenerator());
+		gens.add(new InferredSubDataPropertyAxiomGenerator());
+		// object properties
+		gens.add(new InferredEquivalentObjectPropertyAxiomGenerator());
+		gens.add(new InferredInverseObjectPropertiesAxiomGenerator());
+		gens.add(new InferredObjectPropertyCharacteristicAxiomGenerator());
+		gens.add(new InferredSubObjectPropertyAxiomGenerator());
+		// individuals
+		gens.add(new InferredClassAssertionAxiomGenerator());
+		gens.add(new InferredPropertyAssertionGenerator());
+		return gens;
+	}
+
+	/**
+	 * Classify, returns only axioms about classes and instances
+	 * 
+	 * @param ontology
+	 * @return
+	 */
+	public Set<OWLAxiom> classify(OWLOntology ontology)
+			throws OWLApiReasoningServiceException, InconsistentInputException {
+		return run(ontology, getClassifyAxiomGenerators());
+	}
+
+	/**
+	 * Classify, merge SWRL rules in the input ontology, before
+	 * 
+	 * @param ontology
+	 * @param rules
+	 * @return
+	 * @throws InconsistentInputException
+	 * @throws OWLApiReasoningServiceException
+	 */
+	public Set<OWLAxiom> classify(OWLOntology ontology, List<SWRLRule> rules)
+			throws OWLApiReasoningServiceException, InconsistentInputException {
+		log.debug("Calling classify(OWLOntology ontology, List<SWRLRule> rules) ");
+		return run(ontology, rules, getClassifyAxiomGenerators());
+	}
+
+	/**
+	 * Enrich, return all inferences
+	 * 
+	 * @param ontology
+	 * @return
+	 * @throws OWLApiReasoningServiceException
+	 * @throws InconsistentInputException
+	 */
+	public Set<OWLAxiom> enrich(OWLOntology ontology)
+			throws OWLApiReasoningServiceException, InconsistentInputException {
+		return run(ontology, getEnrichAxiomGenerators());
+	}
+
+	/**
+	 * Enrich, merge SWRL rules and return all inferences
+	 * 
+	 * @param ontology
+	 * @param rules
+	 * @return
+	 * @throws OWLApiReasoningServiceException
+	 * @throws InconsistentInputException
+	 */
+	public Set<OWLAxiom> enrich(OWLOntology ontology, List<SWRLRule> rules)
+			throws OWLApiReasoningServiceException, InconsistentInputException {
+		log.debug("Calling enrich(OWLOntology ontology, List<SWRLRule> rules) ");
+		return run(ontology, rules, getEnrichAxiomGenerators());
+	}
+
+	/**
+	 * Only check consistency
+	 * 
+	 * @param ontology
+	 * @return
+	 * @throws OWLApiReasoningServiceException 
+	 */
+	public boolean isConsistent(OWLOntology ontology) throws OWLApiReasoningServiceException {
+		try{
+		return getReasoner(ontology).isConsistent();
+		}catch(Exception e){
+			log.error(
+					"An error have been thrown while attempting to check consistency. Message was: {}",
+					e.getLocalizedMessage());
+			// TODO Add explanation of this exception
+			throw new OWLApiReasoningServiceException();			
+		}
+	}
+
+	/**
+	 * Only check consistency
+	 * 
+	 * @param ontology
+	 * @param rules
+	 * @return
+	 * @throws OWLApiReasoningServiceException 
+	 */
+	public boolean isConsistent(OWLOntology ontology, List<SWRLRule> rules) throws OWLApiReasoningServiceException {
+		log.debug("Create a input ontology to merge rules in.");
+		OWLOntology input;
+		try {
+			input = manager.createOntology();
+			Set<SWRLRule> ruleSet = new HashSet<SWRLRule>();
+			ruleSet.addAll(rules);
+			manager.addAxioms(input, ruleSet);
+			input = manager.getOntology(input.getOntologyID());
+			log.debug("Created ontology: {}", input);
+			return getReasoner(ontology).isConsistent();
+
+		} catch (OWLOntologyCreationException e) {
+			log.error(
+					"An error have been thrown while attempting to create ontology. Message was: {}",
+					e.getLocalizedMessage());
+			// TODO Add explanation of this exception
+			throw new OWLApiReasoningServiceException();
+		}
+	}
+}

Added: incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/InconsistentInputException.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/InconsistentInputException.java?rev=1159654&view=auto
==============================================================================
--- incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/InconsistentInputException.java (added)
+++ incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/InconsistentInputException.java Fri Aug 19 14:48:32 2011
@@ -0,0 +1,11 @@
+package org.apache.stanbol.reasoners.owlapi;
+
+public class InconsistentInputException extends
+		Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -476188659298166685L;
+
+}

Added: incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningService.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningService.java?rev=1159654&view=auto
==============================================================================
--- incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningService.java (added)
+++ incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningService.java Fri Aug 19 14:48:32 2011
@@ -0,0 +1,5 @@
+package org.apache.stanbol.reasoners.owlapi;
+
+public interface OWLApiReasoningService {
+
+}

Added: incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningServiceException.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningServiceException.java?rev=1159654&view=auto
==============================================================================
--- incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningServiceException.java (added)
+++ incubator/stanbol/branches/jena-reasoners/reasoners/owlapi/src/main/java/org/apache/stanbol/reasoners/owlapi/OWLApiReasoningServiceException.java Fri Aug 19 14:48:32 2011
@@ -0,0 +1,10 @@
+package org.apache.stanbol.reasoners.owlapi;
+
+public class OWLApiReasoningServiceException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 4981739689429988435L;
+
+}