Skip to content
This repository was archived by the owner on Oct 8, 2020. It is now read-only.

Commit 6ac4d4b

Browse files
Fixed bug in EL FC reasoner and added tests
1 parent 8cd7e88 commit 6ac4d4b

2 files changed

Lines changed: 129 additions & 13 deletions

File tree

sansa-inference-spark/src/main/scala/net/sansa_stack/inference/spark/forwardchaining/triples/ForwardRuleReasonerEL.scala

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ class ForwardRuleReasonerEL (sc: SparkContext, parallelism: Int = 2) extends Tra
121121
val c1 = e._1
122122
val r = e._2
123123
val d = e._3
124-
val bNode = NodeFactory.createBlankNode()
124+
// TODO: revise
125+
val hash = (c1.hashCode() * r.hashCode()) % d.hashCode()
126+
val bNode = NodeFactory.createBlankNode(hash.toString)
125127

126128
// C1 rdf:subClassOf _:23 .
127129
val trpl1 = Triple.create(c1, RDFS.subClassOf.asNode(), bNode)
@@ -205,7 +207,9 @@ class ForwardRuleReasonerEL (sc: SparkContext, parallelism: Int = 2) extends Tra
205207
val s = e._2._1
206208
val c = e._2._2._1
207209
val d = e._2._2._2
208-
val bNode = NodeFactory.createBlankNode()
210+
// TODO: Revise
211+
val hash = (s.hashCode() * c.hashCode()) % d.hashCode()
212+
val bNode = NodeFactory.createBlankNode(hash.toString)
209213

210214
// C rdfs:subClassOf _:23 .
211215
val trpl1 = Triple.create(c, RDFS.subClassOf.asNode(), bNode)
@@ -254,7 +258,9 @@ class ForwardRuleReasonerEL (sc: SparkContext, parallelism: Int = 2) extends Tra
254258
val c = entry._2._2._1
255259
val r3 = entry._2._1
256260
val e = entry._2._2._2
257-
val bNode = NodeFactory.createBlankNode()
261+
// TODO: revise
262+
val hash = (c.hashCode() * r3.hashCode()) % e.hashCode()
263+
val bNode = NodeFactory.createBlankNode(hash.toString)
258264
// C \sqsubseteq \exists r2.E
259265

260266
// C rdfs:subClassOf _:23 .
@@ -299,8 +305,10 @@ class ForwardRuleReasonerEL (sc: SparkContext, parallelism: Int = 2) extends Tra
299305
if (!inferredTriples.isEmpty()) {
300306
// Check whether something new was inferred
301307
val oldCount = triplesRDD.count()
308+
logger.debug("Old overall count: " + oldCount)
302309
triplesRDD = triplesRDD.union(inferredTriples).distinct(parallelism)
303310
val newCount = triplesRDD.count()
311+
logger.debug("New overall count: " + newCount)
304312
if (newCount > oldCount) {
305313
rule.getInfluencedRules().foreach(rulesQueue.enqueue(_))
306314
}

sansa-inference-spark/src/test/scala/net/sansa_stack/inference/spark/forwardchaining/triples/ForwardRuleReasonerELTest.scala

Lines changed: 118 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package net.sansa_stack.inference.spark.forwardchaining.triples
22

3-
import java.io.StringReader
3+
import java.io.{File, FileReader, StringReader}
44

55
import com.holdenkarau.spark.testing.SharedSparkContext
66
import 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

Comments
 (0)