aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala
diff options
context:
space:
mode:
authorFederico Igne <git@federicoigne.com>2021-10-04 18:20:50 +0100
committerFederico Igne <git@federicoigne.com>2021-10-04 18:20:50 +0100
commit0af96f42fc0d272257df83a43b4c6e48e52c1dff (patch)
tree580db98de32623f6e3ba399e475dcef0d6993e66 /src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala
parent0fdc1f692bb41f9941f6ea4f32ef8c2948a515f7 (diff)
parentc86e7d32420adcc05546efa45b21e0e31d0f6c90 (diff)
downloadRSAComb-0af96f42fc0d272257df83a43b4c6e48e52c1dff.tar.gz
RSAComb-0af96f42fc0d272257df83a43b4c6e48e52c1dff.zip
Merge branch 'upperbound' into develop
Diffstat (limited to 'src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala')
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala49
1 files changed, 28 insertions, 21 deletions
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala
index ca54054..bd3d3c3 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala
@@ -31,7 +31,8 @@ import tech.oxfordsemantic.jrdfox.logic.datalog.{
31 BodyFormula, 31 BodyFormula,
32 Negation, 32 Negation,
33 Rule, 33 Rule,
34 TupleTableAtom 34 TupleTableAtom,
35 TupleTableName
35} 36}
36import tech.oxfordsemantic.jrdfox.logic.expression.{IRI, Term, Variable} 37import tech.oxfordsemantic.jrdfox.logic.expression.{IRI, Term, Variable}
37 38
@@ -39,7 +40,7 @@ import implicits.JavaCollections._
39 40
40import uk.ac.ox.cs.rsacomb.converter._ 41import uk.ac.ox.cs.rsacomb.converter._
41import uk.ac.ox.cs.rsacomb.suffix._ 42import uk.ac.ox.cs.rsacomb.suffix._
42import uk.ac.ox.cs.rsacomb.util.RSA 43import uk.ac.ox.cs.rsacomb.util.{DataFactory, RSA}
43 44
44/** Canonical model generator 45/** Canonical model generator
45 * 46 *
@@ -48,8 +49,9 @@ import uk.ac.ox.cs.rsacomb.util.RSA
48 * (via materialization). 49 * (via materialization).
49 * 50 *
50 * @param ontology the RSA ontology the canonical model is targeting. 51 * @param ontology the RSA ontology the canonical model is targeting.
52 * @param graph the graph the canonical model will be generated into.
51 */ 53 */
52class CanonicalModel(val ontology: RSAOntology) { 54class CanonicalModel(val ontology: RSAOntology, val graph: IRI) {
53 55
54 /** Simplify conversion between OWLAPI and RDFox concepts */ 56 /** Simplify conversion between OWLAPI and RDFox concepts */
55 import implicits.RDFox._ 57 import implicits.RDFox._
@@ -65,7 +67,8 @@ class CanonicalModel(val ontology: RSAOntology) {
65 * versions need to be explicitly stated in terms of logic rules. 67 * versions need to be explicitly stated in terms of logic rules.
66 */ 68 */
67 val rolesAdditionalRules: List[Rule] = { 69 val rolesAdditionalRules: List[Rule] = {
68 ontology.roles 70 val tt = TupleTableName.create(graph.getIRI)
71 ontology.objroles
69 .collect { case prop: OWLObjectProperty => prop } 72 .collect { case prop: OWLObjectProperty => prop }
70 .flatMap((pred) => { 73 .flatMap((pred) => {
71 val iri = pred.getIRI.getIRIString 74 val iri = pred.getIRI.getIRIString
@@ -83,8 +86,8 @@ class CanonicalModel(val ontology: RSAOntology) {
83 ) 86 )
84 ) 87 )
85 yield Rule.create( 88 yield Rule.create(
86 TupleTableAtom.rdf(varX, iri :: hSuffix, varY), 89 TupleTableAtom.create(tt, varX, iri :: hSuffix, varY),
87 TupleTableAtom.rdf(varX, iri :: bSuffix, varY) 90 TupleTableAtom.create(tt, varX, iri :: bSuffix, varY)
88 ) 91 )
89 }) 92 })
90 } 93 }
@@ -92,7 +95,7 @@ class CanonicalModel(val ontology: RSAOntology) {
92 val (facts, rules): (List[TupleTableAtom], List[Rule]) = { 95 val (facts, rules): (List[TupleTableAtom], List[Rule]) = {
93 // Compute rules from ontology axioms 96 // Compute rules from ontology axioms
94 val (facts, rules) = { 97 val (facts, rules) = {
95 val term = RSAUtil.genFreshVariable() 98 val term = Variable.create("X")
96 val unsafe = ontology.unsafe 99 val unsafe = ontology.unsafe
97 ontology.axioms 100 ontology.axioms
98 .map(a => 101 .map(a =>
@@ -108,6 +111,8 @@ class CanonicalModel(val ontology: RSAOntology) {
108 111
109 object CanonicalModelConverter extends RDFoxConverter { 112 object CanonicalModelConverter extends RDFoxConverter {
110 113
114 override val graph = TupleTableName.create(CanonicalModel.this.graph.getIRI)
115
111 private def rules1( 116 private def rules1(
112 axiom: OWLSubClassOfAxiom 117 axiom: OWLSubClassOfAxiom
113 ): Result = { 118 ): Result = {
@@ -115,11 +120,10 @@ class CanonicalModel(val ontology: RSAOntology) {
115 // Fresh Variables 120 // Fresh Variables
116 val v0 = RSA("v0_" ++ axiom.hashed) 121 val v0 = RSA("v0_" ++ axiom.hashed)
117 val varX = Variable.create("X") 122 val varX = Variable.create("X")
118 implicit val unfoldTerm = RSA(unfold.hashCode.toString)
119 // TODO: use axiom.toTriple instead 123 // TODO: use axiom.toTriple instead
120 val atomA: TupleTableAtom = { 124 val atomA: TupleTableAtom = {
121 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 125 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI
122 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, cls) 126 TupleTableAtom.create(graph, varX, IRI.RDF_TYPE, cls)
123 } 127 }
124 val roleRf: TupleTableAtom = { 128 val roleRf: TupleTableAtom = {
125 val prop = 129 val prop =
@@ -132,12 +136,15 @@ class CanonicalModel(val ontology: RSAOntology) {
132 .getFiller 136 .getFiller
133 .asInstanceOf[OWLClass] 137 .asInstanceOf[OWLClass]
134 .getIRI 138 .getIRI
135 TupleTableAtom.rdf(v0, IRI.RDF_TYPE, cls) 139 TupleTableAtom.create(graph, v0, IRI.RDF_TYPE, cls)
136 } 140 }
137 val facts = unfold map RSA.In 141 val unfoldSet = RSA(unfold.hashCode.toString)
142 val facts = unfold.map(TupleTableAtom.create(graph, _, RSA.IN, unfoldSet))
143 val notInX =
144 Negation.create(TupleTableAtom.create(graph, varX, RSA.IN, unfoldSet))
138 val rules = List( 145 val rules = List(
139 Rule.create(roleRf, atomA, RSA.NotIn(varX)), 146 Rule.create(roleRf, atomA, notInX),
140 Rule.create(atomB, atomA, RSA.NotIn(varX)) 147 Rule.create(atomB, atomA, notInX)
141 ) 148 )
142 (facts, rules) 149 (facts, rules)
143 } 150 }
@@ -155,7 +162,7 @@ class CanonicalModel(val ontology: RSAOntology) {
155 // Predicates 162 // Predicates
156 def atomA(t: Term): TupleTableAtom = { 163 def atomA(t: Term): TupleTableAtom = {
157 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 164 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI
158 TupleTableAtom.rdf(t, IRI.RDF_TYPE, cls) 165 TupleTableAtom.create(graph, t, IRI.RDF_TYPE, cls)
159 } 166 }
160 def roleRf(t1: Term, t2: Term): TupleTableAtom = 167 def roleRf(t1: Term, t2: Term): TupleTableAtom =
161 super.convert(roleR, t1, t2, Forward) 168 super.convert(roleR, t1, t2, Forward)
@@ -165,7 +172,7 @@ class CanonicalModel(val ontology: RSAOntology) {
165 .getFiller 172 .getFiller
166 .asInstanceOf[OWLClass] 173 .asInstanceOf[OWLClass]
167 .getIRI 174 .getIRI
168 TupleTableAtom.rdf(t, IRI.RDF_TYPE, cls) 175 TupleTableAtom.create(graph, t, IRI.RDF_TYPE, cls)
169 } 176 }
170 //Rules 177 //Rules
171 List( 178 List(
@@ -190,7 +197,7 @@ class CanonicalModel(val ontology: RSAOntology) {
190 // Predicates 197 // Predicates
191 def atomA(t: Term): TupleTableAtom = { 198 def atomA(t: Term): TupleTableAtom = {
192 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 199 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI
193 TupleTableAtom.rdf(t, IRI.RDF_TYPE, cls) 200 TupleTableAtom.create(graph, t, IRI.RDF_TYPE, cls)
194 } 201 }
195 def roleRf(t: Term): TupleTableAtom = 202 def roleRf(t: Term): TupleTableAtom =
196 super.convert(roleR, t, v1, Forward) 203 super.convert(roleR, t, v1, Forward)
@@ -200,7 +207,7 @@ class CanonicalModel(val ontology: RSAOntology) {
200 .getFiller 207 .getFiller
201 .asInstanceOf[OWLClass] 208 .asInstanceOf[OWLClass]
202 .getIRI 209 .getIRI
203 TupleTableAtom.rdf(v1, IRI.RDF_TYPE, cls) 210 TupleTableAtom.create(graph, v1, IRI.RDF_TYPE, cls)
204 } 211 }
205 cycle.flatMap { x => 212 cycle.flatMap { x =>
206 List( 213 List(
@@ -216,13 +223,13 @@ class CanonicalModel(val ontology: RSAOntology) {
216 unsafe: List[OWLObjectPropertyExpression], 223 unsafe: List[OWLObjectPropertyExpression],
217 skolem: SkolemStrategy, 224 skolem: SkolemStrategy,
218 suffix: RSASuffix 225 suffix: RSASuffix
219 ): Result = 226 )(implicit fresh: DataFactory): Result =
220 axiom match { 227 axiom match {
221 228
222 case a: OWLSubClassOfAxiom if a.isT5 => { 229 case a: OWLSubClassOfAxiom if a.isT5 => {
223 val role = axiom.objectPropertyExpressionsInSignature(0) 230 val role = axiom.objectPropertyExpressionsInSignature(0)
224 if (unsafe contains role) 231 if (unsafe contains role)
225 super.convert(a, term, unsafe, new Standard(a), Forward) 232 super.convert(a, term, unsafe, new Standard(a), Forward)(fresh)
226 else { 233 else {
227 val (f1, r1) = rules1(a) 234 val (f1, r1) = rules1(a)
228 (f1, r1 ::: rules2(a) ::: rules3(a)) 235 (f1, r1 ::: rules2(a) ::: rules3(a))
@@ -231,12 +238,12 @@ class CanonicalModel(val ontology: RSAOntology) {
231 238
232 case a: OWLSubObjectPropertyOfAxiom => { 239 case a: OWLSubObjectPropertyOfAxiom => {
233 val (facts, rules) = List(Empty, Forward, Backward) 240 val (facts, rules) = List(Empty, Forward, Backward)
234 .map(super.convert(a, term, unsafe, NoSkolem, _)) 241 .map(super.convert(a, term, unsafe, NoSkolem, _)(fresh))
235 .unzip 242 .unzip
236 (facts.flatten, rules.flatten) 243 (facts.flatten, rules.flatten)
237 } 244 }
238 245
239 case a => super.convert(a, term, unsafe, skolem, suffix) 246 case a => super.convert(a, term, unsafe, skolem, suffix)(fresh)
240 247
241 } 248 }
242 } 249 }