aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala7
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala11
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQueryAnswers.scala21
-rw-r--r--src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala8
4 files changed, 30 insertions, 17 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 6891c8c..eaacedc 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala
@@ -68,8 +68,13 @@ object RSAComb extends App {
68 68
69 val unfiltered = ontology askUnfiltered query 69 val unfiltered = ontology askUnfiltered query
70 val percentage = unfiltered match { 70 val percentage = unfiltered match {
71 case Some(u) => 71 case Some(u) => {
72 Logger.print(
73 s"Number of spurious answers: ${u.length}.",
74 Logger.DEBUG
75 )
72 if (u.length > 0) (1 - answers.length / u.length) * 100 else 0 76 if (u.length > 0) (1 - answers.length / u.length) * 100 else 0
77 }
73 case None => 0 78 case None => 0
74 } 79 }
75 Logger.print( 80 Logger.print(
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 dc64c79..0f1cd5e 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala
@@ -298,9 +298,8 @@ class RSAOntology(val ontology: OWLOntology) {
298 ): Graph[Resource, UnDiEdge] = { 298 ): Graph[Resource, UnDiEdge] = {
299 val query = "SELECT ?X ?Y WHERE { ?X rsa:E ?Y }" 299 val query = "SELECT ?X ?Y WHERE { ?X rsa:E ?Y }"
300 val answers = RDFoxUtil.submitQuery(data, query, RSA.Prefixes).get 300 val answers = RDFoxUtil.submitQuery(data, query, RSA.Prefixes).get
301 var edges: Seq[UnDiEdge[Resource]] = answers.map { case Seq(n1, n2) => 301 var edges: Seq[UnDiEdge[Resource]] =
302 UnDiEdge(n1, n2) 302 answers.collect { case (_, Seq(n1, n2)) => UnDiEdge(n1, n2) }
303 }
304 Graph(edges: _*) 303 Graph(edges: _*)
305 } 304 }
306 305
@@ -402,7 +401,7 @@ class RSAOntology(val ontology: OWLOntology) {
402 query: String, 401 query: String,
403 prefixes: Prefixes = new Prefixes(), 402 prefixes: Prefixes = new Prefixes(),
404 opts: ju.Map[String, String] = new ju.HashMap[String, String]() 403 opts: ju.Map[String, String] = new ju.HashMap[String, String]()
405 ): Option[Seq[Seq[Resource]]] = { 404 ): Option[Seq[(Long, Seq[Resource])]] = {
406 val (server, data) = RDFoxUtil.openConnection(RSAOntology.DataStore) 405 val (server, data) = RDFoxUtil.openConnection(RSAOntology.DataStore)
407 val answers = RDFoxUtil.submitQuery(data, query, prefixes, opts) 406 val answers = RDFoxUtil.submitQuery(data, query, prefixes, opts)
408 RDFoxUtil.closeConnection(server, data) 407 RDFoxUtil.closeConnection(server, data)
@@ -418,7 +417,9 @@ class RSAOntology(val ontology: OWLOntology) {
418 * [[uk.ac.ox.cs.rsacomb.RSAOntology.ask RSAOntology.ask]] 417 * [[uk.ac.ox.cs.rsacomb.RSAOntology.ask RSAOntology.ask]]
419 * for the corresponding query has been called. 418 * for the corresponding query has been called.
420 */ 419 */
421 def askUnfiltered(cq: ConjunctiveQuery): Option[Seq[Seq[Resource]]] = { 420 def askUnfiltered(
421 cq: ConjunctiveQuery
422 ): Option[Seq[(Long, Seq[Resource])]] = {
422 val query = RDFoxUtil.buildDescriptionQuery("QM", cq.variables.length) 423 val query = RDFoxUtil.buildDescriptionQuery("QM", cq.variables.length)
423 queryDataStore(cq, query, RSA.Prefixes) 424 queryDataStore(cq, query, RSA.Prefixes)
424 } 425 }
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQueryAnswers.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQueryAnswers.scala
index 667defc..7edc867 100644
--- a/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQueryAnswers.scala
+++ b/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQueryAnswers.scala
@@ -19,12 +19,15 @@ import tech.oxfordsemantic.jrdfox.logic.expression.{
19class ConjunctiveQueryAnswers( 19class ConjunctiveQueryAnswers(
20 bcq: Boolean, 20 bcq: Boolean,
21 val variables: Seq[Variable], 21 val variables: Seq[Variable],
22 val answers: Seq[Seq[Resource]] 22 val answers: Seq[(Long, Seq[Resource])]
23) { 23) {
24 24
25 /** Returns number of answers. */ 25 /** Returns number of distinct answers. */
26 val length: Int = if (bcq) 0 else answers.length 26 val length: Int = if (bcq) 0 else answers.length
27 27
28 /** Returns number of answers taking into account multiplicity. */
29 val lengthWithMultiplicity: Long = answers.map(_._1).sum
30
28 override def toString(): String = 31 override def toString(): String =
29 if (bcq) { 32 if (bcq) {
30 if (answers.isEmpty) "FALSE" else "TRUE" 33 if (answers.isEmpty) "FALSE" else "TRUE"
@@ -34,11 +37,15 @@ class ConjunctiveQueryAnswers(
34 else { 37 else {
35 val header = variables map (_.getName) mkString "\t" 38 val header = variables map (_.getName) mkString "\t"
36 val body = answers 39 val body = answers
37 .map(_.map { 40 .map(
38 case x: IRI => x.getIRI 41 _._2
39 case x: Literal => x.getLexicalForm 42 .map {
40 case x => x.toString 43 case x: IRI => x.getIRI
41 }.mkString("\t")) 44 case x: Literal => x.getLexicalForm
45 case x => x.toString
46 }
47 .mkString("\t")
48 )
42 .mkString("\n") 49 .mkString("\n")
43 s"$header\n$body" 50 s"$header\n$body"
44 } 51 }
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 31cc850..76f720c 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
@@ -37,8 +37,8 @@ object RDFoxUtil {
37 /** Type alias for a collection of answers to a 37 /** Type alias for a collection of answers to a
38 * [[tech.oxfordsemantic.jrdfox.logic.sparql.statement.Query]]. 38 * [[tech.oxfordsemantic.jrdfox.logic.sparql.statement.Query]].
39 */ 39 */
40 private type QueryAnswers = Seq[Seq[Resource]] 40 private type QueryAnswers = Seq[(Long, Seq[Resource])]
41 private def QueryAnswers() = List.empty[Seq[Resource]] 41 private def QueryAnswers() = List.empty[(Long, Seq[Resource])]
42 42
43 /** Type alias for <option => value> RDFox options. */ 43 /** Type alias for <option => value> RDFox options. */
44 private type RDFoxOpts = java.util.Map[String, String] 44 private type RDFoxOpts = java.util.Map[String, String]
@@ -170,7 +170,7 @@ object RDFoxUtil {
170 while (mul > 0) { 170 while (mul > 0) {
171 val answer = 171 val answer =
172 (0 until cursor.getArity).map(cursor.getResource(_)).toList 172 (0 until cursor.getArity).map(cursor.getResource(_)).toList
173 answers = answer :: answers 173 answers = (mul, answer) :: answers
174 mul = cursor.advance() 174 mul = cursor.advance()
175 } 175 }
176 cursor.close(); 176 cursor.close();
@@ -218,7 +218,7 @@ object RDFoxUtil {
218 .map(i => s"?S rsa:${pred :: Nth(i)} ?X$i .") 218 .map(i => s"?S rsa:${pred :: Nth(i)} ?X$i .")
219 .mkString("WHERE {\n", "\n", "\n}") 219 .mkString("WHERE {\n", "\n", "\n}")
220 } else { 220 } else {
221 s"ASK { ?X a rsa:$pred }" 221 s"ASK { ?X a rsa:${pred :: Nth(0)} }"
222 } 222 }
223 } 223 }
224 224