From cb8572606f8951213bcfe9e6667caa208ad3d189 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Thu, 22 Jul 2021 09:59:07 +0100 Subject: Review main workflow --- .../scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala | 2 +- src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala | 26 ++++++------ .../scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala | 4 +- .../uk/ac/ox/cs/rsacomb/ontologies/Ontology.scala | 46 ++++++++++++++++++++++ 4 files changed, 61 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala index af6c463..ee808c3 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala @@ -77,7 +77,7 @@ class CanonicalModel(val ontology: RSAOntology) { // Compute rules from ontology axioms val (facts, rules) = { val term = RSAUtil.genFreshVariable() - val unsafe = ontology.unsafeRoles + val unsafe = ontology.unsafe ontology.axioms .map(a => CanonicalModelConverter.convert(a, term, unsafe, Constant(a), Empty) diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala index 82da9df..8e5169d 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala @@ -10,6 +10,10 @@ import tech.oxfordsemantic.jrdfox.logic.sparql.statement.SelectQuery import util.{Logger, RDFoxUtil, RSA} import sparql.ConjunctiveQuery +import uk.ac.ox.cs.rsacomb.ontology.Ontology +import uk.ac.ox.cs.rsacomb.converter.Normalizer +import uk.ac.ox.cs.rsacomb.approximation.LowerBound + case class RSAOption[+T](opt: T) { def get[T]: T = opt.asInstanceOf[T] } @@ -103,24 +107,18 @@ object RSAConfig { /** Main entry point to the program */ object RSAComb extends App { - /* - * TODO: Aiming for this workflow: - * - * implicit val manager = new Manager(...) - * val original = manager.importFromFile("ontology.owl") - * val axioms = original.getAxioms.filter(isLogicalAxiom).normalize(normalizer) - * val ontology = new Ontology(axioms, data) - * val rsa = ontology.toRSA(approximator) - */ - /* Command-line options */ val config = RSAConfig.parse(args.toList) - val rsa = RSAOntology( + /* Load original ontology and normalize it */ + val ontology = Ontology( config('ontology).get[File], - config('data).get[List[File]], - None - ) + config('data).get[List[File]] + ).normalize(new Normalizer) + + /* Approximate the ontology to RSA */ + val toRSA = new LowerBound + val rsa = ontology approximate toRSA if (config contains 'query) { val query = diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala index 630d2a0..73c4411 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala @@ -209,9 +209,9 @@ class RSAOntology(axioms: List[OWLLogicalAxiom], datafiles: List[File]) .map(implicits.RDFox.owlapiToRdfoxLiteral) /** Retrieve concepts/roles in the ontology */ - private val concepts: List[OWLClass] = + val concepts: List[OWLClass] = ontology.getClassesInSignature().asScala.toList - private val roles: List[OWLObjectPropertyExpression] = + val roles: List[OWLObjectPropertyExpression] = axioms .flatMap(_.objectPropertyExpressionsInSignature) .distinct diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/ontologies/Ontology.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/ontologies/Ontology.scala index 9d947bc..723bcaa 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/ontologies/Ontology.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/ontologies/Ontology.scala @@ -17,12 +17,14 @@ package uk.ac.ox.cs.rsacomb.ontology import java.io.File +import java.util.stream.Collectors import scala.collection.mutable.Map import scala.collection.JavaConverters._ import scalax.collection.Graph import scalax.collection.GraphPredef._, scalax.collection.GraphEdge._ +import org.semanticweb.owlapi.model.parameters.Imports import org.semanticweb.owlapi.apibinding.OWLManager import org.semanticweb.owlapi.model.{OWLOntology, OWLAxiom, OWLLogicalAxiom} import org.semanticweb.owlapi.model.{OWLObjectPropertyExpression} @@ -39,6 +41,9 @@ import uk.ac.ox.cs.rsacomb.RSAUtil object Ontology { + /** Simplify conversion between Java and Scala collections */ + import uk.ac.ox.cs.rsacomb.implicits.JavaCollections._ + /** Type wrapper representing a dependency graph for the ontology. * * The graph is returned along with a map associating each node (IRI @@ -155,6 +160,47 @@ object Ontology { (graph, nodemap) } + + def apply(axioms: List[OWLLogicalAxiom], datafiles: List[File]): Ontology = + new Ontology(axioms, datafiles) + + def apply(ontology: OWLOntology, datafiles: List[File]): Ontology = { + + /** TBox axioms */ + var tbox: List[OWLLogicalAxiom] = + ontology + .tboxAxioms(Imports.INCLUDED) + .collect(Collectors.toList()) + .collect { case a: OWLLogicalAxiom => a } + + /** RBox axioms */ + var rbox: List[OWLLogicalAxiom] = + ontology + .rboxAxioms(Imports.INCLUDED) + .collect(Collectors.toList()) + .collect { case a: OWLLogicalAxiom => a } + + /** ABox axioms + * + * @note this represents only the set of assertions contained in the + * ontology file. Data files specified in `datafiles` are directly + * imported in RDFox due to performance issues when trying to import + * large data files via OWLAPI. + */ + var abox: List[OWLLogicalAxiom] = + ontology + .aboxAxioms(Imports.INCLUDED) + .collect(Collectors.toList()) + .collect { case a: OWLLogicalAxiom => a } + + Ontology(abox ::: tbox ::: rbox, datafiles) + } + + def apply(ontofile: File, datafiles: List[File]): Ontology = { + val ontology = manager.loadOntologyFromOntologyDocument(ontofile) + Ontology(ontology, datafiles) + } + } /** A wrapper for a generic OWL2 ontology -- cgit v1.2.3