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

Commit e674fc2

Browse files
Added test for Forw.RuleReasonerOWLHorst rule O13
1 parent ac617a4 commit e674fc2

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
Prefix(:=<http://ex.com/default#>)
2+
3+
Ontology(<http://ex.com/ont/sample1.owl>
4+
<http://ex.com/ont/release/123/sample1.owl>
5+
6+
Declaration(ObjectProperty(:objProp01))
7+
Declaration(ObjectProperty(:objProp02))
8+
9+
Declaration(DataProperty(:dataProp01))
10+
Declaration(DataProperty(:dataProp02))
11+
12+
Declaration(Class(:Cls01))
13+
Declaration(Class(:Cls02))
14+
15+
# just random classes not further used
16+
Declaration(Class(:Cls03))
17+
Declaration(Class(:Cls04))
18+
19+
Declaration(NamedIndividual(:indivA))
20+
Declaration(NamedIndividual(:indivB))
21+
Declaration(NamedIndividual(:indivC))
22+
Declaration(NamedIndividual(:indivD))
23+
Declaration(NamedIndividual(:indivE))
24+
Declaration(NamedIndividual(:indivF))
25+
Declaration(NamedIndividual(:indivG))
26+
Declaration(NamedIndividual(:indivH))
27+
Declaration(NamedIndividual(:indivI))
28+
Declaration(NamedIndividual(:indivJ))
29+
Declaration(NamedIndividual(:indivK))
30+
Declaration(NamedIndividual(:indivL))
31+
Declaration(NamedIndividual(:indivM))
32+
33+
EquivalentClasses(:Cls01 ObjectHasValue(:objProp01 :indivB))
34+
EquivalentClasses(:Cls02 DataHasValue(:objProp01 "ABCD"))
35+
36+
# :indivA should be detected as instance of :Cls01
37+
ObjectPropertyAssertion(:objProp01 :indivA :indivB)
38+
39+
# Individuals should not be detected as instance of anything
40+
ObjectPropertyAssertion(:objProp01 :indivC :indivD)
41+
ObjectPropertyAssertion(:objProp02 :indivE :indivB)
42+
43+
# random assertions
44+
ObjectPropertyAssertion(:objProp01 :indivF :indivG)
45+
ObjectPropertyAssertion(:objProp02 :indivG :indivH)
46+
47+
# :indivI should be detected as instance of :Cls02
48+
DataPropertyAssertion(:dataProp01 :indivI "ABCD")
49+
50+
# individuals should not be detected as instance of anything
51+
DataPropertyAssertion(:dataProp01 :indivJ "DCBA")
52+
DataPropertyAssertion(:dataProp02 :indivK "ABCD")
53+
54+
# random assertions
55+
DataPropertyAssertion(:dataProp01 :indivL "EFGH")
56+
DataPropertyAssertion(:dataProp02 :indivM "IJKL")
57+
)

sansa-inference-spark/src/test/scala/net/sansa_stack/inference/spark/forwardchaining/axioms/ForwardRuleReasonerOWLHorstTest.scala

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,4 +735,58 @@ class ForwardRuleReasonerOWLHorstTest extends FunSuite with SharedSparkContext w
735735
assert(inferred.contains(
736736
df.getOWLEquivalentDataPropertiesAxiom(dataProp01, dataProp02)))
737737
}
738+
739+
/**
740+
* O13:
741+
* Condition:
742+
* v owl:hasValue w
743+
* v owl:onProperty p
744+
* u p v
745+
* Consequence:
746+
* u rdf:type v
747+
*
748+
* FIXME: for the test_o13.owl test data much more axioms are inferred
749+
* which seem wrong. Thus, this test should be adapted to do an exact count
750+
* on the inferred triples after the O13 rule was put into a separate method.
751+
* Right now these wrongly inferred axioms are not detected.
752+
*/
753+
test("Rule O13 should return correct results") {
754+
val cls01 = df.getOWLClass(defaultPrefix + "Cls01")
755+
val cls02 = df.getOWLClass(defaultPrefix + "Cls02")
756+
757+
val objProp01 = df.getOWLObjectProperty(defaultPrefix + "objProp01")
758+
val dataProp01 = df.getOWLDataProperty(defaultPrefix + "dataProp01")
759+
760+
val indivA = df.getOWLNamedIndividual(defaultPrefix + "indivA")
761+
val indivB = df.getOWLNamedIndividual(defaultPrefix + "indivB")
762+
val indivI = df.getOWLNamedIndividual(defaultPrefix + "indivI")
763+
764+
val input = getClass.getResource(resourcePath + "test_o13.owl").getPath
765+
766+
val axiomsRDD = spark.owl(Syntax.FUNCTIONAL)(input)
767+
val reasoner = new ForwardRuleReasonerOWLHorst(sc, sc.defaultMinPartitions)
768+
val inferred: Seq[OWLAxiom] = reasoner.apply(axiomsRDD).collect()
769+
770+
// Two axioms should be inferred:
771+
// ClassAssertion(:Cls01 :indivA)
772+
// ClassAssertion(:Cls02 :indivI)
773+
//
774+
// With rule O10 also considering OWL vocabulary for inference (e.g. from
775+
// :i rdf:type :ClsX . :ClsX owl:sameAs :ClsY infer :i rdf:type :ClsY)
776+
// additionally
777+
// ClassAssertion(ObjectHasValue(:objProp01 :indivB) :indivA)
778+
// ClassAssertion(ObjectHasValue(:dataProp01 "ABCD") :indivI)
779+
// should be inferred.
780+
// FIXME: Make this a check on the exact count after having put the O13 inference into a separate method and just calling this particular method for testing
781+
assert(inferred.size >= 4)
782+
assert(inferred.contains(df.getOWLClassAssertionAxiom(cls01, indivA)))
783+
assert(inferred.contains(df.getOWLClassAssertionAxiom(cls02, indivI)))
784+
assert(inferred.contains(
785+
df.getOWLClassAssertionAxiom(
786+
df.getOWLObjectHasValue(objProp01, indivB), indivA)))
787+
assert(inferred.contains(
788+
df.getOWLClassAssertionAxiom(
789+
df.getOWLDataHasValue(dataProp01, df.getOWLLiteral("ABCD")),
790+
indivI)))
791+
}
738792
}

0 commit comments

Comments
 (0)