aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/rsacomb
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2020-11-13 18:48:24 +0000
committerFederico Igne <federico.igne@cs.ox.ac.uk>2020-11-13 18:48:24 +0000
commit903983b48d49e17e035bd233d94cd5cb58661a19 (patch)
treed168e7a82cb8f92d1cd3ae7584f333cbb7ccb5e7 /src/main/scala/rsacomb
parent697f292d100a65c7ceb0b20fd0c291e31ce83f54 (diff)
downloadRSAComb-903983b48d49e17e035bd233d94cd5cb58661a19.tar.gz
RSAComb-903983b48d49e17e035bd233d94cd5cb58661a19.zip
Simplify role extraction from axioms
The previous implementation was using the visitor pattern suggested by the OWLAPI. This was buggy for some reasons and resulting in runtime exceptions (probably due to the complex class tree of the API). In Scala using type pattern matching results in a shorter and more readable way of traversing an AST.
Diffstat (limited to 'src/main/scala/rsacomb')
-rw-r--r--src/main/scala/rsacomb/RSAAxiom.scala76
1 files changed, 18 insertions, 58 deletions
diff --git a/src/main/scala/rsacomb/RSAAxiom.scala b/src/main/scala/rsacomb/RSAAxiom.scala
index f504bbe..3cd9a9d 100644
--- a/src/main/scala/rsacomb/RSAAxiom.scala
+++ b/src/main/scala/rsacomb/RSAAxiom.scala
@@ -20,6 +20,7 @@ import org.semanticweb.owlapi.model.{
20 OWLClassExpressionVisitorEx 20 OWLClassExpressionVisitorEx
21} 21}
22import org.semanticweb.owlapi.model.OWLObjectProperty 22import org.semanticweb.owlapi.model.OWLObjectProperty
23import scala.collection.JavaConverters._
23 24
24/* Wrapper trait for the implicit class `RSAAxiom`. 25/* Wrapper trait for the implicit class `RSAAxiom`.
25 */ 26 */
@@ -103,68 +104,27 @@ trait RSAAxiom {
103 * of a role if this appears in the axiom (but we will get the role 104 * of a role if this appears in the axiom (but we will get the role
104 * itself instead). 105 * itself instead).
105 */ 106 */
106 private class RSAAxiomRoleExtractor() 107 lazy val objectPropertyExpressionsInSignature
107 extends OWLAxiomVisitorEx[List[OWLObjectPropertyExpression]] { 108 : List[OWLObjectPropertyExpression] =
108 109 axiom match {
109 private class RSAExprRoleExtractor() 110 case a: OWLSubClassOfAxiom =>
110 extends OWLClassExpressionVisitorEx[ 111 rolesInExpr(a.getSubClass) ++ rolesInExpr(a.getSuperClass)
111 List[OWLObjectPropertyExpression] 112 case a: OWLEquivalentClassesAxiom =>
112 ] { 113 a.getClassExpressions.asScala.toList.flatMap(rolesInExpr(_))
113 override def visit( 114 case a: OWLSubObjectPropertyOfAxiom =>
114 expr: OWLObjectSomeValuesFrom 115 List(a.getSubProperty, a.getSuperProperty)
115 ): List[OWLObjectPropertyExpression] = 116 case _ => List()
116 List(expr.getProperty)
117
118 override def visit(
119 expr: OWLObjectMaxCardinality
120 ): List[OWLObjectPropertyExpression] =
121 List(expr.getProperty)
122
123 /* NOTE: this instance of `visit` for `OWLClass` shouldn't be necessary. However
124 * if missing, the code throws a `NullPointerException`. It seems like, for some
125 * reason, `OWLClass` is not really a subinterface of `OWLClassExpression`, as
126 * stated in the JavaDocs.
127 */
128 override def visit(expr: OWLClass): List[OWLObjectPropertyExpression] =
129 List()
130
131 def doDefault(
132 expr: OWLClassExpression
133 ): List[OWLObjectPropertyExpression] =
134 List()
135 }
136
137 override def visit(
138 axiom: OWLSubClassOfAxiom
139 ): List[OWLObjectPropertyExpression] = {
140 val visitor = new RSAExprRoleExtractor()
141 val sub = axiom.getSubClass.accept(visitor)
142 val sup = axiom.getSuperClass.accept(visitor)
143 sub ++ sup
144 } 117 }
145 118
146 override def visit( 119 private def rolesInExpr(
147 axiom: OWLEquivalentClassesAxiom 120 expr: OWLClassExpression
148 ): List[OWLObjectPropertyExpression] = { 121 ): List[OWLObjectPropertyExpression] =
149 // TODO 122 expr match {
150 List() 123 case e: OWLObjectSomeValuesFrom => List(e.getProperty)
124 case e: OWLObjectMaxCardinality => List(e.getProperty)
125 case _ => List()
151 } 126 }
152 127
153 override def visit(
154 axiom: OWLSubObjectPropertyOfAxiom
155 ): List[OWLObjectPropertyExpression] =
156 List(axiom.getSubProperty(), axiom.getSuperProperty())
157
158 def doDefault(axiom: OWLAxiom): List[OWLObjectPropertyExpression] = List()
159 }
160
161 /* Exposed methods */
162 lazy val objectPropertyExpressionsInSignature
163 : List[OWLObjectPropertyExpression] = {
164 val visitor = new RSAAxiomRoleExtractor()
165 axiom.accept(visitor)
166 }
167
168 lazy val toTriple: Option[(OWLClass, OWLObjectProperty, OWLClass)] = 128 lazy val toTriple: Option[(OWLClass, OWLObjectProperty, OWLClass)] =
169 for { 129 for {
170 subClass <- Some(axiom) collect { case a: OWLSubClassOfAxiom => a } 130 subClass <- Some(axiom) collect { case a: OWLSubClassOfAxiom => a }