diff options
Diffstat (limited to 'src/main/scala/uk/ac')
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.{ | |||
19 | class ConjunctiveQueryAnswers( | 19 | class 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 | ||