Buenos días a todos.

El otro día escribía una entrada contando cómo instalar y conectar PHP/JAVA Bridge a un hosting en apache para que se pudiera ver todo dentro de un dominio tipo www.loquesea.com.

Pues bien, el siguiente paso, tras hablar con mi director de tesis, es el de trabajar con una API que nos permita editar la ontología que estoy generando en formato OWL, y entre las distintas opciones (más interesantes) encontramos dos (hay muchas más, pero interesantes para nuestro caso, dos):

Ambas son interesantes, sin embargo, JENA tiene una RDF-Dependencia por lo que hemos podido leer (aunque funciona también bien con ficheros OWL), pero OWLAPI tiene la gran ventaja de que es la que utilizan los propios desarrolladores de Protégé, así que seguramente funcione mejor para nuestro caso particular (quizá nos equivocamos, pero de momento nos aventuramos a probar). Anteriormente Protégé tenía su propia API ProtégeOWLAPI, pero dejaron de utilizarla en 2010 a favor de la API OWLAPI.

Os recomiendo este enlace que viene muy bien explicado todo:

http://stackoverflow.com/questions/17567771/owl-api-jena-api-protege-api-which-one-to-use

Creando mi primer código con OWLAPI

Al igual que cualquier típico Hola Mundo que creamos en cualquier lenguaje, podemos crear un primer proyecto para comprobar que hemos instalado bien las librerías correspondientes a OWL.

Yo particularmente utilizo Eclipse para mi proyecto, mi idea es, generar el código en Eclipse y posteriormente trasladarlo a mi hosting con PHP/JAVA Bridge, así que la tarea no es sencilla, pero me gustan los retos.

Creando el proyecto en Eclipse y descargando las librerías necesarias

En primer lugar, debemos descargar las librerías necesarias para nuestro proyecto, disponibles en este enlace:

http://sourceforge.net/projects/owlapi/files/

En mi caso particular, necesito solo el siguiente fichero:

Descargado este fichero y habiendo creado un proyecto en eclipse (no voy a indicar cómo se crea proyecto en eclipse, doy por supuesto que lo sabéis, sino se haría esto muy extenso), el siguiente paso es añadir esta librería, para ello sencillamente la agregué al proyecto.

Hay muchas formas, yo indico aquí una:

  1. Botón derecho sobre el nombre de nuestro proyecto en la parte izquierda de Eclipse y pulsamos sobre Properties (tengo eclipse en Inglés así que lo explicaré en Inglés).
  2. Nos dirigimos a Java Build Path y pinchamos sobre Libraries en la zona superior.
  3. A continuación podemos añadir un Jar externo de forma directa, o crear nuestra librería, yo he optado por crear una librería para poder usarla en futuros proyectos fácilmente, así que pinché sobre Add Library, elegí un nombre (OWLAPILibs) y a continuación pinché sobre Add External Jar, en este paso seleccioné el fichero descargado anteriormente owlapi-osgidistribution-4.0.2.jar.
  4. Una vez creada la librería, sencillamente sería agregarla a nuestro build path, debe quedar algo así:Captura de pantalla 2015-08-19 11.39.40

Creando, compilando y ejecutando un “hola mundo”

Bien, teniendo esto agregado, una persona razonable pensaría que todo está ya correcto para funcionar, así que generamos el código para comprobar que funciona todo bien tras haber añadido la librería a nuestro proyecto.

Este es el código que yo cree (suponiendo que nuestro “package” se llama owl.cs.man.ac.uk.owltutorial y que el fichero se llama OWLAPITutorial ):

package owl.cs.man.ac.uk.owltutorial;

import java.io.File;
import java.util.Set;

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;

public class OWLAPITutorial {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// load file
	    File file = new File("/Users/jabenitez/Tesis/fitnessOntology/ontofit.owl");

	    // loading the ontology
	    try {
	        OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
	        OWLOntology localOntology = manager.loadOntologyFromOntologyDocument(file);

	        //getting all axioms    
	        Set<OWLAxiom> axSet= localOntology.getAxioms();

			System.out.println(localOntology.getLogicalAxiomCount());

	    } catch (OWLOntologyCreationException e) {
	        e.printStackTrace();
	    }

	}

}

En la parte del código donde indico dónde está mi ontología, debéis sustituirlo por donde tengáis la vuestra:

 File file = new File("/Users/jabenitez/Tesis/fitnessOntology/ontofit.owl");

Pues bien, si ejecutamos esto, probablemente obtengáis un error similar al siguiente:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/inject/Provider
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at owl.cs.man.ac.uk.owltutorial.OWLAPITutorial.main(OWLAPITutorial.java:22)
Caused by: java.lang.ClassNotFoundException: com.google.inject.Provider
	at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 25 more

Pues bien, la solución al fatídico error Exception in thread “main” java.lang.NoClassDefFoundError: com/google/inject/Provider es bastante sencilla, os explico:

  1. Descomprimís el fichero que habéis descargado anteriormente owlapi-osgidistribution-4.0.2.jar
  2. A continuación, dentro de la carpeta owlapi-osgidistribution-4.0.2/lib tenéis multitud de librerías.
  3. Pues bien esas librerías son las que debéis añadir a vuestro proyecto, de la misma forma que lo hicimos antes.
  4. Yo cree una librería llamada OWLAPI-OSGI y dentro agregué todos los .jar correspondientes.

Hecho esto, si probáis a ejecutar el código anterior, veréis que ya funciona correctamente.

Espero haberos librado de algunas horas foreando, la solución la encontré en este enlace:

http://sourceforge.net/p/owlapi/mailman/message/34175593/

Saludos! 🙂