aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/rsacomb/CanonicalModel.scala
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2020-11-18 18:07:53 +0000
committerFederico Igne <federico.igne@cs.ox.ac.uk>2020-11-18 18:07:53 +0000
commit4df351d3b1d11fc045005323c38ba3528de631ea (patch)
tree35f809e3def7d55602ed124f7b194db29407ba33 /src/main/scala/rsacomb/CanonicalModel.scala
parente1a04294ed8737444e40323474f4084cb64c1d55 (diff)
downloadRSAComb-4df351d3b1d11fc045005323c38ba3528de631ea.tar.gz
RSAComb-4df351d3b1d11fc045005323c38ba3528de631ea.zip
Rework RSA as a utility object
Diffstat (limited to 'src/main/scala/rsacomb/CanonicalModel.scala')
-rw-r--r--src/main/scala/rsacomb/CanonicalModel.scala62
1 files changed, 24 insertions, 38 deletions
diff --git a/src/main/scala/rsacomb/CanonicalModel.scala b/src/main/scala/rsacomb/CanonicalModel.scala
index f7a45a7..5f781d1 100644
--- a/src/main/scala/rsacomb/CanonicalModel.scala
+++ b/src/main/scala/rsacomb/CanonicalModel.scala
@@ -24,16 +24,15 @@ import tech.oxfordsemantic.jrdfox.logic.expression.{
24} 24}
25 25
26import suffix.{Empty, Forward, Backward, Inverse} 26import suffix.{Empty, Forward, Backward, Inverse}
27import util.RSA
27 28
28class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom { 29class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
29 30
30 // Makes working with IRIs less painful 31 import implicits.RDFox._
31 import RDFoxUtil._ 32 import implicits.JavaCollections._
32 33
33 val named: List[Rule] = 34 val named: List[Rule] =
34 ontology.individuals.map(a => 35 ontology.individuals.map(a => Rule.create(RSA.Named(a)))
35 Rule.create(TupleTableAtom.rdf(a, IRI.RDF_TYPE, RSA.Named))
36 )
37 36
38 val rolesAdditionalRules: List[Rule] = { 37 val rolesAdditionalRules: List[Rule] = {
39 // Given a role (predicate) compute additional logic rules 38 // Given a role (predicate) compute additional logic rules
@@ -69,7 +68,7 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
69 val varY = Variable.create("Y") 68 val varY = Variable.create("Y")
70 val concepts = ontology.concepts.map(c => { 69 val concepts = ontology.concepts.map(c => {
71 Rule.create( 70 Rule.create(
72 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, IRI.THING), 71 RSA.Thing(varX),
73 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, c.getIRI) 72 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, c.getIRI)
74 ) 73 )
75 }) 74 })
@@ -80,10 +79,7 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
80 x.getInverse.getNamedProperty.getIRI.getIRIString :: Inverse 79 x.getInverse.getNamedProperty.getIRI.getIRIString :: Inverse
81 } 80 }
82 Rule.create( 81 Rule.create(
83 List( 82 List(RSA.Thing(varX), RSA.Thing(varY)),
84 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, IRI.THING),
85 TupleTableAtom.rdf(varY, IRI.RDF_TYPE, IRI.THING)
86 ),
87 List(TupleTableAtom.rdf(varX, name, varY)) 83 List(TupleTableAtom.rdf(varX, name, varY))
88 ) 84 )
89 }) 85 })
@@ -95,18 +91,15 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
95 val varY = Variable.create("Y") 91 val varY = Variable.create("Y")
96 val varZ = Variable.create("Z") 92 val varZ = Variable.create("Z")
97 List( 93 List(
94 // Reflexivity
95 Rule.create(RSA.EquivTo(varX, varX), RSA.Thing(varX)),
96 // Simmetry
97 Rule.create(RSA.EquivTo(varY, varX), RSA.EquivTo(varX, varY)),
98 // Transitivity
98 Rule.create( 99 Rule.create(
99 TupleTableAtom.rdf(varX, RSA.EquivTo, varX), 100 RSA.EquivTo(varX, varZ),
100 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, IRI.THING) 101 RSA.EquivTo(varX, varY),
101 ), 102 RSA.EquivTo(varY, varZ)
102 Rule.create(
103 TupleTableAtom.rdf(varY, RSA.EquivTo, varX),
104 TupleTableAtom.rdf(varX, RSA.EquivTo, varY)
105 ),
106 Rule.create(
107 TupleTableAtom.rdf(varX, RSA.EquivTo, varZ),
108 TupleTableAtom.rdf(varX, RSA.EquivTo, varY),
109 TupleTableAtom.rdf(varY, RSA.EquivTo, varZ)
110 ) 103 )
111 ) 104 )
112 } 105 }
@@ -129,21 +122,14 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
129 private def rules1(axiom: OWLSubClassOfAxiom): List[Rule] = { 122 private def rules1(axiom: OWLSubClassOfAxiom): List[Rule] = {
130 val unfold = ontology.unfold(axiom).toList 123 val unfold = ontology.unfold(axiom).toList
131 // Fresh Variables 124 // Fresh Variables
132 val v0 = RSA.rsa("v0_" ++ RSA.hashed(axiom)) 125 val v0 = RSA("v0_" ++ axiom.hashed)
133 val varX = Variable.create("X") 126 val varX = Variable.create("X")
134 // Predicates 127 implicit val unfoldTerm = RSA(unfold.hashCode.toString)
128 // TODO: use axiom.toTriple instead
135 val atomA: TupleTableAtom = { 129 val atomA: TupleTableAtom = {
136 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 130 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI
137 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, cls) 131 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, cls)
138 } 132 }
139 def predIN(t: Term): TupleTableAtom = {
140 TupleTableAtom.rdf(
141 t,
142 RSA.rsa("IN"),
143 RSA.rsa(unfold.hashCode.toString)
144 )
145 }
146 def notIn(t: Term): Negation = Negation.create(predIN(t))
147 val roleRf: TupleTableAtom = { 133 val roleRf: TupleTableAtom = {
148 val visitor = 134 val visitor =
149 new RDFoxPropertyExprConverter(varX, v0, Forward) 135 new RDFoxPropertyExprConverter(varX, v0, Forward)
@@ -165,10 +151,10 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
165 // returning facts as `Rule`s with true body. While this is correct 151 // returning facts as `Rule`s with true body. While this is correct
166 // there is an easier way to import facts into RDFox. Are we able to 152 // there is an easier way to import facts into RDFox. Are we able to
167 // do that? 153 // do that?
168 val facts = unfold.map(x => Rule.create(predIN(x))) 154 val facts = unfold.map(x => Rule.create(RSA.In(x)))
169 val rules = List( 155 val rules = List(
170 Rule.create(roleRf, atomA, notIn(varX)), 156 Rule.create(roleRf, atomA, RSA.notIn(varX)),
171 Rule.create(atomB, atomA, notIn(varX)) 157 Rule.create(atomB, atomA, RSA.notIn(varX))
172 ) 158 )
173 facts ++ rules 159 facts ++ rules
174 } 160 }
@@ -180,9 +166,9 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
180 .getProperty 166 .getProperty
181 if (ontology.confl(roleR) contains roleR) { 167 if (ontology.confl(roleR) contains roleR) {
182 // Fresh Variables 168 // Fresh Variables
183 val v0 = RSA.rsa("v0_" ++ RSA.hashed(axiom)) 169 val v0 = RSA("v0_" ++ axiom.hashed)
184 val v1 = RSA.rsa("v1_" ++ RSA.hashed(axiom)) 170 val v1 = RSA("v1_" ++ axiom.hashed)
185 val v2 = RSA.rsa("v2_" ++ RSA.hashed(axiom)) 171 val v2 = RSA("v2_" ++ axiom.hashed)
186 // Predicates 172 // Predicates
187 def atomA(t: Term): TupleTableAtom = { 173 def atomA(t: Term): TupleTableAtom = {
188 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 174 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI
@@ -220,7 +206,7 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom {
220 .asInstanceOf[OWLObjectSomeValuesFrom] 206 .asInstanceOf[OWLObjectSomeValuesFrom]
221 .getProperty 207 .getProperty
222 // Fresh Variables 208 // Fresh Variables
223 val v1 = RSA.rsa("v1_" ++ RSA.hashed(axiom)) 209 val v1 = RSA("v1_" ++ axiom.hashed)
224 // Predicates 210 // Predicates
225 def atomA(t: Term): TupleTableAtom = { 211 def atomA(t: Term): TupleTableAtom = {
226 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 212 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI