From 88597503975804e3cb83d116f3cc9a3f12c57461 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Mon, 3 Aug 2020 09:52:53 +0100 Subject: Add DL renderer for input rules --- src/main/scala/rsacomb/RDFoxAxiomConverter.scala | 25 ++++++++++++++++------ .../scala/rsacomb/RDFoxClassExprConverter.scala | 18 ++++++++-------- .../scala/rsacomb/RDFoxPropertyExprConverter.scala | 7 ++++++ src/main/scala/rsacomb/RSAComb.scala | 22 +++++++++++++++++-- 4 files changed, 55 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/main/scala/rsacomb/RDFoxAxiomConverter.scala b/src/main/scala/rsacomb/RDFoxAxiomConverter.scala index 675ca7d..3edc908 100644 --- a/src/main/scala/rsacomb/RDFoxAxiomConverter.scala +++ b/src/main/scala/rsacomb/RDFoxAxiomConverter.scala @@ -4,12 +4,13 @@ import org.semanticweb.owlapi.model.{OWLAxiom, OWLSubClassOfAxiom, OWLEquivalent import org.semanticweb.owlapi.model.OWLAxiomVisitorEx import tech.oxfordsemantic.jrdfox.logic.{Rule, BodyFormula} -import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, Literal} +import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, Variable, Literal} import scala.collection.JavaConverters._ import rsacomb.SkolemStrategy import rsacomb.RDFoxRuleShards +import org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom object RDFoxAxiomConverter { @@ -46,11 +47,23 @@ class RDFoxAxiomConverter(term : Term, skolem : SkolemStrategy) override def visit(axiom : OWLEquivalentClassesAxiom) : List[Rule] = { - for { - axiom1 <- axiom.asPairwiseAxioms.asScala.toList - axiom2 <- axiom1.asOWLSubClassOfAxioms.asScala.toList - rule <- axiom2.accept(this) - } yield 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() diff --git a/src/main/scala/rsacomb/RDFoxClassExprConverter.scala b/src/main/scala/rsacomb/RDFoxClassExprConverter.scala index bf026c3..58bee44 100644 --- a/src/main/scala/rsacomb/RDFoxClassExprConverter.scala +++ b/src/main/scala/rsacomb/RDFoxClassExprConverter.scala @@ -75,15 +75,15 @@ class RDFoxClassExprConverter(term : Term, skolem : SkolemStrategy) // TODO: variables needs to be handled at visitor level. Hardcoding // the name of the varibles might lead to errors for complex cases. val y = Variable.create("y") - val (fun,term1) = skolem match { - case SkolemStrategy.None => (List(),y) - case SkolemStrategy.Constant(c) => (List(), Literal.create(c, Datatype.IRI_REFERENCE)) - case SkolemStrategy.Standard(f) => - // At the time of writing the RDFox library does not have a - // particular class for the "SKOLEM" operator and it is instead - // a simple builtin function with a special name. - (List(BindAtom.create(BuiltinFunctionCall.create("SKOLEM",term),y)),y) - } + val (fun,term1) = skolem match { + case SkolemStrategy.None => (List(),y) + case SkolemStrategy.Constant(c) => (List(), Literal.create(c, Datatype.IRI_REFERENCE)) + case SkolemStrategy.Standard(f) => + // At the time of writing the RDFox library does not have a + // particular class for the "SKOLEM" operator and it is instead + // a simple builtin function with a special name. + (List(BindAtom.create(BuiltinFunctionCall.create("SKOLEM",term),y)),y) + } val classVisitor = new RDFoxClassExprConverter(term1,skolem) val classResult = expr.getFiller.accept(classVisitor) val propertyVisitor = new RDFoxPropertyExprConverter(term, term1, skolem) diff --git a/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala b/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala index 8d472bf..78ac98c 100644 --- a/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala +++ b/src/main/scala/rsacomb/RDFoxPropertyExprConverter.scala @@ -7,6 +7,7 @@ import tech.oxfordsemantic.jrdfox.logic.{TupleTableName} import tech.oxfordsemantic.jrdfox.logic.{Atom, Term, Variable, Literal} import rsacomb.SkolemStrategy +import org.semanticweb.owlapi.model.OWLObjectInverseOf class RDFoxPropertyExprConverter(term1 : Term, term2 : Term, skolem : SkolemStrategy) extends OWLPropertyExpressionVisitorEx[List[Atom]] @@ -18,6 +19,12 @@ class RDFoxPropertyExprConverter(term1 : Term, term2 : Term, skolem : SkolemStra List(Atom.create(TupleTableName.create(name), term1, term2)) } + override + def visit(expr : OWLObjectInverseOf) : List[Atom] = { + val name = expr.getInverse.getNamedProperty.getIRI.getIRIString; + List(Atom.create(TupleTableName.create(name ++ "_inv"), term1, term2)) + } + def doDefault(expr : OWLPropertyExpression) : List[Atom] = List() } // class RDFoxPropertyExprConverter diff --git a/src/main/scala/rsacomb/RSAComb.scala b/src/main/scala/rsacomb/RSAComb.scala index 16d7a04..a6f237f 100644 --- a/src/main/scala/rsacomb/RSAComb.scala +++ b/src/main/scala/rsacomb/RSAComb.scala @@ -22,6 +22,7 @@ import tech.oxfordsemantic.jrdfox.logic.{LogicFormat} import scala.collection.JavaConverters._ import rsacomb.SkolemStrategy +import org.semanticweb.owlapi.dlsyntax.renderer.DLSyntaxObjectRenderer class RSA(ontology : OWLOntology) { @@ -52,12 +53,29 @@ object RSA { * step of approximation of an Horn-ALCHOIQ to RSA */ + val renderer = new DLSyntaxObjectRenderer() + + /* Print TBox axioms */ + println("TBox/RBox:") + for { + axiom <- onto.tboxAxioms(Imports.EXCLUDED).collect(Collectors.toList()).asScala + } yield println(renderer.render(axiom)) + for { + axiom <- onto.rboxAxioms(Imports.EXCLUDED).collect(Collectors.toList()).asScala + } yield println(renderer.render(axiom)) + /* Ontology axiom convertion into LP rules */ - for { + println("Logic rules:") + for { axiom <- onto.tboxAxioms(Imports.EXCLUDED).collect(Collectors.toList()).asScala visitor = new RDFoxAxiomConverter(Variable.create("x"), SkolemStrategy.Constant(axiom.toString)) rule <- axiom.accept(visitor) - } yield println(rule) + } yield println(rule) + for { + axiom <- onto.rboxAxioms(Imports.EXCLUDED).collect(Collectors.toList()).asScala + visitor = new RDFoxAxiomConverter(Variable.create("x"), SkolemStrategy.Constant(axiom.toString)) + rule <- axiom.accept(visitor) + } yield println(rule) /* Return true for now... */ true -- cgit v1.2.3