From b4ddcd3f489aa217cda56140274c5b6d91a75c10 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Wed, 23 Jun 2021 16:30:45 +0100 Subject: 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. --- src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala | 14 ++++++++++++++ src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala | 4 +--- .../ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala | 13 +++++++------ src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala | 14 +++++++++----- 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 { ConjunctiveQuery.parse(query) match { case Some(query) => { + // Retrieve answers val answers = rsa ask query Logger.print(s"$answers", Logger.VERBOSE) Logger print s"Number of answers: ${answers.length} (${answers.lengthWithMultiplicity})" + // Retrieve unfiltered answers + val unfiltered = rsa.queryDataStore( + """ + SELECT (count(?K) as ?COUNT) + WHERE { + ?K a rsa:QM . + } + """, + RSA.Prefixes + ) + unfiltered.foreach((u) => + Logger print s"Number of unfiltered answers: ${u.head._2}" + ) } case None => 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*) { * [[uk.ac.ox.cs.rsacomb.RSAOntology.ask RSAOntology.ask]]. * @note This method has been introduced mostly for debugging purposes. * - * @param cq a CQ used to compute the environment. * @param query query to be executed against the environment * @param prefixes additional prefixes for the query. It defaults to * an empty set. @@ -564,7 +563,6 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) { * @return a collection of answers to the input query. */ def queryDataStore( - cq: ConjunctiveQuery, query: String, prefixes: Prefixes = new Prefixes(), opts: ju.Map[String, String] = new ju.HashMap[String, String]() @@ -588,7 +586,7 @@ class RSAOntology(val original: OWLOntology, val datafiles: File*) { cq: ConjunctiveQuery ): Option[Seq[(Long, Seq[Resource])]] = { val query = RDFoxUtil.buildDescriptionQuery("QM", cq.variables.length) - queryDataStore(cq, query, RSA.Prefixes) + queryDataStore(query, RSA.Prefixes) } 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) val answerQuery: String = { val arity = query.answer.size if (arity > 0) { - val variables = (0 until arity).mkString("?X", " ?X", "") + val answer = query.answer mkString " " + val bounded = query.bounded mkString " " s""" - SELECT ${query.answer mkString ""} - WHERE { - ?K a rsa:Ans . - TT { ${query.answer mkString ""} ${query.bounded mkString ""} ?K } . - } + SELECT $answer + WHERE { + ?K a rsa:Ans . + TT { $answer $bounded ?K } . + } """ } else { "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 { arity: Int ): String = { if (arity > 0) { - (0 until arity).mkString("SELECT ?X", " ?X", "\n") + - (0 until arity) - .map(i => s"?S rsa:${pred :: Nth(i)} ?X$i .") - .mkString("WHERE {\n", "\n", "\n}") + val variables = (0 until arity).mkString("?X", " ?X", "") + s""" + SELECT $variables + WHERE { + ?K a rsa:$pred. + TT { $variables ?K } . + } + """ } else { - s"ASK { ?X a rsa:$pred }" + "ASK { ?X a rsa:Ans }" } } -- cgit v1.2.3