aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/example/RDFoxAxiomConverter.scala
blob: 0a6272fbe5b501e92bac35953de68f588c920c95 (plain) (blame)
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