diff options
| author | Federico Igne <git@federicoigne.com> | 2021-09-29 15:16:25 +0100 |
|---|---|---|
| committer | Federico Igne <git@federicoigne.com> | 2021-09-29 16:41:57 +0100 |
| commit | b1799a0af7bd243fb24bff66682f6f848557c27d (patch) | |
| tree | 42aecf4aa3e5c6c94993a1afcb94729c664d6b03 | |
| parent | 0f52fea098088d8e90410b97213f60c52407f8ff (diff) | |
| download | RSAComb-b1799a0af7bd243fb24bff66682f6f848557c27d.tar.gz RSAComb-b1799a0af7bd243fb24bff66682f6f848557c27d.zip | |
Add JSON format for CQ answers
| -rw-r--r-- | build.sbt | 3 | ||||
| -rw-r--r-- | project/Dependencies.scala | 2 | ||||
| -rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQuery.scala | 5 | ||||
| -rw-r--r-- | src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQueryAnswers.scala | 20 |
4 files changed, 25 insertions, 5 deletions
| @@ -35,7 +35,8 @@ lazy val root = (project in file(".")) | |||
| 35 | scalatestFlatSpec % Test, | 35 | scalatestFlatSpec % Test, |
| 36 | scalatestShouldMatchers % Test, | 36 | scalatestShouldMatchers % Test, |
| 37 | apibinding, | 37 | apibinding, |
| 38 | graphcore | 38 | graphcore, |
| 39 | ujson | ||
| 39 | ) | 40 | ) |
| 40 | ) | 41 | ) |
| 41 | 42 | ||
diff --git a/project/Dependencies.scala b/project/Dependencies.scala index a185615..2742ace 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala | |||
| @@ -5,6 +5,7 @@ object Dependencies { | |||
| 5 | lazy val scalatestVersion = "3.2.3" | 5 | lazy val scalatestVersion = "3.2.3" |
| 6 | lazy val owlapiVersion = "5.1.17" | 6 | lazy val owlapiVersion = "5.1.17" |
| 7 | lazy val scalagraphVersion = "1.13.2" | 7 | lazy val scalagraphVersion = "1.13.2" |
| 8 | lazy val ujsonVersion = "1.4.1" | ||
| 8 | 9 | ||
| 9 | // Libraries | 10 | // Libraries |
| 10 | val scalatest = "org.scalatest" %% "scalatest" % scalatestVersion | 11 | val scalatest = "org.scalatest" %% "scalatest" % scalatestVersion |
| @@ -15,4 +16,5 @@ object Dependencies { | |||
| 15 | val apibinding = | 16 | val apibinding = |
| 16 | "net.sourceforge.owlapi" % "owlapi-apibinding" % owlapiVersion | 17 | "net.sourceforge.owlapi" % "owlapi-apibinding" % owlapiVersion |
| 17 | val graphcore = "org.scala-graph" %% "graph-core" % scalagraphVersion | 18 | val graphcore = "org.scala-graph" %% "graph-core" % scalagraphVersion |
| 19 | val ujson = "com.lihaoyi" %% "ujson" % ujsonVersion | ||
| 18 | } | 20 | } |
diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQuery.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQuery.scala index 37a21e7..c405008 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQuery.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/sparql/ConjunctiveQuery.scala | |||
| @@ -32,12 +32,14 @@ import uk.ac.ox.cs.rsacomb.util.RDFoxUtil | |||
| 32 | /** Factory for [[uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery]]. */ | 32 | /** Factory for [[uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery]]. */ |
| 33 | object ConjunctiveQuery { | 33 | object ConjunctiveQuery { |
| 34 | 34 | ||
| 35 | private var idCounter: Int = 0; | ||
| 36 | |||
| 35 | /** Creates a new ConjunctiveQuery instance. | 37 | /** Creates a new ConjunctiveQuery instance. |
| 36 | * | 38 | * |
| 37 | * @param query `SelectQuery` instance representing the actual query | 39 | * @param query `SelectQuery` instance representing the actual query |
| 38 | */ | 40 | */ |
| 39 | def apply(query: SelectQuery): ConjunctiveQuery = | 41 | def apply(query: SelectQuery): ConjunctiveQuery = |
| 40 | new ConjunctiveQuery(query) | 42 | new ConjunctiveQuery({ idCounter += 1; idCounter }, query) |
| 41 | 43 | ||
| 42 | /** Creates a new ConjunctiveQuery from a query string | 44 | /** Creates a new ConjunctiveQuery from a query string |
| 43 | * | 45 | * |
| @@ -66,6 +68,7 @@ object ConjunctiveQuery { | |||
| 66 | * `SelectQuery` to be considered a conjunctive query. | 68 | * `SelectQuery` to be considered a conjunctive query. |
| 67 | */ | 69 | */ |
| 68 | class ConjunctiveQuery( | 70 | class ConjunctiveQuery( |
| 71 | val id: Int, | ||
| 69 | query: SelectQuery, | 72 | query: SelectQuery, |
| 70 | val prefixes: Prefixes = new Prefixes() | 73 | val prefixes: Prefixes = new Prefixes() |
| 71 | ) { | 74 | ) { |
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 4166655..3d16351 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 | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | package uk.ac.ox.cs.rsacomb.sparql | 17 | package uk.ac.ox.cs.rsacomb.sparql |
| 18 | 18 | ||
| 19 | import ujson._ | ||
| 19 | import tech.oxfordsemantic.jrdfox.logic.expression.{ | 20 | import tech.oxfordsemantic.jrdfox.logic.expression.{ |
| 20 | IRI, | 21 | IRI, |
| 21 | Literal, | 22 | Literal, |
| @@ -33,19 +34,32 @@ import tech.oxfordsemantic.jrdfox.logic.expression.{ | |||
| 33 | * BCQs, and empty collection represents a ''false'', ''true'' otherwise. | 34 | * BCQs, and empty collection represents a ''false'', ''true'' otherwise. |
| 34 | */ | 35 | */ |
| 35 | class ConjunctiveQueryAnswers( | 36 | class ConjunctiveQueryAnswers( |
| 36 | bcq: Boolean, | 37 | val query: ConjunctiveQuery, |
| 37 | val variables: Seq[Variable], | 38 | val variables: Seq[Variable], |
| 38 | val answers: Seq[(Long, Seq[Resource])] | 39 | val answers: Seq[(Long, Seq[Resource])] |
| 39 | ) { | 40 | ) { |
| 40 | 41 | ||
| 41 | /** Returns number of distinct answers. */ | 42 | /** Returns number of distinct answers. */ |
| 42 | val length: Int = if (bcq) 0 else answers.length | 43 | val length: Int = if (query.bcq) 0 else answers.length |
| 43 | 44 | ||
| 44 | /** Returns number of answers taking into account multiplicity. */ | 45 | /** Returns number of answers taking into account multiplicity. */ |
| 45 | val lengthWithMultiplicity: Long = answers.map(_._1).sum | 46 | val lengthWithMultiplicity: Long = answers.map(_._1).sum |
| 46 | 47 | ||
| 48 | /** Serialise answers as JSON file */ | ||
| 49 | def toJSON(): ujson.Js.Value = { | ||
| 50 | ujson.Obj( | ||
| 51 | "queryID" -> query.id, | ||
| 52 | "queryText" -> query.toString | ||
| 53 | .split('\n') | ||
| 54 | .map(_.trim.filter(_ >= ' ')) | ||
| 55 | .mkString(" "), | ||
| 56 | "answerVariables" -> ujson.Arr(query.answer.map(_.toString())), | ||
| 57 | "answers" -> ujson.Arr(answers.map(_._2.mkString(" ")).sorted) | ||
| 58 | ) | ||
| 59 | } | ||
| 60 | |||
| 47 | override def toString(): String = | 61 | override def toString(): String = |
| 48 | if (bcq) { | 62 | if (query.bcq) { |
| 49 | if (answers.isEmpty) "FALSE" else "TRUE" | 63 | if (answers.isEmpty) "FALSE" else "TRUE" |
| 50 | } else { | 64 | } else { |
| 51 | if (answers.isEmpty) | 65 | if (answers.isEmpty) |
