LA WEB SEMÁNTICA. OWL PROPÓSITO Introducir el lenguaje OWL y programar ontologías con las APIs Jena y OWLAPI INTRODUCCION OWL (Ontology Web Language) es un lenguaje diseñado para formalizar ontologías. Su expresividad es mayor que la propuesta por RDF/RDF Schema. Entre los recursos expresivos de OWL destacan: unión, intersección, complemento y equivalencia de conceptos, roles funcionales, roles inversos, cuantificación existencial y universal en roles y restricciones numéricas. Se adopta XML como sintaxis concreta de OWL. En esta sección mostramos los recursos expresivos principales de OWL. Declaración de clase (concepto): <rdf:Description rdf:about="http://www.lsi.us.es/ontologia1#Organismo_Publico"> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/> </rdf:Description> Declaración de propiedad (rol) con dominio y rango: <rdf:Description rdf:about="http://www.lsi.us.es/ontologia1#da_clases_en"> <rdfs:range rdf:resource="http://www.lsi.us.es/ontologia1#Asignatura"/> <rdfs:domain rdf:resource="http://www.lsi.us.es/ontologia1#Profesor"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> </rdf:Description> Declaración de subclase (subconcepto): <rdf:Description rdf:about="http://www.lsi.us.es/ontologia1#Colaborador"> <rdfs:subClassOf rdf:resource="http://www.lsi.us.es/ontologia1#Profesor"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/> </rdf:Description> Equivalencia entre clases (conceptos): <rdf:Description rdf:about="http://www.lsi.us.es/ontologia1#Docente_Funcionario"> <owl:equivalentClass rdf:resource="http://www.lsi.us.es/ontologia1#Titular"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/> </rdf:Description> LA WEB SEMÁNTICA. OWL Complemento de clase (concepto): <rdf:Description rdf:about="http://www.lsi.us.es/ontologia1#Docente_No_Funcionario"> <owl:complementOf rdf:resource="http://www.lsi.us.es/ontologia1#Docente_Funcionario"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/> </rdf:Description> Declaración de propiedad (rol) funcional : <rdf:Description rdf:about="http://www.lsi.us.es/ontologia1#tiene_asignado_el_despacho" > <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#FunctionalProperty"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/> </rdf:Description> Declaración de restricciones con cuantificación universal sobre un rol: <rdf:Description rdf:nodeID="A3"> <owl:allValuesFrom rdf:resource="http://www.lsi.us.es/ontologia1#Departamento"/> <owl:onProperty rdf:resource="http://www.lsi.us.es/ontologia1#trabaja_en"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Restriction"/> </rdf:Description> Declaración de restricciones numéricas sobre un rol: <rdf:Description rdf:nodeID="A4"> <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int">1</owl:minCardinal ity> <owl:onProperty rdf:resource="http://www.lsi.us.es/ontologia1#da_clases_en"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Restriction"/> </rdf:Description> Declaración de clases disjuntas: <rdf:Description rdf:about="http://www.lsi.us.es/ontologia1#Ayudante"> <owl:disjointWith rdf:resource="http://www.lsi.us.es/ontologia1#Colaborador"/> <owl:disjointWith rdf:resource="http://www.lsi.us.es/ontologia1#Titular"/> <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/> </rdf:Description> LA WEB SEMÁNTICA. OWL PROGRAMANDO DOCUMENTOS OWL CON JENA En el contexto tecnológico, destacan dos APIs para programar ontologías OWL: Jena y OWLAPI. Esta sección introducimos el API Jena. Declaración de una ontología OWL: OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF); Establecimiento de la dirección base (dirección lógica): String prefijo = "http://www.lsi.us.es/ontologia1#"; m.setNsPrefix("", prefijo); Declaración de clase (concepto): m.createClass(prefijo + "Curso"); Declaración de propiedad (rol) con dominio y rango: m.createObjectProperty(prefijo + "esta_adscrita_a"); m.getObjectProperty(prefijo + "esta_adscrita_a").addDomain(m.getOntClass(prefijo + "Asignatura")); m.getObjectProperty(prefijo + "esta_adscrita_a").addRange(m.getOntClass(prefijo + "Departamento")); Declaración de subclase (subconcepto): m.getOntClass(prefijo + "Profesor").addSubClass(m.getOntClass(prefijo + "Titular")); Unión de clases (conceptos): RDFList l = m.createList(); RDFNode n = m.getResource(prefijo + "Ayudante"); l = l.cons(n); n = m.getResource(prefijo + "Titular"); l = l.cons(n); n = m.getResource(prefijo + "Colaborador"); l = l.cons(n); m.createUnionClass(prefijo + "Profesor", l); Intersección de clases (conceptos): RDFList l2 = m.createList(); n = m.getResource(prefijo + "Funcionario"); l2 = l2.cons(n); n = m.getResource(prefijo + "Docente"); LA WEB SEMÁNTICA. OWL l2 = l2.cons(n); m.createIntersectionClass(prefijo + "Docente_Funcionario", l2); Complemento de clase (concepto): m.createClass(prefijo+"Docente_No_Funcionario").convertToComplementCla ss(m.getOntClass(prefijo+"Docente_Funcionario")); Declaración de propiedad (rol) funcional : m.getOntProperty(prefijo + "esta_adscrita_a").convertToFunctionalProperty(); Declaración de restricciones con cuantificación universal sobre un rol: m.createRestriction(m.getOntProperty(prefijo+"trabaja_en")).convertToA llValuesFromRestriction(m.getOntResource(prefijo+"Departamento")).addS ubClass(m.getOntClass(prefijo+"Profesor")); Declaración de restricciones numéricas sobre un rol: m.createRestriction(m.getObjectProperty(prefijo + "da_clases_en")).convertToMinCardinalityRestriction(1).addSubClass(m.g etOntClass(prefijo+"Profesor")); Declaración de clases disjuntas: m.getOntClass(prefijo + "Ayudante").addDisjointWith(m.getOntClass(prefijo + "Titular")); PROGRAMANDO DOCUMENTOS OWL CON OWLAPI En el contexto tecnológico destacan dos APIs para programar ontologías: Jena y OWLAPI. Esta sección introducimos el API OWLAPI. Lectura de ontología remota y crear una copia local: OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); URI uri = URI.create( "http://www.co-ode.org/ontologies/pizza/2005/05/16/pizza.owl"); OWLOntology ontology = manager.loadOntology(uri); URI uri2 = URI.create( "file:/C://Users//Fran//Docencia//Master//Temario//Tema8//pizza.owl"); manager.saveOntology(ontology, new OWLXMLOntologyFormat(), uri2); LA WEB SEMÁNTICA. OWL Crear una ontología: OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); URI base = URI.create("http://www.lsi.us.es/ontologia5"); URI uri = URI.create( "file:/C://Users//Fran//Docencia//Master//Temario//Tema8//ontologia5.o wl"); OWLOntology ontologia = manager.createOntology(base); OWLDataFactory factory = manager.getOWLDataFactory(); Subclase: OWLClass clase1 = factory.getOWLClass(URI.create(base+"#Profesor")); OWLClass clase2 = factory.getOWLClass(URI.create(base+"#Titular")); OWLAxiom axioma = factory.getOWLSubClassAxiom(clase2, clase1); AddAxiom change = new AddAxiom(ontologia,axioma); manager.applyChange(change); Clases disjuntas: Set<OWLDescription> clases = new HashSet<OWLDescription>(); clase1 = factory.getOWLClass(URI.create(base+"#Titular")); clases.add(clase1); clase1 = factory.getOWLClass(URI.create(base+"#Ayudante")); clases.add(clase1); clase1 = factory.getOWLClass(URI.create(base+"#Colaborador")); clases.add(clase1); change = new AddAxiom (ontologia,factory.getOWLDisjointClassesAxiom(clases)); manager.applyChange(change); Intersección de clases y equivalencia: clases = new HashSet<OWLDescription>(); clase1 = factory.getOWLClass(URI.create(base+"#Docente")); clases.add(clase1); clase1 = factory.getOWLClass(URI.create(base+"#Funcionario")); clases.add(clase1); OWLObjectIntersectionOf interseccion = factory.getOWLObjectIntersectionOf(clases); clase2 = factory.getOWLClass(URI.create(base+"#Docente_Funcionario")); change = new AddAxiom(ontologia, factory.getOWLEquivalentClassesAxiom(clase2, interseccion)); manager.applyChange(change); Rol. Dominios y rangos: OWLObjectPropertyExpression propiedad = factory.getOWLObjectProperty(URI.create(base+"#esta_adscrita_a")); clase1 = factory.getOWLClass(URI.create(base+"#Asignatura")); change = new AddAxiom(ontologia, factory.getOWLObjectPropertyDomainAxiom(propiedad, clase1)); manager.applyChange(change); clase2 = factory.getOWLClass(URI.create(base+"#Departamento")); LA WEB SEMÁNTICA. OWL change = new AddAxiom(ontologia, factory.getOWLObjectPropertyRangeAxiom(propiedad, clase2)); manager.applyChange(change); Roles funcionales: propiedad = factory.getOWLObjectProperty(URI.create(base+"#esta_adscrita_a")); change = new AddAxiom(ontologia, factory.getOWLFunctionalObjectPropertyAxiom(propiedad)); manager.applyChange(change); propiedad2 = factory.getOWLDataProperty( URI.create(base+"#tiene_asignado_el_despacho")); change = new AddAxiom(ontologia, factory.getOWLFunctionalDataPropertyAxiom(propiedad2)); manager.applyChange(change); Cuantificación universal: propiedad = factory.getOWLObjectProperty(URI.create(base+"#trabaja_en")); clase1 = factory.getOWLClass(URI.create(base+"#Departamento")); clase2 = factory.getOWLClass(URI.create(base+"#Profesor")); OWLObjectAllRestriction restriccion1 = factory.getOWLObjectAllRestriction(propiedad, clase1); axioma = factory.getOWLSubClassAxiom(clase2, restriccion1); change = new AddAxiom(ontologia,axioma); manager.applyChange(change); Restricción numérica: propiedad = factory.getOWLObjectProperty(URI.create(base+"#da_clases_en")); clase1 = factory.getOWLClass(URI.create(base+"#Asignatura")); clase2 = factory.getOWLClass(URI.create(base+"#Profesor")); OWLObjectMinCardinalityRestriction restriccion2 = factory.getOWLObjectMinCardinalityRestriction(propiedad, 1, clase1); axioma = factory.getOWLSubClassAxiom(clase2, restriccion2); change = new AddAxiom(ontologia,axioma); manager.applyChange(change); Aserto (clase): OWLIndividual ind1 = factory2.getOWLIndividual(URI.create(base2+"#PL1")); OWLClass clase = factory1.getOWLClass(URI.create(base1+"#Asignatura")); AddAxiom change = new AddAxiom(ontologia2,factory2.getOWLClassAssertionAxiom(ind1, clase)); manager2.applyChange(change); LA WEB SEMÁNTICA. OWL Aserto (rol): ind1 = factory2.getOWLIndividual(URI.create(base2+"#PL1")); OWLIndividual ind2 = factory2.getOWLIndividual(create(base2+"#LSI")); OWLObjectProperty propiedad = factory1.getOWLObjectProperty(URI.create(base1+"#esta_adscrita_a")); change = new AddAxiom(ontologia2, factory2.getOWLObjectPropertyAssertionAxiom(ind1, propiedad, ind2)); manager2.applyChange(change); Mezclar ontologías: OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); manager.loadOntologyFromPhysicalURI(URI.create("file:/C://Users//Fran/ /Docencia//Master//Temario//Tema8//ontologia5.owl")); manager.loadOntologyFromPhysicalURI(URI.create("file:/C://Users//Fran/ /Docencia//Master//Temario//Tema8//modelo5.owl")); OWLOntologyMerger mezclador = new OWLOntologyMerger(manager); URI base = URI.create("http://www.lsi.us.es/ontologia6"); OWLOntology ontologia = mezclador.createMergedOntology(manager, base); TRABAJO PROPUESTO Consulte la documentación suministrada por W3C en relación a OWL. Consulte la documentación suministrada por Jena en relación a las ontologías OWL. Programe con Jena una ontología OWL para la terminología propuesta en el Problema 1 del Tema 2. Consulte la documentación suministrada por OWLAPI y programe una ontología OWL para la terminología propuesta en el Problema 1 del Tema 2.