diff options
| author | Federico Igne <federico.igne@cs.ox.ac.uk> | 2021-07-20 09:59:52 +0100 |
|---|---|---|
| committer | Federico Igne <federico.igne@cs.ox.ac.uk> | 2021-07-20 09:59:52 +0100 |
| commit | f0d1bfe564853a63128ad139520c9838778a7b61 (patch) | |
| tree | 217a5529ceec209302f4e7fe0aedf8096cd23edb | |
| parent | 9c8efc0410487c301b17c8dfb68b843c7dff403e (diff) | |
| download | RSAComb-f0d1bfe564853a63128ad139520c9838778a7b61.tar.gz RSAComb-f0d1bfe564853a63128ad139520c9838778a7b61.zip | |
Add generic Ontology wrapper for common tasks
| -rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/ontologies/Ontology.scala | 90 |
1 files changed, 90 insertions, 0 deletions
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 new file mode 100644 index 0000000..d7e57dd --- /dev/null +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/ontologies/Ontology.scala | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2020, 2021 KRR Oxford | ||
| 3 | * | ||
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | * you may not use this file except in compliance with the License. | ||
| 6 | * You may obtain a copy of the License at | ||
| 7 | * | ||
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | * | ||
| 10 | * Unless required by applicable law or agreed to in writing, software | ||
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | * See the License for the specific language governing permissions and | ||
| 14 | * limitations under the License. | ||
| 15 | */ | ||
| 16 | |||
| 17 | package uk.ac.ox.cs.rsacomb.ontology | ||
| 18 | |||
| 19 | import java.io.File | ||
| 20 | |||
| 21 | import org.semanticweb.owlapi.apibinding.OWLManager | ||
| 22 | import org.semanticweb.owlapi.model.{OWLOntology, OWLAxiom, OWLLogicalAxiom} | ||
| 23 | import org.semanticweb.owlapi.model.{OWLObjectPropertyExpression} | ||
| 24 | import org.semanticweb.owlapi.reasoner.structural.StructuralReasonerFactory | ||
| 25 | |||
| 26 | object Ontology { | ||
| 27 | |||
| 28 | /** Manager instance to interface with OWLAPI */ | ||
| 29 | val manager = OWLManager.createOWLOntologyManager() | ||
| 30 | //val factory = manager.getOWLDataFactory() | ||
| 31 | |||
| 32 | } | ||
| 33 | |||
| 34 | /** A wrapper for | ||
| 35 | */ | ||
| 36 | class Ontology(val axioms: List[OWLLogicalAxiom], val datafiles: List[File]) { | ||
| 37 | |||
| 38 | /** Extend OWLAxiom functionalities */ | ||
| 39 | import uk.ac.ox.cs.rsacomb.implicits.RSAAxiom._ | ||
| 40 | |||
| 41 | /** OWLOntology based on input axioms */ | ||
| 42 | private val ontology: OWLOntology = | ||
| 43 | Ontology.manager.createOntology((axioms: List[OWLAxiom]).asJava) | ||
| 44 | |||
| 45 | /** OWLAPI internal reasoner for ontology */ | ||
| 46 | private val reasoner = | ||
| 47 | (new StructuralReasonerFactory()).createReasoner(ontology) | ||
| 48 | |||
| 49 | /** Unsafe roles in the ontology | ||
| 50 | * | ||
| 51 | * Unsafety conditions are the following: | ||
| 52 | * | ||
| 53 | * 1) For all roles r1 appearing in an axiom of type T5, r1 is unsafe | ||
| 54 | * if there exists a role r2 (different from top) appearing in an | ||
| 55 | * axiom of type T3 and r1 is a subproperty of the inverse of r2. | ||
| 56 | * | ||
| 57 | * 2) For all roles p1 appearing in an axiom of type T5, p1 is unsafe | ||
| 58 | * if there exists a role p2 appearing in an axiom of type T4 and | ||
| 59 | * p1 is a subproperty of either p2 or the inverse of p2. | ||
| 60 | */ | ||
| 61 | lazy val unsafe: List[OWLObjectPropertyExpression] = { | ||
| 62 | |||
| 63 | /* Checking for unsafety condition (1) */ | ||
| 64 | val unsafe1 = for { | ||
| 65 | axiom <- axioms | ||
| 66 | if axiom.isT5 | ||
| 67 | role1 <- axiom.objectPropertyExpressionsInSignature | ||
| 68 | roleSuper = role1 +: reasoner.superObjectProperties(role1) | ||
| 69 | axiom <- axioms | ||
| 70 | if axiom.isT3 && !axiom.isT3top | ||
| 71 | role2 <- axiom.objectPropertyExpressionsInSignature | ||
| 72 | if roleSuper contains role2.getInverseProperty | ||
| 73 | } yield role1 | ||
| 74 | |||
| 75 | /* Checking for unsafety condition (2) */ | ||
| 76 | val unsafe2 = for { | ||
| 77 | axiom <- axioms | ||
| 78 | if axiom.isT5 | ||
| 79 | role1 <- axiom.objectPropertyExpressionsInSignature | ||
| 80 | roleSuper = role1 +: reasoner.superObjectProperties(role1) | ||
| 81 | axiom <- axioms | ||
| 82 | if axiom.isT4 | ||
| 83 | role2 <- axiom.objectPropertyExpressionsInSignature | ||
| 84 | if roleSuper.contains(role2) || | ||
| 85 | roleSuper.contains(role2.getInverseProperty) | ||
| 86 | } yield role1 | ||
| 87 | |||
| 88 | unsafe1 ++ unsafe2 | ||
| 89 | } | ||
| 90 | } | ||
