aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/rsacomb/RDFoxAxiomConverter.scala
blob: 0a798234009be9d976a2cf5f332e4a1a0b42a321 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package rsacomb

import org.semanticweb.owlapi.model.{OWLAxiom, OWLSubClassOfAxiom, OWLEquivalentClassesAxiom, OWLObjectPropertyExpression}
import org.semanticweb.owlapi.model.OWLAxiomVisitorEx

import tech.oxfordsemantic.jrdfox.logic.{Rule, BodyFormula}
import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, Variable, Literal}
import tech.oxfordsemantic.jrdfox.logic.{TupleTableName}

import scala.collection.JavaConverters._

import rsacomb.SkolemStrategy
import rsacomb.RDFoxRuleShards
import org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom
import org.semanticweb.owlapi.model.OWLObjectProperty

object RDFoxAxiomConverter {

  def apply(
    term : Term = Variable.create("x"),
    skolem : SkolemStrategy = SkolemStrategy.None,
    unsafe : List[OWLObjectPropertyExpression] = List()
  ) : RDFoxAxiomConverter =
	  new RDFoxAxiomConverter(term, skolem, unsafe)

} // object RDFoxAxiomConverter

class RDFoxAxiomConverter(term : Term, skolem : SkolemStrategy, unsafe : List[OWLObjectPropertyExpression])
  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, unsafe)
    val superVisitor = new RDFoxClassExprConverter(term, skolem, unsafe)
    // 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
  }

  override
  def visit(axiom : OWLSubObjectPropertyOfAxiom) : List[Rule] = {
    // TODO: variables needs to be handled at visitor level. Hardcoding
    // the name of the varibles might lead to errors for complex cases.
    val term1 = Variable.create("y")
    val subVisitor = new RDFoxPropertyExprConverter(term,term1,SkolemStrategy.None)
    val superVisitor = new RDFoxPropertyExprConverter(term,term1,skolem)
    val body: List[BodyFormula] = axiom.getSubProperty.accept(subVisitor)
    val head: List[Atom] = axiom.getSuperProperty.accept(superVisitor)
    List(Rule.create(head.asJava,body.asJava))
  }

  def doDefault(axiom : OWLAxiom) : List[Rule] = List()

} // class RDFoxAxiomConverter