comparison service/mqtt_to_rdf/inference_test.py @ 1651:20474ad4968e

WIP - functions are broken as i move most layers to work in Chunks not Triples A Chunk is a Triple plus any rdf lists.
author drewp@bigasterisk.com
date Sat, 18 Sep 2021 23:57:20 -0700
parents af136cf6dd26
children 274bb6c04627
comparison
equal deleted inserted replaced
1650:2061df259224 1651:20474ad4968e
165 self.assertNotEqual(ruleNode, stmt0Node) 165 self.assertNotEqual(ruleNode, stmt0Node)
166 self.assertNotEqual(ruleNode, stmt1Node) 166 self.assertNotEqual(ruleNode, stmt1Node)
167 self.assertNotEqual(stmt0Node, stmt1Node) 167 self.assertNotEqual(stmt0Node, stmt1Node)
168 168
169 169
170 class TestSelfFulfillingRule(WithGraphEqual): 170 # class TestSelfFulfillingRule(WithGraphEqual):
171 171
172 def test1(self): 172 # def test1(self):
173 inf = makeInferenceWithRules("{ } => { :new :stmt :x } .") 173 # inf = makeInferenceWithRules("{ } => { :new :stmt :x } .")
174 self.assertGraphEqual(inf.infer(N3("")), N3(":new :stmt :x .")) 174 # self.assertGraphEqual(inf.infer(N3("")), N3(":new :stmt :x ."))
175 self.assertGraphEqual(inf.infer(N3(":any :any :any .")), N3(":new :stmt :x .")) 175 # self.assertGraphEqual(inf.infer(N3(":any :any :any .")), N3(":new :stmt :x ."))
176 176
177 def test2(self): 177 # def test2(self):
178 inf = makeInferenceWithRules("{ (2) math:sum ?x } => { :new :stmt ?x } .") 178 # inf = makeInferenceWithRules("{ (2) math:sum ?x } => { :new :stmt ?x } .")
179 self.assertGraphEqual(inf.infer(N3("")), N3(":new :stmt 2 .")) 179 # self.assertGraphEqual(inf.infer(N3("")), N3(":new :stmt 2 ."))
180 180
181 181
182 # @unittest.skip("too hard for now") 182 # @unittest.skip("too hard for now")
183 # def test3(self): 183 # def test3(self):
184 # inf = makeInferenceWithRules("{ :a :b :c . :a :b ?x . } => { :new :stmt ?x } .") 184 # inf = makeInferenceWithRules("{ :a :b :c . :a :b ?x . } => { :new :stmt ?x } .")
185 # self.assertGraphEqual(inf.infer(N3("")), N3(":new :stmt :c .")) 185 # self.assertGraphEqual(inf.infer(N3("")), N3(":new :stmt :c ."))
186 186
187 187
188 class TestInferenceWithMathFunctions(WithGraphEqual): 188 # class TestInferenceWithMathFunctions(WithGraphEqual):
189 189
190 def testBoolFilter(self): 190 # def testBoolFilter(self):
191 inf = makeInferenceWithRules("{ :a :b ?x . ?x math:greaterThan 5 } => { :new :stmt ?x } .") 191 # inf = makeInferenceWithRules("{ :a :b ?x . ?x math:greaterThan 5 } => { :new :stmt ?x } .")
192 self.assertGraphEqual(inf.infer(N3(":a :b 3 .")), N3("")) 192 # self.assertGraphEqual(inf.infer(N3(":a :b 3 .")), N3(""))
193 self.assertGraphEqual(inf.infer(N3(":a :b 5 .")), N3("")) 193 # self.assertGraphEqual(inf.infer(N3(":a :b 5 .")), N3(""))
194 self.assertGraphEqual(inf.infer(N3(":a :b 6 .")), N3(":new :stmt 6 .")) 194 # self.assertGraphEqual(inf.infer(N3(":a :b 6 .")), N3(":new :stmt 6 ."))
195 195
196 def testNonFiringMathRule(self): 196 # def testNonFiringMathRule(self):
197 inf = makeInferenceWithRules("{ :a :b ?x . (?x 1) math:sum ?y } => { :new :stmt ?y } .") 197 # inf = makeInferenceWithRules("{ :a :b ?x . (?x 1) math:sum ?y } => { :new :stmt ?y } .")
198 self.assertGraphEqual(inf.infer(N3("")), N3("")) 198 # self.assertGraphEqual(inf.infer(N3("")), N3(""))
199 199
200 def testStatementGeneratingRule(self): 200 # def testStatementGeneratingRule(self):
201 inf = makeInferenceWithRules("{ :a :b ?x . (?x) math:sum ?y } => { :new :stmt ?y } .") 201 # inf = makeInferenceWithRules("{ :a :b ?x . (?x) math:sum ?y } => { :new :stmt ?y } .")
202 self.assertGraphEqual(inf.infer(N3(":a :b 3 .")), N3(":new :stmt 3 .")) 202 # self.assertGraphEqual(inf.infer(N3(":a :b 3 .")), N3(":new :stmt 3 ."))
203 203
204 def test2Operands(self): 204 # def test2Operands(self):
205 inf = makeInferenceWithRules("{ :a :b ?x . (?x 1) math:sum ?y } => { :new :stmt ?y } .") 205 # inf = makeInferenceWithRules("{ :a :b ?x . (?x 1) math:sum ?y } => { :new :stmt ?y } .")
206 self.assertGraphEqual(inf.infer(N3(":a :b 3 .")), N3(":new :stmt 4 .")) 206 # self.assertGraphEqual(inf.infer(N3(":a :b 3 .")), N3(":new :stmt 4 ."))
207 207
208 def test3Operands(self): 208 # def test3Operands(self):
209 inf = makeInferenceWithRules("{ :a :b ?x . (2 ?x 2) math:sum ?y } => { :new :stmt ?y } .") 209 # inf = makeInferenceWithRules("{ :a :b ?x . (2 ?x 2) math:sum ?y } => { :new :stmt ?y } .")
210 self.assertGraphEqual(inf.infer(N3(":a :b 2 .")), N3(":new :stmt 6 .")) 210 # self.assertGraphEqual(inf.infer(N3(":a :b 2 .")), N3(":new :stmt 6 ."))
211 211
212 def test0Operands(self): 212 # def test0Operands(self):
213 inf = makeInferenceWithRules("{ :a :b ?x . () math:sum ?y } => { :new :stmt ?y } .") 213 # inf = makeInferenceWithRules("{ :a :b ?x . () math:sum ?y } => { :new :stmt ?y } .")
214 self.assertGraphEqual(inf.infer(N3(":a :b 2 .")), N3(":new :stmt 0 .")) 214 # self.assertGraphEqual(inf.infer(N3(":a :b 2 .")), N3(":new :stmt 0 ."))
215 215
216 216
217 class TestInferenceWithCustomFunctions(WithGraphEqual): 217 # class TestInferenceWithCustomFunctions(WithGraphEqual):
218 218
219 def testAsFarenheit(self): 219 # def testAsFarenheit(self):
220 inf = makeInferenceWithRules("{ :a :b ?x . ?x room:asFarenheit ?f } => { :new :stmt ?f } .") 220 # inf = makeInferenceWithRules("{ :a :b ?x . ?x room:asFarenheit ?f } => { :new :stmt ?f } .")
221 self.assertGraphEqual(inf.infer(N3(":a :b 12 .")), N3(":new :stmt 53.6 .")) 221 # self.assertGraphEqual(inf.infer(N3(":a :b 12 .")), N3(":new :stmt 53.6 ."))
222 222
223 223
224 class TestUseCases(WithGraphEqual): 224 # class TestUseCases(WithGraphEqual):
225 225
226 def testSimpleTopic(self): 226 # def testSimpleTopic(self):
227 inf = makeInferenceWithRules(''' 227 # inf = makeInferenceWithRules('''
228 { ?msg :body "online" . } => { ?msg :onlineTerm :Online . } . 228 # { ?msg :body "online" . } => { ?msg :onlineTerm :Online . } .
229 { ?msg :body "offline" . } => { ?msg :onlineTerm :Offline . } . 229 # { ?msg :body "offline" . } => { ?msg :onlineTerm :Offline . } .
230 230
231 { 231 # {
232 ?msg a :MqttMessage ; 232 # ?msg a :MqttMessage ;
233 :topic :foo; 233 # :topic :foo;
234 :onlineTerm ?onlineness . } => { 234 # :onlineTerm ?onlineness . } => {
235 :frontDoorLockStatus :connectedStatus ?onlineness . 235 # :frontDoorLockStatus :connectedStatus ?onlineness .
236 } . 236 # } .
237 ''') 237 # ''')
238 238
239 out = inf.infer(N3('[] a :MqttMessage ; :body "online" ; :topic :foo .')) 239 # out = inf.infer(N3('[] a :MqttMessage ; :body "online" ; :topic :foo .'))
240 self.assertIn((ROOM['frontDoorLockStatus'], ROOM['connectedStatus'], ROOM['Online']), out) 240 # self.assertIn((ROOM['frontDoorLockStatus'], ROOM['connectedStatus'], ROOM['Online']), out)
241 241
242 def testTopicIsList(self): 242 # def testTopicIsList(self):
243 inf = makeInferenceWithRules(''' 243 # inf = makeInferenceWithRules('''
244 { ?msg :body "online" . } => { ?msg :onlineTerm :Online . } . 244 # { ?msg :body "online" . } => { ?msg :onlineTerm :Online . } .
245 { ?msg :body "offline" . } => { ?msg :onlineTerm :Offline . } . 245 # { ?msg :body "offline" . } => { ?msg :onlineTerm :Offline . } .
246 246
247 { 247 # {
248 ?msg a :MqttMessage ; 248 # ?msg a :MqttMessage ;
249 :topic ( "frontdoorlock" "status" ); 249 # :topic ( "frontdoorlock" "status" );
250 :onlineTerm ?onlineness . } => { 250 # :onlineTerm ?onlineness . } => {
251 :frontDoorLockStatus :connectedStatus ?onlineness . 251 # :frontDoorLockStatus :connectedStatus ?onlineness .
252 } . 252 # } .
253 ''') 253 # ''')
254 254
255 out = inf.infer(N3('[] a :MqttMessage ; :body "online" ; :topic ( "frontdoorlock" "status" ) .')) 255 # out = inf.infer(N3('[] a :MqttMessage ; :body "online" ; :topic ( "frontdoorlock" "status" ) .'))
256 self.assertIn((ROOM['frontDoorLockStatus'], ROOM['connectedStatus'], ROOM['Online']), out) 256 # self.assertIn((ROOM['frontDoorLockStatus'], ROOM['connectedStatus'], ROOM['Online']), out)
257 257
258 def testPerformance0(self): 258 # def testPerformance0(self):
259 inf = makeInferenceWithRules(''' 259 # inf = makeInferenceWithRules('''
260 { 260 # {
261 ?msg a :MqttMessage; 261 # ?msg a :MqttMessage;
262 :topic :topic1; 262 # :topic :topic1;
263 :bodyFloat ?valueC . 263 # :bodyFloat ?valueC .
264 ?valueC math:greaterThan -999 . 264 # ?valueC math:greaterThan -999 .
265 ?valueC room:asFarenheit ?valueF . 265 # ?valueC room:asFarenheit ?valueF .
266 } => { 266 # } => {
267 :airQualityIndoorTemperature :temperatureF ?valueF . 267 # :airQualityIndoorTemperature :temperatureF ?valueF .
268 } . 268 # } .
269 ''') 269 # ''')
270 out = inf.infer( 270 # out = inf.infer(
271 N3(''' 271 # N3('''
272 <urn:uuid:c6e1d92c-0ee1-11ec-bdbd-2a42c4691e9a> a :MqttMessage ; 272 # <urn:uuid:c6e1d92c-0ee1-11ec-bdbd-2a42c4691e9a> a :MqttMessage ;
273 :body "23.9" ; 273 # :body "23.9" ;
274 :bodyFloat 2.39e+01 ; 274 # :bodyFloat 2.39e+01 ;
275 :topic :topic1 . 275 # :topic :topic1 .
276 ''')) 276 # '''))
277 277
278 vlit = cast(Literal, out.value(ROOM['airQualityIndoorTemperature'], ROOM['temperatureF'])) 278 # vlit = cast(Literal, out.value(ROOM['airQualityIndoorTemperature'], ROOM['temperatureF']))
279 valueF = cast(Decimal, vlit.toPython()) 279 # valueF = cast(Decimal, vlit.toPython())
280 self.assertAlmostEqual(float(valueF), 75.02) 280 # self.assertAlmostEqual(float(valueF), 75.02)
281 281
282 def testPerformance1(self): 282 # def testPerformance1(self):
283 inf = makeInferenceWithRules(''' 283 # inf = makeInferenceWithRules('''
284 { 284 # {
285 ?msg a :MqttMessage; 285 # ?msg a :MqttMessage;
286 :topic ( "air_quality_indoor" "sensor" "bme280_temperature" "state" ); 286 # :topic ( "air_quality_indoor" "sensor" "bme280_temperature" "state" );
287 :bodyFloat ?valueC . 287 # :bodyFloat ?valueC .
288 ?valueC math:greaterThan -999 . 288 # ?valueC math:greaterThan -999 .
289 ?valueC room:asFarenheit ?valueF . 289 # ?valueC room:asFarenheit ?valueF .
290 } => { 290 # } => {
291 :airQualityIndoorTemperature :temperatureF ?valueF . 291 # :airQualityIndoorTemperature :temperatureF ?valueF .
292 } . 292 # } .
293 ''') 293 # ''')
294 out = inf.infer( 294 # out = inf.infer(
295 N3(''' 295 # N3('''
296 <urn:uuid:c6e1d92c-0ee1-11ec-bdbd-2a42c4691e9a> a :MqttMessage ; 296 # <urn:uuid:c6e1d92c-0ee1-11ec-bdbd-2a42c4691e9a> a :MqttMessage ;
297 :body "23.9" ; 297 # :body "23.9" ;
298 :bodyFloat 2.39e+01 ; 298 # :bodyFloat 2.39e+01 ;
299 :topic ( "air_quality_indoor" "sensor" "bme280_temperature" "state" ) . 299 # :topic ( "air_quality_indoor" "sensor" "bme280_temperature" "state" ) .
300 ''')) 300 # '''))
301 vlit = cast(Literal, out.value(ROOM['airQualityIndoorTemperature'], ROOM['temperatureF'])) 301 # vlit = cast(Literal, out.value(ROOM['airQualityIndoorTemperature'], ROOM['temperatureF']))
302 valueF = cast(Decimal, vlit.toPython()) 302 # valueF = cast(Decimal, vlit.toPython())
303 self.assertAlmostEqual(float(valueF), 75.02) 303 # self.assertAlmostEqual(float(valueF), 75.02)
304 304
305 def testEmitBnodes(self): 305 # def testEmitBnodes(self):
306 inf = makeInferenceWithRules(''' 306 # inf = makeInferenceWithRules('''
307 { ?s a :AirQualitySensor; :label ?name . } => { 307 # { ?s a :AirQualitySensor; :label ?name . } => {
308 [ a :MqttStatementSource; 308 # [ a :MqttStatementSource;
309 :mqttTopic (?name "sensor" "bme280_temperature" "state") ] . 309 # :mqttTopic (?name "sensor" "bme280_temperature" "state") ] .
310 } . 310 # } .
311 ''') 311 # ''')
312 out = inf.infer(N3(''' 312 # out = inf.infer(N3('''
313 :airQualityOutdoor a :AirQualitySensor; :label "air_quality_outdoor" . 313 # :airQualityOutdoor a :AirQualitySensor; :label "air_quality_outdoor" .
314 ''')) 314 # '''))
315 out.bind('', ROOM) 315 # out.bind('', ROOM)
316 out.bind('ex', EX) 316 # out.bind('ex', EX)
317 self.assertEqual( 317 # self.assertEqual(
318 out.serialize(format='n3'), b'''\ 318 # out.serialize(format='n3'), b'''\
319 @prefix : <http://projects.bigasterisk.com/room/> . 319 # @prefix : <http://projects.bigasterisk.com/room/> .
320 @prefix ex: <http://example.com/> . 320 # @prefix ex: <http://example.com/> .
321 @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 321 # @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
322 @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 322 # @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
323 @prefix xml: <http://www.w3.org/XML/1998/namespace> . 323 # @prefix xml: <http://www.w3.org/XML/1998/namespace> .
324 @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 324 # @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
325 325
326 [] a :MqttStatementSource ; 326 # [] a :MqttStatementSource ;
327 :mqttTopic ( "air_quality_outdoor" "sensor" "bme280_temperature" "state" ) . 327 # :mqttTopic ( "air_quality_outdoor" "sensor" "bme280_temperature" "state" ) .
328 328
329 ''') 329 # ''')
330 330
331 331
332 class TestListPerformance(WithGraphEqual): 332 class TestListPerformance(WithGraphEqual):
333 333
334 def testList1(self): 334 def testList1(self):