diff options
author | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-11-18 18:07:53 +0000 |
---|---|---|
committer | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-11-18 18:07:53 +0000 |
commit | 4df351d3b1d11fc045005323c38ba3528de631ea (patch) | |
tree | 35f809e3def7d55602ed124f7b194db29407ba33 /src/main/scala/rsacomb/CanonicalModel.scala | |
parent | e1a04294ed8737444e40323474f4084cb64c1d55 (diff) | |
download | RSAComb-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.scala | 62 |
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 | ||
26 | import suffix.{Empty, Forward, Backward, Inverse} | 26 | import suffix.{Empty, Forward, Backward, Inverse} |
27 | import util.RSA | ||
27 | 28 | ||
28 | class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom { | 29 | class 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 |