diff options
| author | Federico Igne <federico.igne@cs.ox.ac.uk> | 2021-04-09 20:52:47 +0100 |
|---|---|---|
| committer | Federico Igne <federico.igne@cs.ox.ac.uk> | 2021-04-09 20:52:47 +0100 |
| commit | c6a63f565b8311348a800366c05dc3a6e964872c (patch) | |
| tree | fc08c1635d75fb17f65cb1367f5298f564bff2fd /src/main/scala | |
| parent | e6048bd85da50a8f40538b968fe7ac3b957fdd97 (diff) | |
| download | RSAComb-c6a63f565b8311348a800366c05dc3a6e964872c.tar.gz RSAComb-c6a63f565b8311348a800366c05dc3a6e964872c.zip | |
Fix handling of class expression OWLObjectHasSelf
It was not properly handled in the normalization process.
Diffstat (limited to 'src/main/scala')
| -rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala | 89 | ||||
| -rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/converter/Normalizer.scala | 11 |
2 files changed, 54 insertions, 46 deletions
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 c5a2730..3527da5 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala | |||
| @@ -117,7 +117,6 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) { | |||
| 117 | .collect(Collectors.toList()) | 117 | .collect(Collectors.toList()) |
| 118 | .collect { case a: OWLLogicalAxiom => a } | 118 | .collect { case a: OWLLogicalAxiom => a } |
| 119 | .flatMap(normalizer.normalize) | 119 | .flatMap(normalizer.normalize) |
| 120 | //Logger.print(s"Normalized TBox: ${tbox.length}", Logger.DEBUG) | ||
| 121 | 120 | ||
| 122 | /** RBox axioms */ | 121 | /** RBox axioms */ |
| 123 | var rbox: List[OWLLogicalAxiom] = | 122 | var rbox: List[OWLLogicalAxiom] = |
| @@ -126,7 +125,6 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) { | |||
| 126 | .collect(Collectors.toList()) | 125 | .collect(Collectors.toList()) |
| 127 | .collect { case a: OWLLogicalAxiom => a } | 126 | .collect { case a: OWLLogicalAxiom => a } |
| 128 | .flatMap(normalizer.normalize) | 127 | .flatMap(normalizer.normalize) |
| 129 | //Logger.print(s"Normalized RBox: ${rbox.length}", Logger.DEBUG) | ||
| 130 | 128 | ||
| 131 | /** ABox axioms | 129 | /** ABox axioms |
| 132 | * | 130 | * |
| @@ -141,7 +139,6 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) { | |||
| 141 | .collect(Collectors.toList()) | 139 | .collect(Collectors.toList()) |
| 142 | .collect { case a: OWLLogicalAxiom => a } | 140 | .collect { case a: OWLLogicalAxiom => a } |
| 143 | .flatMap(normalizer.normalize) | 141 | .flatMap(normalizer.normalize) |
| 144 | //Logger.print(s"Normalized ABox: ${abox.length}", Logger.DEBUG) | ||
| 145 | 142 | ||
| 146 | /** Collection of logical axioms in the input ontology */ | 143 | /** Collection of logical axioms in the input ontology */ |
| 147 | var axioms: List[OWLLogicalAxiom] = abox ::: tbox ::: rbox | 144 | var axioms: List[OWLLogicalAxiom] = abox ::: tbox ::: rbox |
| @@ -316,57 +313,61 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) { | |||
| 316 | * @param graph the graph used to compute the axioms to remove. | 313 | * @param graph the graph used to compute the axioms to remove. |
| 317 | * @param nodemap map from graph nodes to ontology axioms. | 314 | * @param nodemap map from graph nodes to ontology axioms. |
| 318 | */ | 315 | */ |
| 319 | def toRSA(): RSAOntology = { | 316 | def toRSA(): RSAOntology = Logger.timed( |
| 317 | { | ||
| 320 | 318 | ||
| 321 | /* Compute the dependency graph for the ontology */ | 319 | /* Compute the dependency graph for the ontology */ |
| 322 | val (graph, nodemap) = this.dependencyGraph() | 320 | val (graph, nodemap) = this.dependencyGraph() |
| 323 | 321 | ||
| 324 | /* Define node colors for the graph visit */ | 322 | /* Define node colors for the graph visit */ |
| 325 | sealed trait NodeColor | 323 | sealed trait NodeColor |
| 326 | case object Unvisited extends NodeColor | 324 | case object Unvisited extends NodeColor |
| 327 | case object Visited extends NodeColor | 325 | case object Visited extends NodeColor |
| 328 | case object ToDelete extends NodeColor | 326 | case object ToDelete extends NodeColor |
| 329 | 327 | ||
| 330 | /* Keep track of node colors during graph visit */ | 328 | /* Keep track of node colors during graph visit */ |
| 331 | var color = Map.from[Resource, NodeColor]( | 329 | var color = Map.from[Resource, NodeColor]( |
| 332 | graph.nodes.toOuter.map(k => (k, Unvisited)) | 330 | graph.nodes.toOuter.map(k => (k, Unvisited)) |
| 333 | ) | 331 | ) |
| 334 | 332 | ||
| 335 | for { | 333 | for { |
| 336 | component <- graph.componentTraverser().map(_ to Graph) | 334 | component <- graph.componentTraverser().map(_ to Graph) |
| 337 | edge <- component | 335 | edge <- component |
| 338 | .outerEdgeTraverser(component.nodes.head) | 336 | .outerEdgeTraverser(component.nodes.head) |
| 339 | .withKind(BreadthFirst) | 337 | .withKind(BreadthFirst) |
| 340 | } yield { | 338 | } yield { |
| 341 | val source = edge._1 | 339 | val source = edge._1 |
| 342 | val target = edge._2 | 340 | val target = edge._2 |
| 343 | color(source) match { | 341 | color(source) match { |
| 344 | case Unvisited | Visited => { | 342 | case Unvisited | Visited => { |
| 345 | color(target) match { | 343 | color(target) match { |
| 346 | case Unvisited => | 344 | case Unvisited => |
| 347 | color(source) = Visited; | 345 | color(source) = Visited; |
| 348 | color(target) = Visited | 346 | color(target) = Visited |
| 349 | case Visited => | 347 | case Visited => |
| 350 | color(source) = ToDelete | 348 | color(source) = ToDelete |
| 351 | case ToDelete => | 349 | case ToDelete => |
| 352 | color(source) = Visited | 350 | color(source) = Visited |
| 351 | } | ||
| 353 | } | 352 | } |
| 353 | case ToDelete => | ||
| 354 | } | 354 | } |
| 355 | case ToDelete => | ||
| 356 | } | 355 | } |
| 357 | } | ||
| 358 | 356 | ||
| 359 | val toDelete = color.iterator.collect { case (resource: IRI, ToDelete) => | 357 | val toDelete = color.iterator.collect { case (resource: IRI, ToDelete) => |
| 360 | nodemap(resource.getIRI) | 358 | nodemap(resource.getIRI) |
| 361 | }.toSeq | 359 | }.toSeq |
| 362 | 360 | ||
| 363 | /* Remove axioms from approximated ontology */ | 361 | /* Remove axioms from approximated ontology */ |
| 364 | ontology.removeAxioms(toDelete: _*) | 362 | ontology.removeAxioms(toDelete: _*) |
| 365 | this.removed = toDelete | 363 | this.removed = toDelete |
| 366 | 364 | ||
| 367 | /* Return RSA ontology */ | 365 | /* Return RSA ontology */ |
| 368 | RSAOntology(ontology, datafiles: _*) | 366 | RSAOntology(ontology, datafiles: _*) |
| 369 | } | 367 | }, |
| 368 | "Horn-ALCHOIQ to RSA approximation:", | ||
| 369 | Logger.DEBUG | ||
| 370 | ) | ||
| 370 | // val edges1 = Seq('A ~> 'B, 'B ~> 'C, 'C ~> 'D, 'D ~> 'H, 'H ~> | 371 | // val edges1 = Seq('A ~> 'B, 'B ~> 'C, 'C ~> 'D, 'D ~> 'H, 'H ~> |
| 371 | // 'G, 'G ~> 'F, 'E ~> 'A, 'E ~> 'F, 'B ~> 'E, 'F ~> 'G, 'B ~> 'F, | 372 | // 'G, 'G ~> 'F, 'E ~> 'A, 'E ~> 'F, 'B ~> 'E, 'F ~> 'G, 'B ~> 'F, |
| 372 | // 'C ~> 'G, 'D ~> 'C, 'H ~> 'D) | 373 | // 'C ~> 'G, 'D ~> 'C, 'H ~> 'D) |
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/converter/Normalizer.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/converter/Normalizer.scala index 205c369..5329f26 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/converter/Normalizer.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/converter/Normalizer.scala | |||
| @@ -401,6 +401,10 @@ class Normalizer() { | |||
| 401 | factory.getOWLNothing | 401 | factory.getOWLNothing |
| 402 | ) | 402 | ) |
| 403 | ) | 403 | ) |
| 404 | /** Self-restriction over an object property */ | ||
| 405 | case (sub: OWLObjectHasSelf, _) => notInHornALCHOIQ(a) | ||
| 406 | case (_, sup: OWLObjectHasSelf) => notInHornALCHOIQ(a) | ||
| 407 | |||
| 404 | /** Axiom is already normalized */ | 408 | /** Axiom is already normalized */ |
| 405 | case _ => Seq(a) | 409 | case _ => Seq(a) |
| 406 | } | 410 | } |
| @@ -507,7 +511,7 @@ class Normalizer() { | |||
| 507 | 511 | ||
| 508 | /** Unsupported */ | 512 | /** Unsupported */ |
| 509 | 513 | ||
| 510 | case a: OWLAsymmetricObjectPropertyAxiom => notSupported(a) | 514 | case a: OWLAsymmetricObjectPropertyAxiom => notInHornALCHOIQ(a) |
| 511 | 515 | ||
| 512 | case a: OWLDatatypeDefinitionAxiom => notSupported(a) | 516 | case a: OWLDatatypeDefinitionAxiom => notSupported(a) |
| 513 | 517 | ||
| @@ -577,7 +581,10 @@ class Normalizer() { | |||
| 577 | ): Seq[OWLLogicalAxiom] = { | 581 | ): Seq[OWLLogicalAxiom] = { |
| 578 | /* Update statistics */ | 582 | /* Update statistics */ |
| 579 | discarded += 1 | 583 | discarded += 1 |
| 580 | Logger print s"'$axiom' has been ignored because it is not in Horn-ALCHOIQ" | 584 | Logger.print( |
| 585 | s"'$axiom' has been ignored because it is not in Horn-ALCHOIQ", | ||
| 586 | Logger.VERBOSE | ||
| 587 | ) | ||
| 581 | Seq() | 588 | Seq() |
| 582 | } | 589 | } |
| 583 | 590 | ||
