From bd2ab8c75be9ad7f8d0442fc86bb1bd7b7ee229a Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Thu, 19 May 2022 15:06:33 +0100 Subject: refactor(rdfox-dsl): simplify creation of Datalog rules --- .../ox/cs/rsacomb/filtering/FilteringProgram.scala | 10 --- .../filtering/RevisedFilteringProgram.scala | 2 +- .../filtering/RevisedFilteringProgram2.scala | 2 +- .../scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala | 94 +++++++++++++++++++++- 4 files changed, 94 insertions(+), 14 deletions(-) diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/FilteringProgram.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/FilteringProgram.scala index c732784..957784b 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/FilteringProgram.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/FilteringProgram.scala @@ -21,16 +21,6 @@ import tech.oxfordsemantic.jrdfox.logic.expression.{IRI, Variable} import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery import uk.ac.ox.cs.rsacomb.util.Versioned -object RDFoxDSL { - - import scala.collection.JavaConverters._ - - implicit class MyVariable(private val str: StringContext) extends AnyVal { - def v(args: Any*): Variable = Variable.create(s"${str.s(args: _*)}") - } - -} - /** Type of filtering strategy. * * Mainly for testing different approaches and techniques. diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala index 541fdff..85794b0 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram.scala @@ -35,7 +35,7 @@ import tech.oxfordsemantic.jrdfox.logic.expression.{ } import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery import uk.ac.ox.cs.rsacomb.suffix.{RSASuffix, Forward, Backward} -import uk.ac.ox.cs.rsacomb.util.{RSA, RDFoxUtil} +import uk.ac.ox.cs.rsacomb.util.{RSA, RDFoxUtil, RDFoxDSL} /** Factory for [[uk.ac.ox.cs.rsacomb.FilteringProgram FilteringProgram]] */ object RevisedFilteringProgram { diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram2.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram2.scala index a282d8a..3d70b03 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram2.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/filtering/RevisedFilteringProgram2.scala @@ -66,7 +66,7 @@ class RevisedFilteringProgram2( val query: ConjunctiveQuery ) extends FilteringProgram { - import RDFoxDSL._ + import uk.ac.ox.cs.rsacomb.util.RDFoxDSL._ /** Extends capabilities of * [[tech.oxfordsemantic.jrdfox.logic.datalog.TupleTableAtom TupleTableAtom]] diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala index 6e10b30..81702f5 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/util/RDFoxUtil.scala @@ -18,6 +18,7 @@ package uk.ac.ox.cs.rsacomb.util import java.io.{OutputStream, File, StringReader} import scala.collection.JavaConverters._ +import org.semanticweb.owlapi.model.OWLLogicalAxiom import tech.oxfordsemantic.jrdfox.Prefixes import tech.oxfordsemantic.jrdfox.client.{ ComponentInfo, @@ -47,6 +48,68 @@ import uk.ac.ox.cs.rsacomb.sparql.ConjunctiveQuery import uk.ac.ox.cs.rsacomb.suffix.Nth import uk.ac.ox.cs.rsacomb.util.Logger +object RDFoxDSL { + + import scala.collection.JavaConverters._ + import tech.oxfordsemantic.jrdfox.logic.datalog._ + //import tech.oxfordsemantic.jrdfox.logic.expression._ + + + /* String contexts */ + implicit class MyVariable(private val str: StringContext) extends AnyVal { + def v(args: Any*): Variable = Variable.create(s"${str.s(args: _*)}") + } + implicit class MyIRI(private val str: StringContext) extends AnyVal { + def i(args: Any*): IRI = IRI.create(s"${str.s(args: _*)}") + } + + + /** Sequence of [[TupleTableAtom]]s (a.k.a. head of a rule) */ + case class SeqTupleTableAtoms(atoms: TupleTableAtom*) { + /** Atoms conjunction */ + def +(atom: TupleTableAtom): SeqTupleTableAtoms = + SeqTupleTableAtoms(atoms :+ atom: _*) + /** Implication (rule constructor) */ + def :-(body: SeqBodyFormulas): Rule = { + Rule.create(atoms.asJava, body.atoms.asJava) + } + } + implicit def seqTupleTableAtoms(atom: TupleTableAtom): SeqTupleTableAtoms = + SeqTupleTableAtoms(atom) + + /** Sequence of [[BodyFormula]]e (a.k.a. body) */ + case class SeqBodyFormulas(atoms: BodyFormula*) { + /** Atoms conjunction */ + def +(atom: BodyFormula): SeqBodyFormulas = SeqBodyFormulas(atoms :+ atom: _*) + } + implicit def seqBodyFormulas(atom: BodyFormula): SeqBodyFormulas = + SeqBodyFormulas(atom) + implicit def atoms2bodyFormulas(ttas: SeqTupleTableAtoms): SeqBodyFormulas = + SeqBodyFormulas(ttas.atoms: _*) + + + + + trait RDFoxPredicate { + def apply(terms: Term*): TupleTableAtom + } + + implicit class RDFoxGraph(val tt: IRI) extends RDFoxPredicate { + def apply(terms: Term*): TupleTableAtom = + TupleTableAtom.create(TupleTableName.create(tt.getIRI), terms:_*) + } + //class RDFoxTerm() extends RDFoxPredicate {} + + //implicit class RDFoxPrefix(val name: String) { + // def ::(prefix: String): IRI = IRI.create(prefix + name) + //} + + //val owlpre = "http://example.com/owl#" + //val prova = TupleTableAtom.rdf(v"x", v"y", v"z") & TupleTableAtom.rdf(v"x", v"y", v"z") + //val prova2 = i"iri_di_prova"(v"x", v"y", v"z") & owlpre::"subClassOf"(v"x", v"y", v"z") + +} + /** A collection of helper methods for RDFox */ object RDFoxUtil { @@ -62,7 +125,7 @@ object RDFoxUtil { * [[tech.oxfordsemantic.jrdfox.logic.sparql.statement.Query]]. */ private type QueryAnswers = Seq[(Long, Seq[Resource])] - private def QueryAnswers() = List.empty[(Long, Seq[Resource])] + def QueryAnswers() = List.empty[(Long, Seq[Resource])] /** Type alias for