11package net .sansa_stack .inference .spark .forwardchaining .triples
22
3- import java .io .StringReader
3+ import java .io .{ File , FileReader , StringReader }
44
55import com .holdenkarau .spark .testing .SharedSparkContext
66import net .sansa_stack .inference .spark .data .model .RDFGraph
@@ -19,6 +19,7 @@ class ForwardRuleReasonerELTest extends FunSuite with SharedSparkContext {
1919 private val rdfs = " http://www.w3.org/2000/01/rdf-schema#"
2020 private val owl = " http://www.w3.org/2002/07/owl#"
2121 private val ex = " http://ex.com/"
22+ private val snsa = " http://sansa-stack.net/ontologies/inference/el-example.owl#"
2223
2324 private val prefixDeclStr =
2425 """ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@@ -619,16 +620,123 @@ class ForwardRuleReasonerELTest extends FunSuite with SharedSparkContext {
619620 }))
620621 }
621622
622- ignore(" Overall reasoning should give expected results" ) {
623- import net .sansa_stack .inference .spark .data .loader .rdd .rdf ._
624- val graph : RDFGraph = RDFGraph (sc.ntriples(" /tmp/pizza.nt" ))
623+ test(" Overall reasoning should give expected results" ) {
624+ val parser = RDFParser .create().source(
625+ new FileReader (new File (" src/test/resources/el_ontology.nt" ))).lang(Lang .NTRIPLES ).build()
626+ val sink = new CollectorStreamTriples
627+ parser.parse(sink)
628+ val nttrpls = sc.parallelize(sink.getCollected.asScala.toSeq)
625629
626630 val reasoner = new ForwardRuleReasonerEL (sc, 4 )
627-
628- // println("Initial size: " + graph.size())
629-
630- val res = reasoner(graph)
631- res.triples.saveAsTextFile(" /tmp/lalalalala" )
632- // println("Size after inference: " + res.size())
631+ val inferredRDFGraph = reasoner(RDFGraph (nttrpls))
632+ val inferredTriples = inferredRDFGraph.triples.collect()
633+
634+ // CR1: C \sqsubseteq C1, C1 \sqsubseteq D => C \sqsubseteq D
635+ val cr1_c = uri(snsa + " CR1_C" )
636+ val cr1_d = uri(snsa + " CR1_D" )
637+ assert(
638+ inferredTriples.exists(triple =>
639+ (triple.subjectMatches(cr1_c)
640+ && triple.predicateMatches(RDFS .subClassOf.asNode())
641+ && triple.objectMatches(cr1_d))))
642+
643+ // CR2: C \sqsubseteq C1, C\sqsubseteq C2, C1 \sqcap C2 \sqsubseteq D
644+ // => C \sqsubseteq D
645+ val cr2_c = uri(snsa + " CR2_C" )
646+ val cr2_d = uri(snsa + " CR2_D" )
647+ assert(
648+ inferredTriples.exists(triple =>
649+ (triple.subjectMatches(cr2_c)
650+ && triple.predicateMatches(RDFS .subClassOf.asNode())
651+ && triple.objectMatches(cr2_d))))
652+
653+ // CR3: C \squbseteq C1, C1 \sqsubseteq \exists r.D
654+ // => C \sqsubseteq \exists r.D
655+ val cr3_c = uri(snsa + " CR3_C" )
656+ val cr3_r = uri(snsa + " cr3_r" )
657+ val cr3_d = uri(snsa + " CR3_D" )
658+ // C rdfs:subClassOf _:23 .
659+ assert(
660+ inferredTriples.exists(triple =>
661+ (triple.subjectMatches(cr3_c)
662+ && triple.predicateMatches(RDFS .subClassOf.asNode())
663+ && triple.getObject.isBlank)))
664+ // _:23 owl:onProperty r .
665+ assert(
666+ inferredTriples.exists(triple =>
667+ (triple.getSubject.isBlank
668+ && triple.predicateMatches(OWL2 .onProperty.asNode())
669+ && triple.objectMatches(cr3_r))))
670+ // _:23 owl:someValuesFrom D
671+ assert(
672+ inferredTriples.exists(triple =>
673+ (triple.getSubject.isBlank
674+ && triple.predicateMatches(OWL2 .someValuesFrom.asNode())
675+ && triple.objectMatches(cr3_d))))
676+
677+ // CR4: C \sqsubseteq \exists r.D, D \sqsubseteq D2,
678+ // \exists r.D2 \sqsubseteq E => C \sqsubseteq E
679+ val cr4_c = uri(snsa + " CR4_C" )
680+ val cr4_e = uri(snsa + " CR4_E" )
681+ assert(
682+ inferredTriples.exists(triple =>
683+ (triple.subjectMatches(cr4_c)
684+ && triple.predicateMatches(RDFS .subClassOf.asNode())
685+ && triple.objectMatches(cr4_e))))
686+
687+ // CR5: C \sqsubseteq \exists r.D, D \sqsubseteq \bot => C \sqsubseteq \bot
688+ val cr5_c = uri(snsa + " CR5_C" )
689+ assert(
690+ inferredTriples.exists(triple =>
691+ (triple.subjectMatches(cr5_c)
692+ && triple.predicateMatches(RDFS .subClassOf.asNode())
693+ && triple.objectMatches(OWL2 .Nothing .asNode()))))
694+
695+ // CR10: C \sqsubseteq \exists r.D, r \sqsubseteq s => C \sqsubseteq \exists s.D
696+ val cr10_c = uri(snsa + " CR10_C" )
697+ val cr10_s = uri(snsa + " cr10_s" )
698+ val cr10_d = uri(snsa + " CR10_D" )
699+ // C rdfs:subClassOf _:23
700+ assert(
701+ inferredTriples.exists(triple =>
702+ (triple.subjectMatches(cr10_c)
703+ && triple.predicateMatches(RDFS .subClassOf.asNode())
704+ && triple.getObject.isBlank)))
705+ // _:23 owl:onProperty s
706+ assert(
707+ inferredTriples.exists(triple =>
708+ (triple.getSubject.isBlank
709+ && triple.predicateMatches(OWL2 .onProperty.asNode())
710+ && triple.objectMatches(cr10_s))))
711+ // _:23 owl:someValuesFrom D
712+ assert(
713+ inferredTriples.exists(triple =>
714+ (triple.getSubject.isBlank
715+ && triple.predicateMatches(OWL2 .someValuesFrom.asNode())
716+ && triple.objectMatches(cr10_d))))
717+
718+ // CR11: C \sqsubseteq \exists r1.D, D \sqsubseteq \exists r2.E,
719+ // r1 o r2 \sqsubseteq r3 => C \sqsubseteq \exists r3.E
720+ val cr11_c = uri(snsa + " CR11_C" )
721+ val cr11_r3 = uri(snsa + " cr11_r3" )
722+ val cr11_e = uri(snsa + " CR11_E" )
723+ // C rdfs:subClassOf _:23
724+ assert(
725+ inferredTriples.exists(triple =>
726+ (triple.subjectMatches(cr11_c)
727+ && triple.predicateMatches(RDFS .subClassOf.asNode())
728+ && triple.getObject.isBlank)))
729+ // _:23 owl:onProperty r3
730+ assert(
731+ inferredTriples.exists(triple =>
732+ (triple.getSubject.isBlank
733+ && triple.predicateMatches(OWL2 .onProperty.asNode())
734+ && triple.objectMatches(cr11_r3))))
735+ // _:23 owl:someValuesFrom E
736+ assert(
737+ inferredTriples.exists(triple =>
738+ (triple.getSubject.isBlank
739+ && triple.predicateMatches(OWL2 .someValuesFrom.asNode())
740+ && triple.objectMatches(cr11_e))))
633741 }
634742}
0 commit comments