From 094a6e1211c96f174040b209d0c5e2e188bfa4ac Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Wed, 11 May 2022 16:28:20 +0100 Subject: Add RSA query reasoner to perform CQ answering over RSA --- src/main/scala/uk/ac/ox/cs/acqua/Main.scala | 25 +++++----------- .../ox/cs/acqua/implicits/PagodaConverters.scala | 12 ++++++-- .../ac/ox/cs/acqua/reasoner/RSAQueryReasoner.scala | 34 ++++++++++++++++++---- 3 files changed, 47 insertions(+), 24 deletions(-) (limited to 'src/main/scala/uk') diff --git a/src/main/scala/uk/ac/ox/cs/acqua/Main.scala b/src/main/scala/uk/ac/ox/cs/acqua/Main.scala index e8cfeb7..221c0e2 100644 --- a/src/main/scala/uk/ac/ox/cs/acqua/Main.scala +++ b/src/main/scala/uk/ac/ox/cs/acqua/Main.scala @@ -57,29 +57,20 @@ object Acqua extends App { reasoner.loadOntology(ontology.origin) reasoner.importData(properties.getDataPath()) if (reasoner.preprocess()) { - Utility.logInfo("The ontology is consistent!"); + Utility logInfo "The ontology is consistent!" } else { - Utility.logInfo("The ontology is inconsistent!"); + Utility logInfo "The ontology is inconsistent!" reasoner.dispose(); + // Exit somehow } if (config contains 'queries) { - val queries = - RDFoxUtil.loadQueriesFromFiles( - config('queries).get[List[os.Path]], - RSA.Prefixes - ) - // for(String queryFile : properties.getQueryPath().split(";")) { - // Collection queryRecords = pagoda.getQueryManager().collectQueryRecords(queryFile); - // pagoda.evaluate(queryRecords); + val queryManager = reasoner.getQueryManager() + config('queries).get[List[os.Path]].map(path => { + val queries = queryManager collectQueryRecords path.toString + reasoner evaluate queries + }) } } - - // /* Perform query answering */ - // val answers = rsa ask queries - - // /* Perform logging */ - // Logger write answers - // Logger.generateSimulationScripts(datapath, queries) diff --git a/src/main/scala/uk/ac/ox/cs/acqua/implicits/PagodaConverters.scala b/src/main/scala/uk/ac/ox/cs/acqua/implicits/PagodaConverters.scala index c7c582d..3663813 100644 --- a/src/main/scala/uk/ac/ox/cs/acqua/implicits/PagodaConverters.scala +++ b/src/main/scala/uk/ac/ox/cs/acqua/implicits/PagodaConverters.scala @@ -16,14 +16,22 @@ package uk.ac.ox.cs.acqua.implicits +import java.util.Collection +import scala.collection.JavaConverters._ + import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery +import uk.ac.ox.cs.rsacomb.util.RSA import uk.ac.ox.cs.pagoda.query.QueryRecord object PagodaConverters { - implicit def queryRecord2conjuctiveQuery(q: QueryRecord): ConjunctiveQuery = ??? + implicit def queryRecord2conjuctiveQuery(q: QueryRecord): ConjunctiveQuery = { + // TODO: check whether `q.id` is correct + ConjunctiveQuery.parse(q.id,q.getQueryText(),RSA.Prefixes).get + } - implicit def conjunctiveQuery2queryRecord(q: ConjunctiveQuery): QueryRecord = ??? + implicit def queryRecords2conjuctiveQueries(qs: Collection[QueryRecord]): List[ConjunctiveQuery] = + qs.asScala.map(queryRecord2conjuctiveQuery).toList } diff --git a/src/main/scala/uk/ac/ox/cs/acqua/reasoner/RSAQueryReasoner.scala b/src/main/scala/uk/ac/ox/cs/acqua/reasoner/RSAQueryReasoner.scala index 6b98d79..ea84ca5 100644 --- a/src/main/scala/uk/ac/ox/cs/acqua/reasoner/RSAQueryReasoner.scala +++ b/src/main/scala/uk/ac/ox/cs/acqua/reasoner/RSAQueryReasoner.scala @@ -16,6 +16,9 @@ package uk.ac.ox.cs.acqua.reasoner +import java.util.Collection; +import scala.collection.JavaConverters._ + import org.semanticweb.owlapi.model.OWLOntology import uk.ac.ox.cs.rsacomb.RSAOntology import uk.ac.ox.cs.rsacomb.approximation.{Approximation,Lowerbound} @@ -67,12 +70,33 @@ class RSAQueryReasoner(val origin: Ontology) extends QueryReasoner { origin.isRSA } - // TODO: probably need to override `evaluate` on multiple queries - def evaluate(query: QueryRecord): Unit = { - rsa ask query + /** Evaluates a collection of queries. + * + * Uses RSAComb internally to reuse part of the computation of + * multiple calls to [[uk.ac.ox.cs.rsacomb.RSAOntology.ask]]. + * + * TODO: perform logging of answers + */ + override def evaluate(queries: Collection[QueryRecord]): Unit = { + val answers = rsa ask queries + /* Perform logging */ + // Logger write answers + // Logger.generateSimulationScripts(datapath, queries) } - def evaluateUpper(record: QueryRecord): Unit= { - ??? + /** Evaluates a single query. + * + * Uses RSAComb internally to reuse part of the computation of + * multiple calls to [[uk.ac.ox.cs.rsacomb.RSAOntology.ask]]. + * + * TODO: perform logging of answers + */ + def evaluate(query: QueryRecord): Unit = { + val answers = rsa ask query + /* Perform logging */ + // Logger write answers + // Logger.generateSimulationScripts(datapath, queries) } + + def evaluateUpper(record: QueryRecord): Unit= ??? } -- cgit v1.2.3