From e84d4a15401b0a83dbb7d502723c33abf656b9ff Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Thu, 19 Nov 2020 11:45:01 +0000 Subject: Move NI instantiation in FilteringProgram --- .../scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala | 19 +++++------- .../uk/ac/ox/cs/rsacomb/FilteringProgram.scala | 36 ++++++++++++++-------- src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala | 18 +++-------- .../scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala | 7 ++--- src/main/scala/uk/ac/ox/cs/rsacomb/util/RSA.scala | 4 +-- 5 files changed, 39 insertions(+), 45 deletions(-) (limited to 'src/main') 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 f0f1bf8..d5956ae 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala @@ -37,9 +37,6 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom { import implicits.RDFox._ import implicits.JavaCollections._ - val named: List[Rule] = - ontology.individuals.map(a => Rule.create(RSA.Named(a))) - val rolesAdditionalRules: List[Rule] = { // Given a role (predicate) compute additional logic rules def additional(pred: String): Seq[Rule] = { @@ -98,14 +95,14 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom { val varZ = Variable.create("Z") List( // Reflexivity - Rule.create(RSA.congruent(varX, varX), RSA.Thing(varX)), + Rule.create(RSA.Congruent(varX, varX), RSA.Thing(varX)), // Simmetry - Rule.create(RSA.congruent(varY, varX), RSA.congruent(varX, varY)), + Rule.create(RSA.Congruent(varY, varX), RSA.Congruent(varX, varY)), // Transitivity Rule.create( - RSA.congruent(varX, varZ), - RSA.congruent(varX, varY), - RSA.congruent(varY, varZ) + RSA.Congruent(varX, varZ), + RSA.Congruent(varX, varY), + RSA.Congruent(varY, varZ) ) ) } @@ -114,7 +111,7 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom { // Compute rules from ontology axioms val rules = ontology.axioms.flatMap(_.accept(RuleGenerator)) // Return full set of rules - rules ::: rolesAdditionalRules ::: topAxioms ::: equalityAxioms ::: named + rules ::: rolesAdditionalRules ::: topAxioms ::: equalityAxioms } object RuleGenerator @@ -159,8 +156,8 @@ class CanonicalModel(val ontology: RSAOntology) extends RSAAxiom { // do that? val facts = unfold.map(x => Rule.create(RSA.In(x))) val rules = List( - Rule.create(roleRf, atomA, RSA.notIn(varX)), - Rule.create(atomB, atomA, RSA.notIn(varX)) + Rule.create(roleRf, atomA, RSA.NotIn(varX)), + Rule.create(atomB, atomA, RSA.NotIn(varX)) ) facts ++ rules } diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/FilteringProgram.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/FilteringProgram.scala index b154575..adc6f56 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/FilteringProgram.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/FilteringProgram.scala @@ -31,6 +31,13 @@ import uk.ac.ox.cs.rsacomb.implicits.RSAAtom import uk.ac.ox.cs.rsacomb.suffix.{RSASuffix, Forward, Backward} import uk.ac.ox.cs.rsacomb.util.RSA +object FilteringProgram { + + def apply(query: SelectQuery, constants: List[Term]): FilteringProgram = + new FilteringProgram(query, constants) + +} // object FilteringProgram + class FilteringProgram(query: SelectQuery, constants: List[Term]) extends RSAAtom { @@ -62,9 +69,17 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) val (answer, bounded) = variables - val facts: List[Rule] = constants.map(c => Rule.create(RSA.NI(c))) + val named: List[Rule] = + constants.map(a => Rule.create(RSA.Named(a))) + + val nis: Rule = { + val varX = Variable.create("X") + val varY = Variable.create("Y") + Rule.create(RSA.NI(varX), RSA.Congruent(varX, varY), RSA.Named(varY)) + } + val rules: List[Rule] = - this.generateFilteringProgram().map(reifyRule) ++ facts + nis :: named ::: this.generateFilteringProgram().map(reifyRule) /* NOTE: we are restricting to queries that contain conjunctions of * atoms for the time being. This might need to be reviewed in the @@ -159,7 +174,7 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) RSA(bounded.indexOf(role1.getArguments.get(2))), RSA(bounded.indexOf(role2.getArguments.get(2))) ), - not(RSA.congruent(role1.getArguments.get(0), role2.getArguments.get(0))) + not(RSA.Congruent(role1.getArguments.get(0), role2.getArguments.get(0))) ) val r4b = for { role1 <- body.filter(_.isRoleAssertion) @@ -174,7 +189,7 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) RSA(bounded.indexOf(role1.getArguments.get(2))), RSA(bounded.indexOf(role2.getArguments.get(0))) ), - not(RSA.congruent(role1.getArguments.get(0), role2.getArguments.get(2))) + not(RSA.Congruent(role1.getArguments.get(0), role2.getArguments.get(2))) ) val r4c = for { role1 <- body.filter(_.isRoleAssertion) @@ -189,7 +204,7 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) RSA(bounded.indexOf(role1.getArguments.get(0))), RSA(bounded.indexOf(role2.getArguments.get(0))) ), - not(RSA.congruent(role1.getArguments.get(2), role2.getArguments.get(2))) + not(RSA.Congruent(role1.getArguments.get(2), role2.getArguments.get(2))) ) /* Rules 5x */ @@ -215,7 +230,7 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) RSA(bounded indexOf role1arg2), RSA(bounded indexOf role2arg2) ), - RSA.congruent(role1arg0, role2arg0), + RSA.Congruent(role1arg0, role2arg0), not(RSA.NI(role1arg0)) ) val r5b = for { @@ -240,7 +255,7 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) RSA(bounded indexOf role1arg2), RSA(bounded indexOf role2arg0) ), - RSA.congruent(role1arg0, role2arg2), + RSA.Congruent(role1arg0, role2arg2), not(RSA.NI(role1arg0)) ) val r5c = for { @@ -265,7 +280,7 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) RSA(bounded indexOf role1arg0), RSA(bounded indexOf role2arg0) ), - RSA.congruent(role1arg2, role2arg2), + RSA.Congruent(role1arg2, role2arg2), not(RSA.NI(role1arg2)) ) @@ -359,8 +374,3 @@ class FilteringProgram(query: SelectQuery, constants: List[Term]) } } // class FilteringProgram - -object FilteringProgram { - def apply(query: SelectQuery, constants: List[Term]): FilteringProgram = - new FilteringProgram(query, constants) -} // object FilteringProgram diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala index c3db99d..a8107b5 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala @@ -84,24 +84,14 @@ object RSAComb extends App { println(query) } - // Step 1. Computing the canonical model val canon = ontology.canonicalModel data.addRules(canon.rules) + val filter = ontology.filteringProgram(query) + data.addRules(filter.rules) { println("\nCanonical Model rules:") canon.rules.foreach(println) - } - - // Step 2. Computing the canonical model - val nis = { - val query = "SELECT ?Y WHERE { ?X rsa:EquivTo ?Y ; a rsa:Named . }" - RDFoxHelpers.submitSelectQuery(data, query, RSA.Prefixes).flatten - } - val filter = ontology.filteringProgram(query, nis) - data.addRules(filter.rules) - - { println("\nFiltering rules") filter.rules.foreach(println) } @@ -168,12 +158,12 @@ object RSAComb extends App { ) println(ids) - println("\nEquivTo:") + println("\nCongruent:") val equivs = RDFoxHelpers.submitSelectQuery( data, """ SELECT ?X ?Y { - ?X rsa:EquivTo ?Y + ?X rsa:congruent ?Y } """, RSA.Prefixes diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala index ac86e3d..93fd5cd 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala @@ -261,11 +261,8 @@ class RSAOntology(val ontology: OWLOntology) extends RSAAxiom { Graph(edges: _*) } - def filteringProgram( - query: SelectQuery, - nis: List[Term] - ): FilteringProgram = - new FilteringProgram(query, nis) + def filteringProgram(query: SelectQuery): FilteringProgram = + new FilteringProgram(query, individuals) lazy val canonicalModel = new CanonicalModel(this) diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/util/RSA.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/util/RSA.scala index f9ff59b..6c8d42d 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/util/RSA.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/util/RSA.scala @@ -40,9 +40,9 @@ object RSA { def In(t: Term)(implicit set: Term) = TupleTableAtom.rdf(t, RSA("In"), set) - def notIn(t: Term)(implicit set: Term) = Negation.create(In(t)(set)) + def NotIn(t: Term)(implicit set: Term) = Negation.create(In(t)(set)) - def congruent(t1: Term, t2: Term) = + def Congruent(t1: Term, t2: Term) = TupleTableAtom.rdf(t1, RSA("congruent"), t2) def QM(implicit variables: (List[Term], List[Term])) = { -- cgit v1.2.3