diff options
| author | Federico Igne <git@federicoigne.com> | 2021-07-22 09:59:07 +0100 |
|---|---|---|
| committer | Federico Igne <git@federicoigne.com> | 2021-07-22 09:59:07 +0100 |
| commit | cb8572606f8951213bcfe9e6667caa208ad3d189 (patch) | |
| tree | 7ffc99c0d252f7eb828b9147215650dd06149367 | |
| parent | fb0bbb76a53d08dffea74d0ae13c03a122c379bd (diff) | |
| download | RSAComb-cb8572606f8951213bcfe9e6667caa208ad3d189.tar.gz RSAComb-cb8572606f8951213bcfe9e6667caa208ad3d189.zip | |
Review main workflow
4 files changed, 61 insertions, 17 deletions
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) { | |||
| 77 | // Compute rules from ontology axioms | 77 | // Compute rules from ontology axioms |
| 78 | val (facts, rules) = { | 78 | val (facts, rules) = { |
| 79 | val term = RSAUtil.genFreshVariable() | 79 | val term = RSAUtil.genFreshVariable() |
| 80 | val unsafe = ontology.unsafeRoles | 80 | val unsafe = ontology.unsafe |
| 81 | ontology.axioms | 81 | ontology.axioms |
| 82 | .map(a => | 82 | .map(a => |
| 83 | CanonicalModelConverter.convert(a, term, unsafe, Constant(a), Empty) | 83 | 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 | |||
| 10 | import util.{Logger, RDFoxUtil, RSA} | 10 | import util.{Logger, RDFoxUtil, RSA} |
| 11 | import sparql.ConjunctiveQuery | 11 | import sparql.ConjunctiveQuery |
| 12 | 12 | ||
| 13 | import uk.ac.ox.cs.rsacomb.ontology.Ontology | ||
| 14 | import uk.ac.ox.cs.rsacomb.converter.Normalizer | ||
| 15 | import uk.ac.ox.cs.rsacomb.approximation.LowerBound | ||
| 16 | |||
| 13 | case class RSAOption[+T](opt: T) { | 17 | case class RSAOption[+T](opt: T) { |
| 14 | def get[T]: T = opt.asInstanceOf[T] | 18 | def get[T]: T = opt.asInstanceOf[T] |
| 15 | } | 19 | } |
| @@ -103,24 +107,18 @@ object RSAConfig { | |||
| 103 | /** Main entry point to the program */ | 107 | /** Main entry point to the program */ |
| 104 | object RSAComb extends App { | 108 | object RSAComb extends App { |
| 105 | 109 | ||
| 106 | /* | ||
| 107 | * TODO: Aiming for this workflow: | ||
| 108 | * | ||
| 109 | * implicit val manager = new Manager(...) | ||
| 110 | * val original = manager.importFromFile("ontology.owl") | ||
| 111 | * val axioms = original.getAxioms.filter(isLogicalAxiom).normalize(normalizer) | ||
| 112 | * val ontology = new Ontology(axioms, data) | ||
| 113 | * val rsa = ontology.toRSA(approximator) | ||
| 114 | */ | ||
| 115 | |||
| 116 | /* Command-line options */ | 110 | /* Command-line options */ |
| 117 | val config = RSAConfig.parse(args.toList) | 111 | val config = RSAConfig.parse(args.toList) |
| 118 | 112 | ||
| 119 | val rsa = RSAOntology( | 113 | /* Load original ontology and normalize it */ |
| 114 | val ontology = Ontology( | ||
| 120 | config('ontology).get[File], | 115 | config('ontology).get[File], |
| 121 | config('data).get[List[File]], | 116 | config('data).get[List[File]] |
| 122 | None | 117 | ).normalize(new Normalizer) |
| 123 | ) | 118 | |
| 119 | /* Approximate the ontology to RSA */ | ||
| 120 | val toRSA = new LowerBound | ||
| 121 | val rsa = ontology approximate toRSA | ||
| 124 | 122 | ||
| 125 | if (config contains 'query) { | 123 | if (config contains 'query) { |
| 126 | val query = | 124 | 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]) | |||
| 209 | .map(implicits.RDFox.owlapiToRdfoxLiteral) | 209 | .map(implicits.RDFox.owlapiToRdfoxLiteral) |
| 210 | 210 | ||
| 211 | /** Retrieve concepts/roles in the ontology */ | 211 | /** Retrieve concepts/roles in the ontology */ |
| 212 | private val concepts: List[OWLClass] = | 212 | val concepts: List[OWLClass] = |
| 213 | ontology.getClassesInSignature().asScala.toList | 213 | ontology.getClassesInSignature().asScala.toList |
| 214 | private val roles: List[OWLObjectPropertyExpression] = | 214 | val roles: List[OWLObjectPropertyExpression] = |
| 215 | axioms | 215 | axioms |
| 216 | .flatMap(_.objectPropertyExpressionsInSignature) | 216 | .flatMap(_.objectPropertyExpressionsInSignature) |
| 217 | .distinct | 217 | .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 @@ | |||
| 17 | package uk.ac.ox.cs.rsacomb.ontology | 17 | package uk.ac.ox.cs.rsacomb.ontology |
| 18 | 18 | ||
| 19 | import java.io.File | 19 | import java.io.File |
| 20 | import java.util.stream.Collectors | ||
| 20 | 21 | ||
| 21 | import scala.collection.mutable.Map | 22 | import scala.collection.mutable.Map |
| 22 | import scala.collection.JavaConverters._ | 23 | import scala.collection.JavaConverters._ |
| 23 | import scalax.collection.Graph | 24 | import scalax.collection.Graph |
| 24 | import scalax.collection.GraphPredef._, scalax.collection.GraphEdge._ | 25 | import scalax.collection.GraphPredef._, scalax.collection.GraphEdge._ |
| 25 | 26 | ||
| 27 | import org.semanticweb.owlapi.model.parameters.Imports | ||
| 26 | import org.semanticweb.owlapi.apibinding.OWLManager | 28 | import org.semanticweb.owlapi.apibinding.OWLManager |
| 27 | import org.semanticweb.owlapi.model.{OWLOntology, OWLAxiom, OWLLogicalAxiom} | 29 | import org.semanticweb.owlapi.model.{OWLOntology, OWLAxiom, OWLLogicalAxiom} |
| 28 | import org.semanticweb.owlapi.model.{OWLObjectPropertyExpression} | 30 | import org.semanticweb.owlapi.model.{OWLObjectPropertyExpression} |
| @@ -39,6 +41,9 @@ import uk.ac.ox.cs.rsacomb.RSAUtil | |||
| 39 | 41 | ||
| 40 | object Ontology { | 42 | object Ontology { |
| 41 | 43 | ||
| 44 | /** Simplify conversion between Java and Scala collections */ | ||
| 45 | import uk.ac.ox.cs.rsacomb.implicits.JavaCollections._ | ||
| 46 | |||
| 42 | /** Type wrapper representing a dependency graph for the ontology. | 47 | /** Type wrapper representing a dependency graph for the ontology. |
| 43 | * | 48 | * |
| 44 | * The graph is returned along with a map associating each node (IRI | 49 | * The graph is returned along with a map associating each node (IRI |
| @@ -155,6 +160,47 @@ object Ontology { | |||
| 155 | 160 | ||
| 156 | (graph, nodemap) | 161 | (graph, nodemap) |
| 157 | } | 162 | } |
| 163 | |||
| 164 | def apply(axioms: List[OWLLogicalAxiom], datafiles: List[File]): Ontology = | ||
| 165 | new Ontology(axioms, datafiles) | ||
| 166 | |||
| 167 | def apply(ontology: OWLOntology, datafiles: List[File]): Ontology = { | ||
| 168 | |||
| 169 | /** TBox axioms */ | ||
| 170 | var tbox: List[OWLLogicalAxiom] = | ||
| 171 | ontology | ||
| 172 | .tboxAxioms(Imports.INCLUDED) | ||
| 173 | .collect(Collectors.toList()) | ||
| 174 | .collect { case a: OWLLogicalAxiom => a } | ||
| 175 | |||
| 176 | /** RBox axioms */ | ||
| 177 | var rbox: List[OWLLogicalAxiom] = | ||
| 178 | ontology | ||
| 179 | .rboxAxioms(Imports.INCLUDED) | ||
| 180 | .collect(Collectors.toList()) | ||
| 181 | .collect { case a: OWLLogicalAxiom => a } | ||
| 182 | |||
| 183 | /** ABox axioms | ||
| 184 | * | ||
| 185 | * @note this represents only the set of assertions contained in the | ||
| 186 | * ontology file. Data files specified in `datafiles` are directly | ||
| 187 | * imported in RDFox due to performance issues when trying to import | ||
| 188 | * large data files via OWLAPI. | ||
| 189 | */ | ||
| 190 | var abox: List[OWLLogicalAxiom] = | ||
| 191 | ontology | ||
| 192 | .aboxAxioms(Imports.INCLUDED) | ||
| 193 | .collect(Collectors.toList()) | ||
| 194 | .collect { case a: OWLLogicalAxiom => a } | ||
| 195 | |||
| 196 | Ontology(abox ::: tbox ::: rbox, datafiles) | ||
| 197 | } | ||
| 198 | |||
| 199 | def apply(ontofile: File, datafiles: List[File]): Ontology = { | ||
| 200 | val ontology = manager.loadOntologyFromOntologyDocument(ontofile) | ||
| 201 | Ontology(ontology, datafiles) | ||
| 202 | } | ||
| 203 | |||
| 158 | } | 204 | } |
| 159 | 205 | ||
| 160 | /** A wrapper for a generic OWL2 ontology | 206 | /** A wrapper for a generic OWL2 ontology |
