aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2020-09-07 17:55:34 +0200
committerFederico Igne <federico.igne@cs.ox.ac.uk>2020-09-07 17:55:34 +0200
commit3bc39ecf2eb168e1124bb123b9df0a8b933e6955 (patch)
treef92491ab1d0158a95ea831210f32f6c328464601 /src
parentd085aeae07a729467047aba50b22e9baa7a4d10f (diff)
downloadRSAComb-3bc39ecf2eb168e1124bb123b9df0a8b933e6955.tar.gz
RSAComb-3bc39ecf2eb168e1124bb123b9df0a8b933e6955.zip
Introduce naive fresh variable generator
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/rsacomb/RDFoxAxiomConverter.scala54
-rw-r--r--src/main/scala/rsacomb/RDFoxClassExprConverter.scala8
-rw-r--r--src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala2
-rw-r--r--src/main/scala/rsacomb/RSA.scala8
-rw-r--r--src/main/scala/rsacomb/RSAOntology.scala8
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 @@
1package rsacomb 1package rsacomb
2 2
3import org.semanticweb.owlapi.model.{OWLAxiom, OWLSubClassOfAxiom, OWLEquivalentClassesAxiom, OWLObjectPropertyExpression} 3import org.semanticweb.owlapi.model.{
4 OWLAxiom,
5 OWLSubClassOfAxiom,
6 OWLEquivalentClassesAxiom,
7 OWLObjectPropertyExpression
8}
4import org.semanticweb.owlapi.model.OWLAxiomVisitorEx 9import org.semanticweb.owlapi.model.OWLAxiomVisitorEx
5 10
6import tech.oxfordsemantic.jrdfox.logic.{Rule, BodyFormula} 11import tech.oxfordsemantic.jrdfox.logic.{Rule, BodyFormula}
@@ -17,22 +22,24 @@ import org.semanticweb.owlapi.model.OWLObjectProperty
17object RDFoxAxiomConverter { 22object 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
28class RDFoxAxiomConverter(term : Term, skolem : SkolemStrategy, unsafe : List[OWLObjectPropertyExpression]) 33class 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
34object RDFoxClassExprConverter { 34object 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
3import org.semanticweb.owlapi.model.{OWLPropertyExpression, OWLObjectProperty} 3import org.semanticweb.owlapi.model.{OWLPropertyExpression, OWLObjectProperty}
4import org.semanticweb.owlapi.model.OWLPropertyExpressionVisitorEx 4import org.semanticweb.owlapi.model.OWLPropertyExpressionVisitorEx
5 5
6import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, IRI, Variable, Literal} 6import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, IRI, Literal}
7 7
8import rsacomb.SkolemStrategy 8import rsacomb.SkolemStrategy
9import org.semanticweb.owlapi.model.OWLObjectInverseOf 9import 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 {