diff options
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 |
