aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2020-12-02 18:47:49 +0000
committerFederico Igne <federico.igne@cs.ox.ac.uk>2020-12-02 18:47:49 +0000
commit91de03f187f298004d90708c5815e86134b10eae (patch)
tree6b027414dba598859c5f27740e7a30799308b38e
parentbb2fe6440ea4f7e7aeca037c4a4351a28aac3a9f (diff)
downloadRSAComb-91de03f187f298004d90708c5815e86134b10eae.tar.gz
RSAComb-91de03f187f298004d90708c5815e86134b10eae.zip
Make filtering program generate/load facts as facts
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/FilteringProgram.scala20
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala4
-rw-r--r--src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala18
3 files changed, 26 insertions, 16 deletions
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 52be937..4e533c6 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/FilteringProgram.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/FilteringProgram.scala
@@ -76,6 +76,15 @@ class FilteringProgram(query: ConjunctiveQuery, constants: List[Term]) {
76 val nis: Rule = 76 val nis: Rule =
77 Rule.create(RSA.NI(varX), RSA.Congruent(varX, varY), RSA.Named(varY)) 77 Rule.create(RSA.NI(varX), RSA.Congruent(varX, varY), RSA.Named(varY))
78 78
79 /** Initializes instances of `rsa:Named`.
80 *
81 * They represent the set of constants appearing in the original
82 * ontology.
83 *
84 * @note corresponds to rules 2 in Table 3.
85 */
86 val facts = constants map RSA.Named
87
79 /** Collection of filtering program rules. */ 88 /** Collection of filtering program rules. */
80 val rules: List[Rule] = 89 val rules: List[Rule] =
81 nis :: { 90 nis :: {
@@ -89,15 +98,6 @@ class FilteringProgram(query: ConjunctiveQuery, constants: List[Term]) {
89 */ 98 */
90 val r1 = Rule.create(RSA.QM, query.atoms: _*) 99 val r1 = Rule.create(RSA.QM, query.atoms: _*)
91 100
92 /** Initializes instances of `rsa:Named`.
93 *
94 * They represent the set of constants appearing in the original
95 * ontology.
96 *
97 * @note corresponds to rules 2 in Table 3.
98 */
99 val r2 = constants.map(c => Rule.create(RSA.Named(c)))
100
101 /** Initializes instances of `rsa:ID`. 101 /** Initializes instances of `rsa:ID`.
102 * 102 *
103 * They are initialized as a minimal congruence relation over the 103 * They are initialized as a minimal congruence relation over the
@@ -307,7 +307,7 @@ class FilteringProgram(query: ConjunctiveQuery, constants: List[Term]) {
307 */ 307 */
308 val r9 = Rule.create(RSA.Ans, RSA.QM, not(RSA.SP)) 308 val r9 = Rule.create(RSA.Ans, RSA.QM, not(RSA.SP))
309 309
310 (r1 :: r2 ::: 310 (r1 ::
311 r3a ::: r3b :: r3c :: 311 r3a ::: r3b :: r3c ::
312 r4a ::: r4b ::: r4c ::: 312 r4a ::: r4b ::: r4c :::
313 r5a ::: r5b ::: r5c ::: 313 r5a ::: r5b ::: r5c :::
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 f90e3c1..a965ef9 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala
@@ -327,9 +327,11 @@ class RSAOntology(val ontology: OWLOntology) {
327 def ask(query: ConjunctiveQuery): ConjunctiveQueryAnswers = { 327 def ask(query: ConjunctiveQuery): ConjunctiveQueryAnswers = {
328 import implicits.JavaCollections._ 328 import implicits.JavaCollections._
329 val (server, data) = RDFoxUtil.openConnection(RSAOntology.DataStore) 329 val (server, data) = RDFoxUtil.openConnection(RSAOntology.DataStore)
330 val filter = this.filteringProgram(query)
330 RDFoxUtil.addRules(data, this.canonicalModel.rules) 331 RDFoxUtil.addRules(data, this.canonicalModel.rules)
331 RDFoxUtil.addFacts(data, this.canonicalModel.facts) 332 RDFoxUtil.addFacts(data, this.canonicalModel.facts)
332 data.addRules(this.filteringProgram(query).rules) 333 RDFoxUtil.addRules(data, filter.rules)
334 RDFoxUtil.addFacts(data, filter.facts)
333 val answers = RDFoxUtil 335 val answers = RDFoxUtil
334 .submitQuery( 336 .submitQuery(
335 data, 337 data,
diff --git a/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala b/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala
index 71c9a99..86e0253 100644
--- a/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala
+++ b/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala
@@ -65,24 +65,32 @@ class FilteringProgramSpec extends AnyFlatSpec with Matchers {
65 65
66 import FilteringProgramSpec._ 66 import FilteringProgramSpec._
67 67
68 "CQ 0" should "generate 30 rules" in { 68 "CQ 0" should "generate 27 rules and 3 facts" in {
69 val cq = ConjunctiveQuery(cq0).get 69 val cq = ConjunctiveQuery(cq0).get
70 FilteringProgram(cq, constants).rules should have length 30 70 val filter = FilteringProgram(cq, constants)
71 filter.facts should have length 3
72 filter.rules should have length 27
71 } 73 }
72 74
73 "CQ 1" should "generate 15 rules" in { 75 "CQ 1" should "generate 15 rules" in {
74 val cq = ConjunctiveQuery(cq1).get 76 val cq = ConjunctiveQuery(cq1).get
75 FilteringProgram(cq, List()).rules should have length 15 77 val filter = FilteringProgram(cq, List())
78 filter.facts shouldBe empty
79 filter.rules should have length 15
76 } 80 }
77 81
78 "CQ 2" should "generate 51 rules" in { 82 "CQ 2" should "generate 51 rules" in {
79 val cq = ConjunctiveQuery(cq2).get 83 val cq = ConjunctiveQuery(cq2).get
80 FilteringProgram(cq, List()).rules should have length 51 84 val filter = FilteringProgram(cq, List())
85 filter.facts shouldBe empty
86 filter.rules should have length 51
81 } 87 }
82 88
83 "BCQ 0" should "generate 46 rules" in { 89 "BCQ 0" should "generate 46 rules" in {
84 val cq = ConjunctiveQuery(bcq0).get 90 val cq = ConjunctiveQuery(bcq0).get
85 FilteringProgram(cq, constants).rules should have length 46 91 val filter = FilteringProgram(cq, constants)
92 filter.facts should have length 3
93 filter.rules should have length 43
86 } 94 }
87 95
88} 96}