1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
package rsacomb
import org.semanticweb.owlapi.model.{OWLAxiom, OWLSubClassOfAxiom, OWLEquivalentClassesAxiom}
import org.semanticweb.owlapi.model.OWLAxiomVisitorEx
import tech.oxfordsemantic.jrdfox.logic.Rule
import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, Literal, Individual}
import scala.collection.JavaConverters._
import rsacomb.SkolemStrategy
import rsacomb.RDFoxRuleShards
object RDFoxAxiomConverter {
def apply(term : Term, skolem : SkolemStrategy) : RDFoxAxiomConverter =
new RDFoxAxiomConverter(term, skolem)
def apply(term : Term) : RDFoxAxiomConverter =
new RDFoxAxiomConverter(term, SkolemStrategy.None)
} // object RDFoxAxiomConverter
class RDFoxAxiomConverter(term : Term, skolem : SkolemStrategy)
extends OWLAxiomVisitorEx[List[Rule]]
{
override
def visit(axiom : OWLSubClassOfAxiom) : List[Rule] = {
// Skolemization is needed only for the head of an axiom
val subVisitor = new RDFoxClassExprConverter(term,SkolemStrategy.None)
val superVisitor = new RDFoxClassExprConverter(term, skolem)
// Each visitor returns a `RDFoxRuleShards`, a tuple (res,ext):
// - the `res` List is a list of atoms resulting from the conversion
// of the axiom.
// - for some Class Expressions appearing in the head of an Axiom,
// the conversion might produce atoms that need to appear in the
// body (and not in the head) of the rule. This is what the `ext`
// List is for.
val sub = axiom.getSubClass.accept(subVisitor)
val sup = axiom.getSuperClass.accept(superVisitor)
val head = sup.res.asJava
val body = (sub.res ++ sup.ext).asJava
List(Rule.create(head,body))
}
override
def visit(axiom : OWLEquivalentClassesAxiom) : List[Rule] = {
for {
axiom1 <- axiom.asPairwiseAxioms.asScala.toList
axiom2 <- axiom1.asOWLSubClassOfAxioms.asScala.toList
rule <- axiom2.accept(this)
} yield rule
}
def doDefault(axiom : OWLAxiom) : List[Rule] = List()
} // class RDFoxAxiomConverter
|