diff options
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.scala | 49 |
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 | } |
36 | import tech.oxfordsemantic.jrdfox.logic.expression.{IRI, Term, Variable} | 37 | import tech.oxfordsemantic.jrdfox.logic.expression.{IRI, Term, Variable} |
37 | 38 | ||
@@ -39,7 +40,7 @@ import implicits.JavaCollections._ | |||
39 | 40 | ||
40 | import uk.ac.ox.cs.rsacomb.converter._ | 41 | import uk.ac.ox.cs.rsacomb.converter._ |
41 | import uk.ac.ox.cs.rsacomb.suffix._ | 42 | import uk.ac.ox.cs.rsacomb.suffix._ |
42 | import uk.ac.ox.cs.rsacomb.util.RSA | 43 | import 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 | */ |
52 | class CanonicalModel(val ontology: RSAOntology) { | 54 | class 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 | } |