diff options
| -rw-r--r-- | src/main/scala/rsacomb/RDFoxAxiomConverter.scala | 54 | ||||
| -rw-r--r-- | src/main/scala/rsacomb/RDFoxClassExprConverter.scala | 8 | ||||
| -rw-r--r-- | src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala | 2 | ||||
| -rw-r--r-- | src/main/scala/rsacomb/RSA.scala | 8 | ||||
| -rw-r--r-- | src/main/scala/rsacomb/RSAOntology.scala | 8 |
5 files changed, 45 insertions, 35 deletions
diff --git a/src/main/scala/rsacomb/RDFoxAxiomConverter.scala b/src/main/scala/rsacomb/RDFoxAxiomConverter.scala index 0a79823..d90c966 100644 --- a/src/main/scala/rsacomb/RDFoxAxiomConverter.scala +++ b/src/main/scala/rsacomb/RDFoxAxiomConverter.scala | |||
| @@ -1,6 +1,11 @@ | |||
| 1 | package rsacomb | 1 | package rsacomb |
| 2 | 2 | ||
| 3 | import org.semanticweb.owlapi.model.{OWLAxiom, OWLSubClassOfAxiom, OWLEquivalentClassesAxiom, OWLObjectPropertyExpression} | 3 | import org.semanticweb.owlapi.model.{ |
| 4 | OWLAxiom, | ||
| 5 | OWLSubClassOfAxiom, | ||
| 6 | OWLEquivalentClassesAxiom, | ||
| 7 | OWLObjectPropertyExpression | ||
| 8 | } | ||
| 4 | import org.semanticweb.owlapi.model.OWLAxiomVisitorEx | 9 | import org.semanticweb.owlapi.model.OWLAxiomVisitorEx |
| 5 | 10 | ||
| 6 | import tech.oxfordsemantic.jrdfox.logic.{Rule, BodyFormula} | 11 | import tech.oxfordsemantic.jrdfox.logic.{Rule, BodyFormula} |
| @@ -17,22 +22,24 @@ import org.semanticweb.owlapi.model.OWLObjectProperty | |||
| 17 | object RDFoxAxiomConverter { | 22 | object RDFoxAxiomConverter { |
| 18 | 23 | ||
| 19 | def apply( | 24 | def apply( |
| 20 | term : Term = Variable.create("x"), | 25 | term: Term, |
| 21 | skolem : SkolemStrategy = SkolemStrategy.None, | 26 | skolem: SkolemStrategy = SkolemStrategy.None, |
| 22 | unsafe : List[OWLObjectPropertyExpression] = List() | 27 | unsafe: List[OWLObjectPropertyExpression] = List() |
| 23 | ) : RDFoxAxiomConverter = | 28 | ): RDFoxAxiomConverter = |
| 24 | new RDFoxAxiomConverter(term, skolem, unsafe) | 29 | new RDFoxAxiomConverter(term, skolem, unsafe) |
| 25 | 30 | ||
| 26 | } // object RDFoxAxiomConverter | 31 | } // object RDFoxAxiomConverter |
| 27 | 32 | ||
| 28 | class RDFoxAxiomConverter(term : Term, skolem : SkolemStrategy, unsafe : List[OWLObjectPropertyExpression]) | 33 | class RDFoxAxiomConverter( |
| 29 | extends OWLAxiomVisitorEx[List[Rule]] | 34 | term: Term, |
| 30 | { | 35 | skolem: SkolemStrategy, |
| 36 | unsafe: List[OWLObjectPropertyExpression] | ||
| 37 | ) extends OWLAxiomVisitorEx[List[Rule]] { | ||
| 31 | 38 | ||
| 32 | override | 39 | override def visit(axiom: OWLSubClassOfAxiom): List[Rule] = { |
| 33 | def visit(axiom : OWLSubClassOfAxiom) : List[Rule] = { | ||
| 34 | // Skolemization is needed only for the head of an axiom | 40 | // Skolemization is needed only for the head of an axiom |
| 35 | val subVisitor = new RDFoxClassExprConverter(term,SkolemStrategy.None, unsafe) | 41 | val subVisitor = |
| 42 | new RDFoxClassExprConverter(term, SkolemStrategy.None, unsafe) | ||
| 36 | val superVisitor = new RDFoxClassExprConverter(term, skolem, unsafe) | 43 | val superVisitor = new RDFoxClassExprConverter(term, skolem, unsafe) |
| 37 | // Each visitor returns a `RDFoxRuleShards`, a tuple (res,ext): | 44 | // Each visitor returns a `RDFoxRuleShards`, a tuple (res,ext): |
| 38 | // - the `res` List is a list of atoms resulting from the conversion | 45 | // - the `res` List is a list of atoms resulting from the conversion |
| @@ -45,30 +52,27 @@ class RDFoxAxiomConverter(term : Term, skolem : SkolemStrategy, unsafe : List[OW | |||
| 45 | val sup = axiom.getSuperClass.accept(superVisitor) | 52 | val sup = axiom.getSuperClass.accept(superVisitor) |
| 46 | val head = sup.res.asJava | 53 | val head = sup.res.asJava |
| 47 | val body = (sub.res ++ sup.ext).asJava | 54 | val body = (sub.res ++ sup.ext).asJava |
| 48 | List(Rule.create(head,body)) | 55 | List(Rule.create(head, body)) |
| 49 | } | 56 | } |
| 50 | 57 | ||
| 51 | override | 58 | override def visit(axiom: OWLEquivalentClassesAxiom): List[Rule] = { |
| 52 | def visit(axiom : OWLEquivalentClassesAxiom) : List[Rule] = { | ||
| 53 | for { | 59 | for { |
| 54 | axiom1 <- axiom.asPairwiseAxioms.asScala.toList | 60 | axiom1 <- axiom.asPairwiseAxioms.asScala.toList |
| 55 | axiom2 <- axiom1.asOWLSubClassOfAxioms.asScala.toList | 61 | axiom2 <- axiom1.asOWLSubClassOfAxioms.asScala.toList |
| 56 | rule <- axiom2.accept(this) | 62 | rule <- axiom2.accept(this) |
| 57 | } yield rule | 63 | } yield rule |
| 58 | } | 64 | } |
| 59 | 65 | ||
| 60 | override | 66 | override def visit(axiom: OWLSubObjectPropertyOfAxiom): List[Rule] = { |
| 61 | def visit(axiom : OWLSubObjectPropertyOfAxiom) : List[Rule] = { | 67 | val term1 = RSA.getFreshVariable() |
| 62 | // TODO: variables needs to be handled at visitor level. Hardcoding | 68 | val subVisitor = |
| 63 | // the name of the varibles might lead to errors for complex cases. | 69 | new RDFoxPropertyExprConverter(term, term1, SkolemStrategy.None) |
| 64 | val term1 = Variable.create("y") | 70 | val superVisitor = new RDFoxPropertyExprConverter(term, term1, skolem) |
| 65 | val subVisitor = new RDFoxPropertyExprConverter(term,term1,SkolemStrategy.None) | ||
| 66 | val superVisitor = new RDFoxPropertyExprConverter(term,term1,skolem) | ||
| 67 | val body: List[BodyFormula] = axiom.getSubProperty.accept(subVisitor) | 71 | val body: List[BodyFormula] = axiom.getSubProperty.accept(subVisitor) |
| 68 | val head: List[Atom] = axiom.getSuperProperty.accept(superVisitor) | 72 | val head: List[Atom] = axiom.getSuperProperty.accept(superVisitor) |
| 69 | List(Rule.create(head.asJava,body.asJava)) | 73 | List(Rule.create(head.asJava, body.asJava)) |
| 70 | } | 74 | } |
| 71 | 75 | ||
| 72 | def doDefault(axiom : OWLAxiom) : List[Rule] = List() | 76 | def doDefault(axiom: OWLAxiom): List[Rule] = List() |
| 73 | 77 | ||
| 74 | } // class RDFoxAxiomConverter | 78 | } // class RDFoxAxiomConverter |
diff --git a/src/main/scala/rsacomb/RDFoxClassExprConverter.scala b/src/main/scala/rsacomb/RDFoxClassExprConverter.scala index 467b3f1..a319d86 100644 --- a/src/main/scala/rsacomb/RDFoxClassExprConverter.scala +++ b/src/main/scala/rsacomb/RDFoxClassExprConverter.scala | |||
| @@ -34,7 +34,7 @@ import org.semanticweb.owlapi.model.OWLObjectProperty | |||
| 34 | object RDFoxClassExprConverter { | 34 | object RDFoxClassExprConverter { |
| 35 | 35 | ||
| 36 | def apply( | 36 | def apply( |
| 37 | term: Term = Variable.create("x"), | 37 | term: Term, |
| 38 | skolem: SkolemStrategy = SkolemStrategy.None, | 38 | skolem: SkolemStrategy = SkolemStrategy.None, |
| 39 | unsafe: List[OWLObjectPropertyExpression] = List() | 39 | unsafe: List[OWLObjectPropertyExpression] = List() |
| 40 | ): RDFoxClassExprConverter = | 40 | ): RDFoxClassExprConverter = |
| @@ -95,9 +95,7 @@ class RDFoxClassExprConverter( | |||
| 95 | 95 | ||
| 96 | // OWLObjectSomeValuesFrom | 96 | // OWLObjectSomeValuesFrom |
| 97 | override def visit(expr: OWLObjectSomeValuesFrom): RDFoxRuleShards = { | 97 | override def visit(expr: OWLObjectSomeValuesFrom): RDFoxRuleShards = { |
| 98 | // TODO: variables needs to be handled at visitor level. Hardcoding | 98 | val y = RSA.getFreshVariable() |
| 99 | // the name of the varibles might lead to errors for complex cases. | ||
| 100 | val y = Variable.create("y") | ||
| 101 | // Here we are assuming a role name | 99 | // Here we are assuming a role name |
| 102 | val prop = expr.getProperty() | 100 | val prop = expr.getProperty() |
| 103 | // Computes the result of rule skolemization. Depending on the used | 101 | // Computes the result of rule skolemization. Depending on the used |
| @@ -141,7 +139,7 @@ class RDFoxClassExprConverter( | |||
| 141 | // OWLObjectMaxCardinality | 139 | // OWLObjectMaxCardinality |
| 142 | override def visit(expr: OWLObjectMaxCardinality): RDFoxRuleShards = { | 140 | override def visit(expr: OWLObjectMaxCardinality): RDFoxRuleShards = { |
| 143 | // TODO: again, no hardcoded variables | 141 | // TODO: again, no hardcoded variables |
| 144 | val vars = List(Variable.create("y"), Variable.create("z")) | 142 | val vars = List(RSA.getFreshVariable(), RSA.getFreshVariable()) |
| 145 | val classResult = RDFoxClassExprConverter.merge( | 143 | val classResult = RDFoxClassExprConverter.merge( |
| 146 | vars | 144 | vars |
| 147 | .map(new RDFoxClassExprConverter(_, skolem, unsafe)) | 145 | .map(new RDFoxClassExprConverter(_, skolem, unsafe)) |
diff --git a/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala b/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala index 340fa90..6eecdbf 100644 --- a/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala +++ b/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala | |||
| @@ -3,7 +3,7 @@ package rsacomb | |||
| 3 | import org.semanticweb.owlapi.model.{OWLPropertyExpression, OWLObjectProperty} | 3 | import org.semanticweb.owlapi.model.{OWLPropertyExpression, OWLObjectProperty} |
| 4 | import org.semanticweb.owlapi.model.OWLPropertyExpressionVisitorEx | 4 | import org.semanticweb.owlapi.model.OWLPropertyExpressionVisitorEx |
| 5 | 5 | ||
| 6 | import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, IRI, Variable, Literal} | 6 | import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, IRI, Literal} |
| 7 | 7 | ||
| 8 | import rsacomb.SkolemStrategy | 8 | import rsacomb.SkolemStrategy |
| 9 | import org.semanticweb.owlapi.model.OWLObjectInverseOf | 9 | import org.semanticweb.owlapi.model.OWLObjectInverseOf |
diff --git a/src/main/scala/rsacomb/RSA.scala b/src/main/scala/rsacomb/RSA.scala index c0d4e51..edd3758 100644 --- a/src/main/scala/rsacomb/RSA.scala +++ b/src/main/scala/rsacomb/RSA.scala | |||
| @@ -30,6 +30,14 @@ object RSA extends RSAOntology { | |||
| 30 | Prefixes.declarePrefix("rdfs:", "http://www.w3.org/2000/01/rdf-schema#") | 30 | Prefixes.declarePrefix("rdfs:", "http://www.w3.org/2000/01/rdf-schema#") |
| 31 | Prefixes.declarePrefix("owl:", "http://www.w3.org/2002/07/owl#") | 31 | Prefixes.declarePrefix("owl:", "http://www.w3.org/2002/07/owl#") |
| 32 | 32 | ||
| 33 | // Counter used to implement a simple fresh variable generator | ||
| 34 | private var counter = -1; | ||
| 35 | |||
| 36 | def getFreshVariable(): Variable = { | ||
| 37 | counter += 1 | ||
| 38 | Variable.create(f"I$counter%03d") | ||
| 39 | } | ||
| 40 | |||
| 33 | val varX = Variable.create("X") | 41 | val varX = Variable.create("X") |
| 34 | val varY = Variable.create("Y") | 42 | val varY = Variable.create("Y") |
| 35 | val varZ = Variable.create("Z") | 43 | val varZ = Variable.create("Z") |
diff --git a/src/main/scala/rsacomb/RSAOntology.scala b/src/main/scala/rsacomb/RSAOntology.scala index 5846672..06351d5 100644 --- a/src/main/scala/rsacomb/RSAOntology.scala +++ b/src/main/scala/rsacomb/RSAOntology.scala | |||
| @@ -61,7 +61,7 @@ trait RSAOntology { | |||
| 61 | val datalog = for { | 61 | val datalog = for { |
| 62 | axiom <- axioms | 62 | axiom <- axioms |
| 63 | visitor = new RDFoxAxiomConverter( | 63 | visitor = new RDFoxAxiomConverter( |
| 64 | Variable.create("x"), | 64 | RSA.getFreshVariable(), |
| 65 | SkolemStrategy.ConstantRSA(axiom.toString), | 65 | SkolemStrategy.ConstantRSA(axiom.toString), |
| 66 | unsafe | 66 | unsafe |
| 67 | ) | 67 | ) |
| @@ -199,7 +199,7 @@ trait RSAOntology { | |||
| 199 | def getBindAtom(atom: Atom): BindAtom = { | 199 | def getBindAtom(atom: Atom): BindAtom = { |
| 200 | // TODO: We need to implement another way to introduce fresh | 200 | // TODO: We need to implement another way to introduce fresh |
| 201 | // variables. | 201 | // variables. |
| 202 | val varA = Variable.create("A") | 202 | val newvar = RSA.getFreshVariable() |
| 203 | val name = | 203 | val name = |
| 204 | Literal.create(atom.getTupleTableName.getIRI, Datatype.XSD_STRING) | 204 | Literal.create(atom.getTupleTableName.getIRI, Datatype.XSD_STRING) |
| 205 | val args = atom | 205 | val args = atom |
| @@ -210,7 +210,7 @@ trait RSAOntology { | |||
| 210 | BindAtom.create( | 210 | BindAtom.create( |
| 211 | BuiltinFunctionCall | 211 | BuiltinFunctionCall |
| 212 | .create("SKOLEM", args: _*), | 212 | .create("SKOLEM", args: _*), |
| 213 | varA | 213 | newvar |
| 214 | ) | 214 | ) |
| 215 | } | 215 | } |
| 216 | 216 | ||
| @@ -252,7 +252,7 @@ trait RSAOntology { | |||
| 252 | val b = getBindAtom(a) | 252 | val b = getBindAtom(a) |
| 253 | ReifiedHead(b, reifyAtom(a, b.getBoundVariable)) | 253 | ReifiedHead(b, reifyAtom(a, b.getBoundVariable)) |
| 254 | } else { | 254 | } else { |
| 255 | val varA = Variable.create("A") | 255 | val varA = RSA.getFreshVariable() |
| 256 | ReifiedBody(reifyAtom(a, varA)) | 256 | ReifiedBody(reifyAtom(a, varA)) |
| 257 | } | 257 | } |
| 258 | } else { | 258 | } else { |
