2011-04-30 17 views
9

Tengo algunos trillizos de datos que quiero escribir en algún tipo de ontología OWL básica. Tengo tríos como:¿Cómo crear una ontología en Java?

Delhi is part of India 

o

India is an Asian country 

Tenga en cuenta que he relaciones como "es-un", "parte de", o "relacionado a". ¿Cuál es la forma más simple de construir una ontología? ¡Cualquier ejemplo de trabajo o una referencia a un sitio web de ejemplo será de gran ayuda!

+0

¿Cuál es la parte con la que tiene problemas, la extracción de información o la API de Jena? –

+0

Necesito un ejemplo simple para crear un archivo OWL basado en las declaraciones anteriores o triples. Soy un principiante y no tengo mucho conocimiento sobre ontología o jena. ¡Un ejemplo simple de crear un modelo de búho me será útil! – wasimbhalli

Respuesta

8

Hay un montón de diferentes cosas mezcladas en su pregunta, le recomiendo encarecidamente que tome un poco de tiempo (lejos del teclado!) Para pensar en lo que estamos tratando de lograr aquí.

En primer lugar, las ontologías geográficas pueden ser bastante complejas, y ya se ha trabajado mucho en esta área. Probablemente el punto de partida obvio es el GeoNames ontology, que da nombres a las características geográficas, incluidas ciudades como Dehli y países como India. Por lo menos, debe volver a utilizar esos nombres para los lugares de su aplicación, ya que eso maximizará las posibilidades de que sus datos se puedan unir con éxito con otras fuentes de datos vinculados disponibles.

Sin embargo, probablemente no desee la totalidad de GeoNames en su aplicación (supongo), por lo que también debe tener en claro por qué necesita una ontología. Una buena forma de abordar esto es desde el exterior de su aplicación: en lugar de preocuparse por qué tipo de modelo de Jena usar, empiece por pensar en formas de completar la oración "con la ontología, un usuario de mi aplicación podrá ... ". Esto debería llevarlo a establecer algunas preguntas de competencia (consulte, por ejemplo, section 3 of this guide) para su ontología. Una vez que sepa qué tipo de información desea representar y qué tipos de consultas necesita aplicar, las opciones de tecnología serán mucho más claras. Me doy cuenta de que estas aplicaciones suelen desarrollarse de forma iterativa, y querrás probar el código bastante pronto, pero aún así, recomiendo tener más claro tu destino antes de comenzar tu viaje de codificación.

Quiere decir que quiere usar Jena para conducir un sitio web. Hay muchas opciones aquí. No se deje engañar por el término web semántica - esto en realidad significa aportar cualidades parecidas a la web a conjuntos de datos intercalados, en lugar de poner la semántica en páginas web legibles por el hombre per se. Si bien puede hacerlo, y muchas personas lo hacen, necesitará algunas capas adicionales en su arquitectura. Normalmente utilizamos uno de dos enfoques: utilizar Jena con un motor de plantillas, como Velocity, en un contenedor de servlets, o usar un marco web de Ruby y conducir Jena por JRuby.Hay muchas otras maneras de resolver este problema en particular: Jena no aborda la publicación web directamente, pero puede usarse en cualquier marco web basado en Java.

Finalmente, con respecto a espacios de nombres, realmente debería volver a utilizar los vocabularios existentes, y por lo tanto los espacios de nombres, cuando sea posible. No invente nuevos nombres para cosas que ya tienen representaciones en la web de datos en alguna parte. Use GeoNames, o DbPedia, o cualquiera de los muchos otros vocabularios publicados donde quepan. Si no encajan, entonces debes crear un nuevo nombre en lugar de usar un nombre existente de una manera no compatible. En este caso, debe usar el dominio web de su aplicación (por ejemplo, su empresa o universidad) como base para el espacio de nombres. Idealmente, debe publicar su ontología en la URL base del espacio de nombres, pero a veces puede ser difícil organizarla según las políticas web locales.

+0

bien, gracias, ¡necesito estudiar más sobre ontología! – wasimbhalli

0

Acaba de declarar una clase tripleta que consta de un sujeto, objeto y predicado. "Has-a" es un predicado, por lo que los elementos de la ontología se vería así:

"Dehli", "is-in", "India" 
"India", "is-in", "Asia" 
"India", "is-a", "country" 

Esto no se ocupa de las consultas, por supuesto, pero teniendo en cuenta un almacén de datos decente (incluso una base de datos haría) podría empezar para construir una ontología flexible con un mecanismo de consulta decente.

JENA es mucho, mucho más capaz de lo que esto crearía, por supuesto; sí proporciona la consulta de semántica, así como ahora mejor definición y resolución de recursos. Sin embargo, es mucho más complicado que una simple estructura de triplete; todo depende de lo que necesites

+0

Solo quiero crear un archivo de ontología basado en él, estoy tratando de usar ModelFactory.createOntologyModel (OntModelSpec.OWL_MEM) pero tengo problemas para definir mis propios enunciados, etc. Además, ¿no sé qué espacio de nombres usar? ¿Algún ejemplo? – wasimbhalli

+0

Muéstrenos el código que tiene hasta ahora, y tal vez podamos ayudarlo. –

+0

No puedo escribir un código preciso para mi problema. – wasimbhalli

1

Eche un vistazo a Protege de Stanford. Es un editor de ontología.

2

Sugiero OWL API de Manchester University. De esta manera, puede comenzar a crear su ontología "sobre la marcha" en Java, y con una sola invocación a un método puede serializarla en su formato preferido (RDF, sintaxis de Manchester, etc.) si lo necesita, o directamente trabajando en la representación de la memoria De esta forma, puede prototipar rápidamente y experimentar su ontología en el contexto de su programa.

Para obtener una descripción general de la biblioteca y sus componentes principales, sugiero el tutorial (code tutorial) proporcionado por el creador de la biblioteca, que cubre el 90% de las necesidades básicas.

PD: Protégé está basado en OWL Api, también puedes intentarlo como se sugiere, pero especialmente al principio preferí jugar rápidamente con ontologías y cambiar a un entorno de ingeniería como Protege cuando mi mente estaba lo suficientemente clara. Además, con una ontología externa necesitaría aprender cómo navegarla, que en mi humilde opinión realmente no vale la pena desde el principio.

+1

No noté que ya había una respuesta aceptada, espero que la mía pueda ser útil para otra persona :) –

0
/** 
    - This is maven dependencies for owl-api 
    <dependency> 
     <groupId>net.sourceforge.owlapi</groupId> 
     <artifactId>owlapi-api</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>net.sourceforge.owlapi</groupId> 
     <artifactId>owlapi-apibinding</artifactId> 
    </dependency> 

    * First of all you need to initialize ontology: 

**/ 
        private OWLDataFactory factory; 

        private PrefixManager pm; 

        private OWLOntology ontology; 

        private String pmString = "#"; 

        private OWLOntologyManager manager; 

        private OWLReasoner reasoner; 

        private ShortFormEntityChecker entityChecker; 

        private BidirectionalShortFormProviderAdapter bidirectionalShortFormProviderAdapter; 

      private void initializeOntology(String fileContent) 
          throws OWLOntologyCreationException { 
         InputStream bstream = new ByteArrayInputStream(fileContent.getBytes()); 
         this.manager = OWLManager.createOWLOntologyManager(); 
         this.ontology = this.manager.loadOntologyFromOntologyDocument(bstream); 
         IRI ontologyIRI = this.ontology.getOntologyID().getOntologyIRI(); 
         this.pm = new DefaultPrefixManager(ontologyIRI.toString() 
           + this.pmString); 
         this.factory = this.manager.getOWLDataFactory(); 

         ReasonerFactory factory = new ReasonerFactory(); 
         this.reasoner = factory.createReasoner(this.ontology); 

         Set<OWLOntology> onts = new HashSet<>(); 
         onts.add(this.ontology); 

         DefaultPrefixManager defaultPrefixManager = new DefaultPrefixManager(
           this.pm); 
         ShortFormProvider shortFormProvider = new ManchesterOWLSyntaxPrefixNameShortFormProvider(
           defaultPrefixManager); 
         this.bidirectionalShortFormProviderAdapter = new BidirectionalShortFormProviderAdapter(
           this.manager, onts, shortFormProvider); 
         this.entityChecker = new ShortFormEntityChecker(
           this.bidirectionalShortFormProviderAdapter); 

        } 

/* 
    After that you need to define your classes and the relations of the classes. These relations calls as object properties in ontology. Instance of each ontology class calls as individual and the attributies of the classes (for person name, age , adress) calls as data-property. 
*/ 
// To create a new individual of an ontology class : 



     public OWLClass getClass(String className) { 
       return this.factory.getOWLClass(":" + className, this.pm); 
      } 




      public OWLNamedIndividual createInvidual(String cls, String invname) { 
             OWLNamedIndividual res = this.factory.getOWLNamedIndividual(":" 
               + invname, this.pm); 
             this.manager.addAxiom(this.ontology, 
               this.factory.getOWLDeclarationAxiom(res)); 
             OWLClassAssertionAxiom axiom = this.factory.getOWLClassAssertionAxiom(
               getClass(cls), res); 
             this.manager.addAxiom(this.ontology, axiom); 
             return res; 
      } 

// To create an object property : 

// This method will create an object property named prop if it is not exist. 



     public OWLObjectProperty getObjectProperty(String prop) { 
        return this.factory.getOWLObjectProperty(":" + prop, this.pm); 
       } 

      public void addObjectProperty(String propname, OWLNamedIndividual prop, 
         OWLNamedIndividual obj) { 
        OWLObjectPropertyAssertionAxiom axiom = this.factory 
          .getOWLObjectPropertyAssertionAxiom(
            getObjectProperty(propname), obj, prop); 
        this.manager.addAxiom(this.ontology, axiom); 
       } 

    // And finally , to add a data-property to individuals : 

     public OWLDataProperty getDataProperty(String prop) { 
         return this.factory.getOWLDataProperty(":" + prop, this.pm); 
        } 

     public void addDataProperty(String propname, boolean propvalue, 
         OWLNamedIndividual inv) { 
        OWLAxiom axiom = this.factory.getOWLDataPropertyAssertionAxiom(
          getDataProperty(propname), inv, propvalue); 
        this.manager.addAxiom(this.ontology, axiom); 
     } 
Cuestiones relacionadas