diff options
author | Federico Igne <git@federicoigne.com> | 2021-09-30 18:10:01 +0100 |
---|---|---|
committer | Federico Igne <git@federicoigne.com> | 2021-10-01 10:25:40 +0100 |
commit | bc37ee9293d8a4098edce2a77db6efa3d87b6dd2 (patch) | |
tree | cb85cc0b3b48855aca503b07f93c7b54e4b99c07 /src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala | |
parent | 1ef8a2502532dd1736c1e3d6a1ff78ed6b8b643c (diff) | |
download | RSAComb-bc37ee9293d8a4098edce2a77db6efa3d87b6dd2.tar.gz RSAComb-bc37ee9293d8a4098edce2a77db6efa3d87b6dd2.zip |
Make canonical model generation parametric over named graph
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 | 35 |
1 files changed, 21 insertions, 14 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 3467d3c..a39b9c0 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 | ||
@@ -48,8 +49,9 @@ import uk.ac.ox.cs.rsacomb.util.{DataFactory, 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,6 +67,7 @@ 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] = { |
70 | val tt = TupleTableName.create(graph.getIRI) | ||
68 | ontology.roles | 71 | ontology.roles |
69 | .collect { case prop: OWLObjectProperty => prop } | 72 | .collect { case prop: OWLObjectProperty => prop } |
70 | .flatMap((pred) => { | 73 | .flatMap((pred) => { |
@@ -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 | } |
@@ -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( |