diff options
| author | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-11-24 11:41:08 +0000 |
|---|---|---|
| committer | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-11-24 11:41:08 +0000 |
| commit | b7d9a8ffc8cc4a8949229b5bd3ada301878633d9 (patch) | |
| tree | 8bf1ea5fcada85028fe754c902906d890546cd60 /src/test/scala/uk | |
| parent | aeb5ad23e5f13952efdeaf4aec2e97a96b469655 (diff) | |
| download | RSAComb-b7d9a8ffc8cc4a8949229b5bd3ada301878633d9.tar.gz RSAComb-b7d9a8ffc8cc4a8949229b5bd3ada301878633d9.zip | |
Rework filtering program generation
Diffstat (limited to 'src/test/scala/uk')
| -rw-r--r-- | src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala | 343 |
1 files changed, 59 insertions, 284 deletions
diff --git a/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala b/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala index e9a20db..71c9a99 100644 --- a/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala +++ b/src/test/scala/uk/ac/ox/cs/rsacomb/FilteringProgramSpecs.scala | |||
| @@ -1,313 +1,88 @@ | |||
| 1 | package rsacomb | 1 | package rsacomb |
| 2 | 2 | ||
| 3 | import java.io.File | ||
| 4 | import java.util.{ArrayList => JList} | ||
| 5 | import org.scalatest.LoneElement | ||
| 6 | import org.scalatest.Inspectors | ||
| 7 | import org.scalatest.flatspec.AnyFlatSpec | 3 | import org.scalatest.flatspec.AnyFlatSpec |
| 8 | import org.scalatest.matchers.should.Matchers | 4 | import org.scalatest.matchers.should.Matchers |
| 9 | 5 | import tech.oxfordsemantic.jrdfox.logic.expression.IRI | |
| 10 | import tech.oxfordsemantic.jrdfox.logic.datalog.TupleTableAtom | ||
| 11 | import tech.oxfordsemantic.jrdfox.logic.expression.{Variable, IRI} | ||
| 12 | import tech.oxfordsemantic.jrdfox.logic.sparql.statement.{Query, SelectQuery} | ||
| 13 | import tech.oxfordsemantic.jrdfox.Prefixes | ||
| 14 | |||
| 15 | import scala.collection.JavaConverters._ | ||
| 16 | |||
| 17 | import uk.ac.ox.cs.rsacomb.FilteringProgram | 6 | import uk.ac.ox.cs.rsacomb.FilteringProgram |
| 18 | import uk.ac.ox.cs.rsacomb.util.RDFoxHelpers | 7 | import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery |
| 19 | 8 | ||
| 20 | object FilteringProgramSpec { | 9 | object FilteringProgramSpec { |
| 21 | 10 | ||
| 22 | val prefixes = new Prefixes() | 11 | val constants = |
| 23 | prefixes.declarePrefix( | 12 | List(IRI.create("_:iri1"), IRI.create("_:iri2"), IRI.create("_:iri3")) |
| 24 | ":", | ||
| 25 | "http://slegger.gitlab.io/slegge-obda/ontology/subsurface-exploration#" | ||
| 26 | ) | ||
| 27 | prefixes.declarePrefix("rdf:", "http://www.w3.org/1999/02/22-rdf-syntax-ns#") | ||
| 28 | prefixes.declarePrefix("rdfs:", "http://www.w3.org/2000/01/rdf-schema#") | ||
| 29 | prefixes.declarePrefix("owl:", "http://www.w3.org/2002/07/owl#") | ||
| 30 | |||
| 31 | // DEBUG: Quick helper functions | ||
| 32 | def v(v: String): Variable = Variable.create(v) | ||
| 33 | def c(c: String): IRI = IRI.create(":" + c) | ||
| 34 | |||
| 35 | // QUERY 0 | ||
| 36 | |||
| 37 | val query0 = RDFoxHelpers | ||
| 38 | .parseSelectQuery(""" | ||
| 39 | SELECT ?subj | ||
| 40 | WHERE { | ||
| 41 | ?subj ?pred ?obj | ||
| 42 | } | ||
| 43 | """, prefixes) | ||
| 44 | .get | ||
| 45 | |||
| 46 | // val query0 = Query.create( | ||
| 47 | // QueryType.SELECT, | ||
| 48 | // false, | ||
| 49 | // List(v("subj")).asJava, | ||
| 50 | // Atom.rdf(v("subj"), v("pred"), v("obj")) | ||
| 51 | // ) | ||
| 52 | |||
| 53 | // QUERY 1 | ||
| 54 | |||
| 55 | val query1 = RDFoxHelpers | ||
| 56 | .parseSelectQuery(""" | ||
| 57 | SELECT * | ||
| 58 | WHERE { | ||
| 59 | ?w a :Wellbore | ||
| 60 | } | ||
| 61 | """, prefixes) | ||
| 62 | .get | ||
| 63 | |||
| 64 | // val query1 = Query.create( | ||
| 65 | // QueryType.SELECT, | ||
| 66 | // false, | ||
| 67 | // List(v("w")).asJava, | ||
| 68 | // Atom.rdf(v("w"), IRI.RDF_TYPE, c("Wellbore")) | ||
| 69 | // ) | ||
| 70 | |||
| 71 | // QUERY 2 | ||
| 72 | |||
| 73 | val query2 = RDFoxHelpers | ||
| 74 | .parseSelectQuery( | ||
| 75 | """ | ||
| 76 | SELECT * | ||
| 77 | WHERE { | ||
| 78 | ?w a :Wellbore ; | ||
| 79 | :wellboreDocument ?doc . | ||
| 80 | ?doc :hasURL ?document_hyperlink | ||
| 81 | } | ||
| 82 | """, | ||
| 83 | prefixes | ||
| 84 | ) | ||
| 85 | .get | ||
| 86 | 13 | ||
| 87 | // val query2 = Query.create( | 14 | val cq0 = """ |
| 88 | // QueryType.SELECT, | 15 | PREFIX : <http://example.com/rsa_example.owl#> |
| 89 | // false, | ||
| 90 | // List(v("w"), v("doc"), v("document_hyperlink")).asJava, | ||
| 91 | // Conjunction.create( | ||
| 92 | // Atom.rdf(v("w"), IRI.RDF_TYPE, c("Wellbore")), | ||
| 93 | // Atom.rdf(v("w"), c("wellboreDocument"), v("doc")), | ||
| 94 | // Atom.rdf(v("doc"), c("hasURL"), v("document_hyperlink")) | ||
| 95 | // ) | ||
| 96 | // ) | ||
| 97 | 16 | ||
| 98 | // QUERY 3 | 17 | SELECT ?X |
| 99 | |||
| 100 | val query3 = RDFoxHelpers | ||
| 101 | .parseSelectQuery( | ||
| 102 | """ | ||
| 103 | SELECT ?wellbore ?formation_pressure | ||
| 104 | WHERE { | 18 | WHERE { |
| 105 | ?w a :Wellbore ; | 19 | ?X a :D ; |
| 106 | :name ?wellbore ; | 20 | :R ?Y . |
| 107 | :hasFormationPressure ?fp . | 21 | ?Y :S ?Z . |
| 108 | ?fp :valueInStandardUnit ?formation_pressure | 22 | ?Z a :D . |
| 109 | } | 23 | } |
| 110 | """, | 24 | """ |
| 111 | prefixes | ||
| 112 | ) | ||
| 113 | .get | ||
| 114 | |||
| 115 | // val query3 = Query.create( | ||
| 116 | // QueryType.SELECT, | ||
| 117 | // false, | ||
| 118 | // List(v("wellbore"), v("formation_pressure")).asJava, | ||
| 119 | // Conjunction.create( | ||
| 120 | // Atom.rdf(v("w"), IRI.RDF_TYPE, c("Wellbore")), | ||
| 121 | // Atom.rdf(v("w"), c("name"), v("wellbore")), | ||
| 122 | // Atom.rdf(v("w"), c("hasFormationPressure"), v("fp")), | ||
| 123 | // Atom.rdf(v("fp"), c("valueInStandardUnit"), v("formation_pressure")) | ||
| 124 | // ) | ||
| 125 | // ) | ||
| 126 | 25 | ||
| 127 | // QUERY 4 | 26 | val cq1 = """ |
| 27 | PREFIX : <http://example.com/rsa_example.owl#> | ||
| 128 | 28 | ||
| 129 | val query4 = RDFoxHelpers | 29 | SELECT * |
| 130 | .parseSelectQuery( | ||
| 131 | """ | ||
| 132 | SELECT * | ||
| 133 | WHERE { | 30 | WHERE { |
| 134 | ?w a :Wellbore ; | 31 | ?X a :D ; |
| 135 | :hasGeochemicalMeasurement ?measurement . | 32 | :R ?Y . |
| 136 | ?measurement :cgType ?cgtype ; | 33 | ?Y :S ?Z . |
| 137 | :peakName ?peakType ; | 34 | ?Z a :D . |
| 138 | :peakHeight ?peak_height ; | ||
| 139 | :peakAmount ?peak_amount | ||
| 140 | } | 35 | } |
| 141 | """, | 36 | """ |
| 142 | prefixes | ||
| 143 | ) | ||
| 144 | .get | ||
| 145 | 37 | ||
| 146 | // val query4 = Query.create( | 38 | val cq2 = """ |
| 147 | // QueryType.SELECT, | 39 | PREFIX : <http://example.com/rsa_example.owl#> |
| 148 | // false, | ||
| 149 | // List( | ||
| 150 | // v("w"), | ||
| 151 | // v("measurement"), | ||
| 152 | // v("cgtype"), | ||
| 153 | // v("peakType"), | ||
| 154 | // v("peak_height"), | ||
| 155 | // v("peak_amount") | ||
| 156 | // ).asJava, | ||
| 157 | // Conjunction.create( | ||
| 158 | // Atom.rdf(v("w"), IRI.RDF_TYPE, c("Wellbore")), | ||
| 159 | // Atom.rdf(v("w"), c("hasGeochemicalMeasurement"), v("measurement")), | ||
| 160 | // Atom.rdf(v("measurement"), c("cgType"), v("cgtype")), | ||
| 161 | // Atom.rdf(v("measurement"), c("peakName"), v("peakType")), | ||
| 162 | // Atom.rdf(v("measurement"), c("peakHeight"), v("peak_height")), | ||
| 163 | // Atom.rdf(v("measurement"), c("peakAmount"), v("peak_amount")) | ||
| 164 | // ) | ||
| 165 | // ) | ||
| 166 | 40 | ||
| 167 | // QUERY 5 | 41 | SELECT ?X |
| 168 | |||
| 169 | val query5 = RDFoxHelpers | ||
| 170 | .parseSelectQuery( | ||
| 171 | """ | ||
| 172 | SELECT ?wellbore ?unit_name ?discovery | ||
| 173 | WHERE { | 42 | WHERE { |
| 174 | ?w a :Wellbore ; | 43 | ?X a :D ; |
| 175 | :name ?wellbore ; | 44 | :R ?Y . |
| 176 | :hasWellboreInterval ?c_int ; | 45 | ?Y :S ?Z . |
| 177 | :hasWellboreInterval ?f_int . | 46 | ?Y :T ?W . |
| 178 | ?c_int :hasUnit ?c_unit . | 47 | ?Z a :D . |
| 179 | ?c_unit :name ?unit_name . | 48 | ?W a :D |
| 180 | ?f_int a :FluidZone ; | ||
| 181 | :name ?discovery ; | ||
| 182 | :overlapsWellboreInterval ?c_int | ||
| 183 | } | 49 | } |
| 184 | """, | 50 | """ |
| 185 | prefixes | ||
| 186 | ) | ||
| 187 | .get | ||
| 188 | |||
| 189 | // val query5 = Query.create( | ||
| 190 | // QueryType.SELECT, | ||
| 191 | // false, | ||
| 192 | // List(v("wellbore"), v("unit_name"), v("discovery")).asJava, | ||
| 193 | // Conjunction.create( | ||
| 194 | // Atom.rdf(v("w"), IRI.RDF_TYPE, c("Wellbore")), | ||
| 195 | // Atom.rdf(v("w"), c("name"), v("wellbore")), | ||
| 196 | // Atom.rdf(v("w"), c("hasWellboreInterval"), v("c_int")), | ||
| 197 | // Atom.rdf(v("w"), c("hasWellboreInterval"), v("f_int")), | ||
| 198 | // Atom.rdf(v("c_int"), c("hasUnit"), v("c_unit")), | ||
| 199 | // Atom.rdf(v("c_unit"), c("name"), v("unit_name")), | ||
| 200 | // Atom.rdf(v("f_int"), IRI.RDF_TYPE, c("FluidZone")), | ||
| 201 | // Atom.rdf(v("f_int"), c("name"), v("discovery")), | ||
| 202 | // Atom.rdf(v("f_int"), c("overlapsWellboreInterval"), v("c_int")) | ||
| 203 | // ) | ||
| 204 | // ) | ||
| 205 | 51 | ||
| 206 | // QUERY 6 | 52 | val bcq0 = """ |
| 53 | PREFIX : <http://example.com/rsa_example.owl#> | ||
| 207 | 54 | ||
| 208 | val query6 = RDFoxHelpers | 55 | ASK { |
| 209 | .parseSelectQuery( | 56 | ?X a :D ; |
| 210 | """ | 57 | :R ?Y . |
| 211 | SELECT DISTINCT ?wellbore ?content | 58 | ?Y :S ?Z . |
| 212 | WHERE { | 59 | ?Z a :D . |
| 213 | ?w a :Wellbore ; | ||
| 214 | :name ?wellbore ; | ||
| 215 | :hasWellboreInterval ?int . | ||
| 216 | ?int a :FluidZone ; | ||
| 217 | :fluidZoneContent ?content | ||
| 218 | } | 60 | } |
| 219 | """, | 61 | """ |
| 220 | prefixes | ||
| 221 | ) | ||
| 222 | .get | ||
| 223 | |||
| 224 | // val query6 = Query.create( | ||
| 225 | // QueryType.SELECT, | ||
| 226 | // true, | ||
| 227 | // List(v("wellbore"), v("content")).asJava, | ||
| 228 | // Conjunction.create( | ||
| 229 | // Atom.rdf(v("w"), IRI.RDF_TYPE, c("Wellbore")), | ||
| 230 | // Atom.rdf(v("w"), c("name"), v("wellbore")), | ||
| 231 | // Atom.rdf(v("w"), c("hasWellboreInterval"), v("int")), | ||
| 232 | // Atom.rdf(v("int"), IRI.RDF_TYPE, c("FluidZone")), | ||
| 233 | // Atom.rdf(v("int"), c("fluidZoneContent"), v("content")) | ||
| 234 | // ) | ||
| 235 | // ) | ||
| 236 | |||
| 237 | // QUERY 7 | ||
| 238 | |||
| 239 | val query7 = RDFoxHelpers | ||
| 240 | .parseSelectQuery( | ||
| 241 | """ | ||
| 242 | SELECT ?wName ?sample ?porosity ?top_depth_md ?bot_depth_md | ||
| 243 | WHERE { | ||
| 244 | ?w a :Wellbore ; | ||
| 245 | :name ?wName ; | ||
| 246 | :hasWellboreInterval ?z . | ||
| 247 | ?z :hasUnit ?u . | ||
| 248 | ?u :name ?strat_unit_name . | ||
| 249 | ?wellbore :hasWellboreInterval ?cored_int . | ||
| 250 | ?c :extractedFrom ?cored_int ; | ||
| 251 | :hasCoreSample ?sample . | ||
| 252 | ?sample :hasDepth ?sample_depth . | ||
| 253 | ?sample_depth | ||
| 254 | :inWellboreInterval ?z . | ||
| 255 | ?sample :hasPorosity ?p . | ||
| 256 | ?p :valueInStandardUnit ?porosity . | ||
| 257 | ?z :hasTopDepth ?top . | ||
| 258 | ?top a :MeasuredDepth ; | ||
| 259 | :valueInStandardUnit ?top_depth_md . | ||
| 260 | ?z :hasBottomDepth ?bot . | ||
| 261 | ?bot a :MeasuredDepth ; | ||
| 262 | :valueInStandardUnit ?bot_depth_md | ||
| 263 | } | ||
| 264 | """, | ||
| 265 | prefixes | ||
| 266 | ) | ||
| 267 | .get | ||
| 268 | |||
| 269 | // val query7 = Query.create( | ||
| 270 | // QueryType.SELECT, | ||
| 271 | // false, | ||
| 272 | // List( | ||
| 273 | // v("wName"), | ||
| 274 | // v("sample"), | ||
| 275 | // v("porosity"), | ||
| 276 | // v("top_depth_md"), | ||
| 277 | // v("bot_depth_md") | ||
| 278 | // ).asJava, | ||
| 279 | // Conjunction.create( | ||
| 280 | // Atom.rdf(v("w"), IRI.RDF_TYPE, c("Wellbore")), | ||
| 281 | // Atom.rdf(v("w"), c("name"), v("wName")), | ||
| 282 | // Atom.rdf(v("w"), c("hasWellboreInterval"), v("z")), | ||
| 283 | // Atom.rdf(v("z"), c("hasUnit"), v("u")), | ||
| 284 | // Atom.rdf(v("u"), c("name"), v("strat_unit_name")), | ||
| 285 | // Atom.rdf(v("wellbore"), c("hasWellboreInterval"), v("cored_int")), | ||
| 286 | // Atom.rdf(v("c"), c("extractedFrom"), v("cored_int")), | ||
| 287 | // Atom.rdf(v("c"), c("hasCoreSample"), v("sample")), | ||
| 288 | // Atom.rdf(v("sample"), c("hasDepth"), v("sample_depth")), | ||
| 289 | // Atom.rdf(v("sample_depth"), c("inWellboreInterval"), v("z")), | ||
| 290 | // Atom.rdf(v("sample"), c("hasPorosity"), v("p")), | ||
| 291 | // Atom.rdf(v("p"), c("valueInStandardUnit"), v("porosity")), | ||
| 292 | // Atom.rdf(v("z"), c("hasTopDepth"), v("top")), | ||
| 293 | // Atom.rdf(v("top"), IRI.RDF_TYPE, c("MeasuredDepth")), | ||
| 294 | // Atom.rdf(v("top"), c("valueInStandardUnit"), v("top_depth_md")), | ||
| 295 | // Atom.rdf(v("z"), c("hasBottomDepth"), v("bot")), | ||
| 296 | // Atom.rdf(v("bot"), IRI.RDF_TYPE, c("MeasuredDepth")), | ||
| 297 | // Atom.rdf(v("bot"), c("valueInStandardUnit"), v("bot_depth_md")) | ||
| 298 | // ) | ||
| 299 | // ) | ||
| 300 | |||
| 301 | val queries = | ||
| 302 | List(query0, query1, query2, query3, query4, query5, query6, query7) | ||
| 303 | } | 62 | } |
| 304 | 63 | ||
| 305 | class FilteringProgramSpec | 64 | class FilteringProgramSpec extends AnyFlatSpec with Matchers { |
| 306 | extends AnyFlatSpec | ||
| 307 | with Matchers | ||
| 308 | with LoneElement | ||
| 309 | with Inspectors { | ||
| 310 | 65 | ||
| 311 | import FilteringProgramSpec._ | 66 | import FilteringProgramSpec._ |
| 312 | 67 | ||
| 68 | "CQ 0" should "generate 30 rules" in { | ||
| 69 | val cq = ConjunctiveQuery(cq0).get | ||
| 70 | FilteringProgram(cq, constants).rules should have length 30 | ||
| 71 | } | ||
| 72 | |||
| 73 | "CQ 1" should "generate 15 rules" in { | ||
| 74 | val cq = ConjunctiveQuery(cq1).get | ||
| 75 | FilteringProgram(cq, List()).rules should have length 15 | ||
| 76 | } | ||
| 77 | |||
| 78 | "CQ 2" should "generate 51 rules" in { | ||
| 79 | val cq = ConjunctiveQuery(cq2).get | ||
| 80 | FilteringProgram(cq, List()).rules should have length 51 | ||
| 81 | } | ||
| 82 | |||
| 83 | "BCQ 0" should "generate 46 rules" in { | ||
| 84 | val cq = ConjunctiveQuery(bcq0).get | ||
| 85 | FilteringProgram(cq, constants).rules should have length 46 | ||
| 86 | } | ||
| 87 | |||
| 313 | } | 88 | } |
