diff options
| author | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-12-09 11:19:27 +0000 |
|---|---|---|
| committer | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-12-09 11:19:27 +0000 |
| commit | 43327d8a986e41ba26b6f2b5c911646c7c9a254b (patch) | |
| tree | bcecccf1358326905604c25edc1f22e7a5f0e75f /src/main/scala | |
| parent | 2b0f0d0079484b00a1b788414ff1499282a86aeb (diff) | |
| download | RSAComb-43327d8a986e41ba26b6f2b5c911646c7c9a254b.tar.gz RSAComb-43327d8a986e41ba26b6f2b5c911646c7c9a254b.zip | |
Keep track of answer multiplicity
Diffstat (limited to 'src/main/scala')
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 | ||
