diff options
| author | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-11-13 18:58:44 +0000 |
|---|---|---|
| committer | Federico Igne <federico.igne@cs.ox.ac.uk> | 2020-11-13 18:58:44 +0000 |
| commit | 77900dc5a9439336eed37e7b8d6c587d1f9288fc (patch) | |
| tree | 26e690b053ac032538a7d2b53608f8269c8b17b8 | |
| parent | 9e1549537b22851c360b05460098c9e1cee4dcaa (diff) | |
| download | RSAComb-77900dc5a9439336eed37e7b8d6c587d1f9288fc.tar.gz RSAComb-77900dc5a9439336eed37e7b8d6c587d1f9288fc.zip | |
Add diagnostic queries along main query
| -rw-r--r-- | src/main/scala/rsacomb/Main.scala | 109 |
1 files changed, 83 insertions, 26 deletions
diff --git a/src/main/scala/rsacomb/Main.scala b/src/main/scala/rsacomb/Main.scala index b893c4f..39040fc 100644 --- a/src/main/scala/rsacomb/Main.scala +++ b/src/main/scala/rsacomb/Main.scala | |||
| @@ -6,6 +6,7 @@ import java.util.HashMap | |||
| 6 | import scala.collection.JavaConverters._ | 6 | import scala.collection.JavaConverters._ |
| 7 | 7 | ||
| 8 | import tech.oxfordsemantic.jrdfox.client.UpdateType | 8 | import tech.oxfordsemantic.jrdfox.client.UpdateType |
| 9 | import tech.oxfordsemantic.jrdfox.logic.sparql.statement.SelectQuery | ||
| 9 | 10 | ||
| 10 | /* Local imports */ | 11 | /* Local imports */ |
| 11 | import rsacomb.RSA._ | 12 | import rsacomb.RSA._ |
| @@ -56,12 +57,12 @@ object RSAComb extends App { | |||
| 56 | /* Load query */ | 57 | /* Load query */ |
| 57 | val query = RDFoxUtil.parseQuery( | 58 | val query = RDFoxUtil.parseQuery( |
| 58 | """ | 59 | """ |
| 59 | SELECT ?uno | 60 | SELECT ?X |
| 60 | WHERE { | 61 | WHERE { |
| 61 | ?uno a :D ; | 62 | ?X a :D ; |
| 62 | :R ?due . | 63 | :R ?Y . |
| 63 | ?due :S ?tre . | 64 | ?Y :S ?Z . |
| 64 | ?tre a :D . | 65 | ?Z a :D . |
| 65 | } | 66 | } |
| 66 | """ | 67 | """ |
| 67 | ) | 68 | ) |
| @@ -77,36 +78,92 @@ object RSAComb extends App { | |||
| 77 | val filter = ontology.filteringProgram(query) | 78 | val filter = ontology.filteringProgram(query) |
| 78 | 79 | ||
| 79 | { | 80 | { |
| 81 | println("\nCanonical Model rules:") | ||
| 82 | canon.rules.foreach(println) | ||
| 83 | println("\nFiltering rules") | ||
| 80 | filter.rules.foreach(println) | 84 | filter.rules.foreach(println) |
| 85 | println("\nQuery") | ||
| 86 | println(query) | ||
| 81 | } | 87 | } |
| 82 | 88 | ||
| 83 | // Import relevant data | 89 | // Add canonical model and filtering rules |
| 84 | data.importData(UpdateType.ADDITION, RSA.Prefixes, ":a a :A .") | ||
| 85 | data.addRules(canon.rules.asJava) | 90 | data.addRules(canon.rules.asJava) |
| 86 | data.addRules(filter.rules.asJava) | 91 | data.addRules(filter.rules.asJava) |
| 87 | 92 | ||
| 88 | // Collect answers to query | 93 | def retrieveInstances(pred: String, arity: Int): Unit = { |
| 89 | for ((v, i) <- filter.variables.view.zipWithIndex) { | 94 | // Build query |
| 90 | println(s"Variable $i:") | 95 | var query = "SELECT" |
| 91 | val query = s"SELECT ?X ?Y WHERE { ?X internal:Ans_$i ?Y }" | 96 | for (i <- 0 until arity) { |
| 92 | val cursor = | 97 | query ++= s" ?X$i" |
| 93 | data.createCursor( | ||
| 94 | RSA.Prefixes, | ||
| 95 | query, | ||
| 96 | new HashMap[String, String]() | ||
| 97 | ); | ||
| 98 | var mul = cursor.open() | ||
| 99 | while (mul > 0) { | ||
| 100 | printf( | ||
| 101 | "Ans_%d(%s,%s)", | ||
| 102 | i, | ||
| 103 | cursor.getResource(0), | ||
| 104 | cursor.getResource(1) | ||
| 105 | ) | ||
| 106 | mul = cursor.advance() | ||
| 107 | } | 98 | } |
| 99 | query ++= " WHERE {" | ||
| 100 | for (i <- 0 until arity) { | ||
| 101 | query ++= s" ?S internal:${pred}_$i ?X$i ." | ||
| 102 | } | ||
| 103 | query ++= " }" | ||
| 104 | // Collect answers | ||
| 105 | RDFoxUtil.submitQuery( | ||
| 106 | data, | ||
| 107 | RSA.Prefixes, | ||
| 108 | query, | ||
| 109 | arity | ||
| 110 | ) | ||
| 108 | } | 111 | } |
| 109 | 112 | ||
| 113 | // Retrieve answers | ||
| 114 | println("\nAnswers:") | ||
| 115 | retrieveInstances("ANS", filter.answer.length) | ||
| 116 | |||
| 117 | /* DEBUG: adding additional checks | ||
| 118 | */ | ||
| 119 | println("\nIndividuals:") | ||
| 120 | ontology.individuals.foreach(println) | ||
| 121 | |||
| 122 | println("\nThings:") | ||
| 123 | RDFoxUtil.submitQuery( | ||
| 124 | data, | ||
| 125 | RSA.Prefixes, | ||
| 126 | "SELECT ?X { ?X a owl:Thing }", | ||
| 127 | 1 | ||
| 128 | ) | ||
| 129 | |||
| 130 | println("\nNIs:") | ||
| 131 | RDFoxUtil.submitQuery( | ||
| 132 | data, | ||
| 133 | RSA.Prefixes, | ||
| 134 | "SELECT ?X { ?X a internal:NI }", | ||
| 135 | 1 | ||
| 136 | ) | ||
| 137 | |||
| 138 | // ID instances | ||
| 139 | println("\nID instances:") | ||
| 140 | retrieveInstances("ID", filter.variables.length + 2) | ||
| 141 | |||
| 142 | println("\nSameAs instances:") | ||
| 143 | RDFoxUtil.submitQuery( | ||
| 144 | data, | ||
| 145 | RSA.Prefixes, | ||
| 146 | "SELECT ?X ?Y { ?X owl:sameAs ?Y }", | ||
| 147 | 2 | ||
| 148 | ) | ||
| 149 | |||
| 150 | // Unfiltered answers | ||
| 151 | println("\nPossible answers:") | ||
| 152 | retrieveInstances("QM", filter.variables.length) | ||
| 153 | |||
| 154 | // Cycle detected | ||
| 155 | println("\nCycle detection:") | ||
| 156 | retrieveInstances("AQ_f", filter.variables.length + 2) | ||
| 157 | retrieveInstances("AQ_b", filter.variables.length + 2) | ||
| 158 | |||
| 159 | // Forks detected | ||
| 160 | println("\nForks:") | ||
| 161 | retrieveInstances("FK", filter.variables.length) | ||
| 162 | |||
| 163 | // Spurious answers | ||
| 164 | println("\nSpurious answers") | ||
| 165 | retrieveInstances("SP", filter.variables.length) | ||
| 166 | |||
| 110 | // Close connection to RDFox | 167 | // Close connection to RDFox |
| 111 | RDFoxUtil.closeConnection(server, data) | 168 | RDFoxUtil.closeConnection(server, data) |
| 112 | } | 169 | } |
