aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/example2.owl2
-rw-r--r--src/main/scala/rsacomb/CanonicalModel.scala2
-rw-r--r--src/test/scala/rsacomb/CanonicalModelSpec.scala155
3 files changed, 154 insertions, 5 deletions
diff --git a/examples/example2.owl b/examples/example2.owl
index f42f6c9..5c83fa6 100644
--- a/examples/example2.owl
+++ b/examples/example2.owl
@@ -109,4 +109,4 @@
109 <rdfs:subClassOf rdf:resource="#Y" /> 109 <rdfs:subClassOf rdf:resource="#Y" />
110 </owl:Restriction> 110 </owl:Restriction>
111 111
112</rdf:RDF> \ No newline at end of file 112</rdf:RDF>
diff --git a/src/main/scala/rsacomb/CanonicalModel.scala b/src/main/scala/rsacomb/CanonicalModel.scala
index c07fc06..cc89a85 100644
--- a/src/main/scala/rsacomb/CanonicalModel.scala
+++ b/src/main/scala/rsacomb/CanonicalModel.scala
@@ -24,7 +24,7 @@ object ProgramGenerator {
24 24
25 def apply( 25 def apply(
26 ontology: OWLOntology, 26 ontology: OWLOntology,
27 term: Term 27 term: Term = Variable.create("X")
28 ): RDFoxAxiomConverter = 28 ): RDFoxAxiomConverter =
29 new ProgramGenerator(ontology, term) 29 new ProgramGenerator(ontology, term)
30 30
diff --git a/src/test/scala/rsacomb/CanonicalModelSpec.scala b/src/test/scala/rsacomb/CanonicalModelSpec.scala
index 39801bf..e8db89d 100644
--- a/src/test/scala/rsacomb/CanonicalModelSpec.scala
+++ b/src/test/scala/rsacomb/CanonicalModelSpec.scala
@@ -71,7 +71,7 @@ object Ontology1_CanonicalModelSpec {
71 Seq().asJava 71 Seq().asJava
72 ) 72 )
73 73
74} // object OWLAxiomSpec 74}
75 75
76class Ontology1_CanonicalModelSpec 76class Ontology1_CanonicalModelSpec
77 extends AnyFlatSpec 77 extends AnyFlatSpec
@@ -181,7 +181,7 @@ class Ontology1_CanonicalModelSpec
181 181
182 renderer.render( 182 renderer.render(
183 BsomeValuesFromSD 183 BsomeValuesFromSD
184 ) should "have a sigleton 'cycle' set" in { 184 ) should "have a 'cycle' set of 32 elements" in {
185 // Cycle introduces a new constant for each possible triple (the 185 // Cycle introduces a new constant for each possible triple (the
186 // order among triples is total). In this example there are 4 186 // order among triples is total). In this example there are 4
187 // concept names and S has 2 safe roles in its conflict set (R, 187 // concept names and S has 2 safe roles in its conflict set (R,
@@ -211,4 +211,153 @@ class Ontology1_CanonicalModelSpec
211 rules should have length 2 211 rules should have length 2
212 } 212 }
213 213
214} // class OWLAxiomSpec 214}
215
216object Ontology2_CanonicalModelSpec {
217
218 /* Renderer to display OWL Axioms with DL syntax*/
219 val renderer = new DLSyntaxObjectRenderer()
220
221 val ontology_path: File = new File("examples/example2.owl")
222 val ontology = RSA.loadOntology(ontology_path)
223 val program = ontology.canonicalModel
224
225 val roleR = new OWLObjectPropertyImpl(RSA.base("R"))
226 val roleS = new OWLObjectPropertyImpl(RSA.base("S"))
227 val roleT = new OWLObjectPropertyImpl(RSA.base("T"))
228 val roleP = new OWLObjectPropertyImpl(RSA.base("P"))
229 val roleR_inv = roleR.getInverseProperty()
230 val roleS_inv = roleS.getInverseProperty()
231 val roleT_inv = roleT.getInverseProperty()
232 val roleP_inv = roleP.getInverseProperty()
233
234 val AsomeValuesFromRB = new OWLSubClassOfAxiomImpl(
235 new OWLClassImpl(RSA.base("A")),
236 new OWLObjectSomeValuesFromImpl(
237 roleR,
238 new OWLClassImpl(RSA.base("B"))
239 ),
240 Seq().asJava
241 )
242
243 val BsomeValuesFromSC = new OWLSubClassOfAxiomImpl(
244 new OWLClassImpl(RSA.base("B")),
245 new OWLObjectSomeValuesFromImpl(
246 roleS,
247 new OWLClassImpl(RSA.base("C"))
248 ),
249 Seq().asJava
250 )
251
252 val CsomeValuesFromTD = new OWLSubClassOfAxiomImpl(
253 new OWLClassImpl(RSA.base("C")),
254 new OWLObjectSomeValuesFromImpl(
255 roleT,
256 new OWLClassImpl(RSA.base("D"))
257 ),
258 Seq().asJava
259 )
260
261 val DsomeValuesFromPA = new OWLSubClassOfAxiomImpl(
262 new OWLClassImpl(RSA.base("D")),
263 new OWLObjectSomeValuesFromImpl(
264 roleP,
265 new OWLClassImpl(RSA.base("A"))
266 ),
267 Seq().asJava
268 )
269
270}
271
272class Ontology2_CanonicalModelSpec
273 extends AnyFlatSpec
274 with Matchers
275 with LoneElement {
276
277 import Ontology2_CanonicalModelSpec._
278
279 "The program generated from Example #1" should "not be empty" in {
280 program should not be empty
281 }
282
283 // Role R //
284
285 renderer.render(roleR) should "be unsafe" in {
286 ontology.unsafeRoles should contain(roleR)
287 }
288
289 it should "have only its inverse in its conflict set" in {
290 ontology.confl(roleR).loneElement shouldBe roleR_inv
291 }
292
293 // Role S //
294
295 renderer.render(roleS) should "be unsafe" in {
296 ontology.unsafeRoles should contain(roleS)
297 }
298
299 it should "have only its inverse in its conflict set" in {
300 ontology.confl(roleS).loneElement shouldBe roleS_inv
301 }
302
303 // Role T //
304
305 renderer.render(roleT) should "be unsafe" in {
306 ontology.unsafeRoles should contain(roleT)
307 }
308
309 it should "have only its inverse in its conflict set" in {
310 ontology.confl(roleT).loneElement shouldBe roleT_inv
311 }
312
313 // Role P //
314
315 renderer.render(roleP) should "be unsafe" in {
316 ontology.unsafeRoles should contain(roleP)
317 }
318
319 it should "have only its inverse in its conflict set" in {
320 ontology.confl(roleP).loneElement shouldBe roleP_inv
321 }
322
323 // A ⊑ ∃ R.B
324
325 renderer.render(
326 AsomeValuesFromRB
327 ) should "produce 1 rule" in {
328 val visitor = ProgramGenerator(ontology)
329 val rules = AsomeValuesFromRB.accept(visitor)
330 rules should have length 1
331 }
332
333 // B ⊑ ∃ S.C
334
335 renderer.render(
336 BsomeValuesFromSC
337 ) should "produce 1 rule" in {
338 val visitor = ProgramGenerator(ontology)
339 val rules = BsomeValuesFromSC.accept(visitor)
340 rules should have length 1
341 }
342
343 // C ⊑ ∃ T.D
344
345 renderer.render(
346 CsomeValuesFromTD
347 ) should "produce 1 rule" in {
348 val visitor = ProgramGenerator(ontology)
349 val rules = CsomeValuesFromTD.accept(visitor)
350 rules should have length 1
351 }
352
353 // D ⊑ ∃ P.A
354
355 renderer.render(
356 DsomeValuesFromPA
357 ) should "produce 1 rule" in {
358 val visitor = ProgramGenerator(ontology)
359 val rules = DsomeValuesFromPA.accept(visitor)
360 rules should have length 1
361 }
362
363}