From 43327d8a986e41ba26b6f2b5c911646c7c9a254b Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Wed, 9 Dec 2020 11:19:27 +0000 Subject: Keep track of answer multiplicity --- src/main/scala/uk/ac/ox/cs/rsacomb/Main.scala | 7 ++++++- .../scala/uk/ac/ox/cs/rsacomb/RSAOntology.scala | 11 ++++++----- .../cs/rsacomb/sparql/ConjunctiveQueryAnswers.scala | 21 ++++++++++++++------- .../scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala | 8 ++++---- 4 files changed, 30 insertions(+), 17 deletions(-) (limited to 'src') 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 { val unfiltered = ontology askUnfiltered query val percentage = unfiltered match { - case Some(u) => + case Some(u) => { + Logger.print( + s"Number of spurious answers: ${u.length}.", + Logger.DEBUG + ) if (u.length > 0) (1 - answers.length / u.length) * 100 else 0 + } case None => 0 } 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) { ): Graph[Resource, UnDiEdge] = { val query = "SELECT ?X ?Y WHERE { ?X rsa:E ?Y }" val answers = RDFoxUtil.submitQuery(data, query, RSA.Prefixes).get - var edges: Seq[UnDiEdge[Resource]] = answers.map { case Seq(n1, n2) => - UnDiEdge(n1, n2) - } + var edges: Seq[UnDiEdge[Resource]] = + answers.collect { case (_, Seq(n1, n2)) => UnDiEdge(n1, n2) } Graph(edges: _*) } @@ -402,7 +401,7 @@ class RSAOntology(val ontology: OWLOntology) { query: String, prefixes: Prefixes = new Prefixes(), opts: ju.Map[String, String] = new ju.HashMap[String, String]() - ): Option[Seq[Seq[Resource]]] = { + ): Option[Seq[(Long, Seq[Resource])]] = { val (server, data) = RDFoxUtil.openConnection(RSAOntology.DataStore) val answers = RDFoxUtil.submitQuery(data, query, prefixes, opts) RDFoxUtil.closeConnection(server, data) @@ -418,7 +417,9 @@ class RSAOntology(val ontology: OWLOntology) { * [[uk.ac.ox.cs.rsacomb.RSAOntology.ask RSAOntology.ask]] * for the corresponding query has been called. */ - def askUnfiltered(cq: ConjunctiveQuery): Option[Seq[Seq[Resource]]] = { + def askUnfiltered( + cq: ConjunctiveQuery + ): Option[Seq[(Long, Seq[Resource])]] = { val query = RDFoxUtil.buildDescriptionQuery("QM", cq.variables.length) queryDataStore(cq, query, RSA.Prefixes) } 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.{ class ConjunctiveQueryAnswers( bcq: Boolean, val variables: Seq[Variable], - val answers: Seq[Seq[Resource]] + val answers: Seq[(Long, Seq[Resource])] ) { - /** Returns number of answers. */ + /** Returns number of distinct answers. */ val length: Int = if (bcq) 0 else answers.length + /** Returns number of answers taking into account multiplicity. */ + val lengthWithMultiplicity: Long = answers.map(_._1).sum + override def toString(): String = if (bcq) { if (answers.isEmpty) "FALSE" else "TRUE" @@ -34,11 +37,15 @@ class ConjunctiveQueryAnswers( else { val header = variables map (_.getName) mkString "\t" val body = answers - .map(_.map { - case x: IRI => x.getIRI - case x: Literal => x.getLexicalForm - case x => x.toString - }.mkString("\t")) + .map( + _._2 + .map { + case x: IRI => x.getIRI + case x: Literal => x.getLexicalForm + case x => x.toString + } + .mkString("\t") + ) .mkString("\n") s"$header\n$body" } 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 { /** Type alias for a collection of answers to a * [[tech.oxfordsemantic.jrdfox.logic.sparql.statement.Query]]. */ - private type QueryAnswers = Seq[Seq[Resource]] - private def QueryAnswers() = List.empty[Seq[Resource]] + private type QueryAnswers = Seq[(Long, Seq[Resource])] + private def QueryAnswers() = List.empty[(Long, Seq[Resource])] /** Type alias for