aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala
diff options
context:
space:
mode:
authorFederico Igne <git@federicoigne.com>2021-09-30 18:10:01 +0100
committerFederico Igne <git@federicoigne.com>2021-10-01 10:25:40 +0100
commitbc37ee9293d8a4098edce2a77db6efa3d87b6dd2 (patch)
treecb85cc0b3b48855aca503b07f93c7b54e4b99c07 /src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala
parent1ef8a2502532dd1736c1e3d6a1ff78ed6b8b643c (diff)
downloadRSAComb-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.scala35
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}
36import tech.oxfordsemantic.jrdfox.logic.expression.{IRI, Term, Variable} 37import 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 */
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,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(