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 /src/main/scala/rsacomb | |
parent | 9e1549537b22851c360b05460098c9e1cee4dcaa (diff) | |
download | RSAComb-77900dc5a9439336eed37e7b8d6c587d1f9288fc.tar.gz RSAComb-77900dc5a9439336eed37e7b8d6c587d1f9288fc.zip |
Add diagnostic queries along main query
Diffstat (limited to 'src/main/scala/rsacomb')
-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 | } |