aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/uk/ac/ox/cs
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2021-06-23 16:30:45 +0100
committerFederico Igne <federico.igne@cs.ox.ac.uk>2021-06-23 16:31:07 +0100
commitb4ddcd3f489aa217cda56140274c5b6d91a75c10 (patch)
tree2f9b77ca5e9a15b3a8456798ab1bef4888be9c93 /src/main/scala/uk/ac/ox/cs
parent7ab2d819947c03a6618e273d5996a171f0217119 (diff)
downloadRSAComb-b4ddcd3f489aa217cda56140274c5b6d91a75c10.tar.gz
RSAComb-b4ddcd3f489aa217cda56140274c5b6d91a75c10.zip
Fix automatic query building
The API for the SKOLEM operator is changed in RDFox but the helper functions using it were not ported to the new syntax.
Diffstat (limited to 'src/main/scala/uk/ac/ox/cs')
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala14
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala4
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala13
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala14
4 files changed, 31 insertions, 14 deletions
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 74084af..f9de801 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala
@@ -119,9 +119,23 @@ object RSAComb extends App {
119 119
120 ConjunctiveQuery.parse(query) match { 120 ConjunctiveQuery.parse(query) match {
121 case Some(query) => { 121 case Some(query) => {
122 // Retrieve answers
122 val answers = rsa ask query 123 val answers = rsa ask query
123 Logger.print(s"$answers", Logger.VERBOSE) 124 Logger.print(s"$answers", Logger.VERBOSE)
124 Logger print s"Number of answers: ${answers.length} (${answers.lengthWithMultiplicity})" 125 Logger print s"Number of answers: ${answers.length} (${answers.lengthWithMultiplicity})"
126 // Retrieve unfiltered answers
127 val unfiltered = rsa.queryDataStore(
128 """
129 SELECT (count(?K) as ?COUNT)
130 WHERE {
131 ?K a rsa:QM .
132 }
133 """,
134 RSA.Prefixes
135 )
136 unfiltered.foreach((u) =>
137 Logger print s"Number of unfiltered answers: ${u.head._2}"
138 )
125 } 139 }
126 case None => 140 case None =>
127 throw new RuntimeException("Submitted query is not conjunctive") 141 throw new RuntimeException("Submitted query is not conjunctive")
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 c7b3bf0..0e10f89 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala
@@ -556,7 +556,6 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) {
556 * [[uk.ac.ox.cs.rsacomb.RSAOntology.ask RSAOntology.ask]]. 556 * [[uk.ac.ox.cs.rsacomb.RSAOntology.ask RSAOntology.ask]].
557 * @note This method has been introduced mostly for debugging purposes. 557 * @note This method has been introduced mostly for debugging purposes.
558 * 558 *
559 * @param cq a CQ used to compute the environment.
560 * @param query query to be executed against the environment 559 * @param query query to be executed against the environment
561 * @param prefixes additional prefixes for the query. It defaults to 560 * @param prefixes additional prefixes for the query. It defaults to
562 * an empty set. 561 * an empty set.
@@ -564,7 +563,6 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) {
564 * @return a collection of answers to the input query. 563 * @return a collection of answers to the input query.
565 */ 564 */
566 def queryDataStore( 565 def queryDataStore(
567 cq: ConjunctiveQuery,
568 query: String, 566 query: String,
569 prefixes: Prefixes = new Prefixes(), 567 prefixes: Prefixes = new Prefixes(),
570 opts: ju.Map[String, String] = new ju.HashMap[String, String]() 568 opts: ju.Map[String, String] = new ju.HashMap[String, String]()
@@ -588,7 +586,7 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) {
588 cq: ConjunctiveQuery 586 cq: ConjunctiveQuery
589 ): Option[Seq[(Long, Seq[Resource])]] = { 587 ): Option[Seq[(Long, Seq[Resource])]] = {
590 val query = RDFoxUtil.buildDescriptionQuery("QM", cq.variables.length) 588 val query = RDFoxUtil.buildDescriptionQuery("QM", cq.variables.length)
591 queryDataStore(cq, query, RSA.Prefixes) 589 queryDataStore(query, RSA.Prefixes)
592 } 590 }
593 591
594 def self(axiom: OWLSubClassOfAxiom): Set[Term] = { 592 def self(axiom: OWLSubClassOfAxiom): Set[Term] = {
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala
index 3773423..8787b43 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala
@@ -401,13 +401,14 @@ class RevisedFilteringProgram(val query: ConjunctiveQuery)
401 val answerQuery: String = { 401 val answerQuery: String = {
402 val arity = query.answer.size 402 val arity = query.answer.size
403 if (arity > 0) { 403 if (arity > 0) {
404 val variables = (0 until arity).mkString("?X", " ?X", "") 404 val answer = query.answer mkString " "
405 val bounded = query.bounded mkString " "
405 s""" 406 s"""
406 SELECT ${query.answer mkString ""} 407 SELECT $answer
407 WHERE { 408 WHERE {
408 ?K a rsa:Ans . 409 ?K a rsa:Ans .
409 TT <http://oxfordsemantic.tech/RDFox#SKOLEM> { ${query.answer mkString ""} ${query.bounded mkString ""} ?K } . 410 TT <http://oxfordsemantic.tech/RDFox#SKOLEM> { $answer $bounded ?K } .
410 } 411 }
411 """ 412 """
412 } else { 413 } else {
413 "ASK { ?X a rsa:Ans }" 414 "ASK { ?X a rsa:Ans }"
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala
index 6833640..82aa971 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala
@@ -275,12 +275,16 @@ object RDFoxUtil {
275 arity: Int 275 arity: Int
276 ): String = { 276 ): String = {
277 if (arity > 0) { 277 if (arity > 0) {
278 (0 until arity).mkString("SELECT ?X", " ?X", "\n") + 278 val variables = (0 until arity).mkString("?X", " ?X", "")
279 (0 until arity) 279 s"""
280 .map(i => s"?S rsa:${pred :: Nth(i)} ?X$i .") 280 SELECT $variables
281 .mkString("WHERE {\n", "\n", "\n}") 281 WHERE {
282 ?K a rsa:$pred.
283 TT <http://oxfordsemantic.tech/RDFox#SKOLEM> { $variables ?K } .
284 }
285 """
282 } else { 286 } else {
283 s"ASK { ?X a rsa:$pred }" 287 "ASK { ?X a rsa:Ans }"
284 } 288 }
285 } 289 }
286 290