From 75eb39dd0fd31c295b9ed9a6d3b0fd3b25611b2a Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Fri, 6 Aug 2021 13:31:54 +0100 Subject: Add new fresh data factory This will help write more significant test. --- src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala') diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala index ca54054..3467d3c 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala @@ -39,7 +39,7 @@ import implicits.JavaCollections._ import uk.ac.ox.cs.rsacomb.converter._ import uk.ac.ox.cs.rsacomb.suffix._ -import uk.ac.ox.cs.rsacomb.util.RSA +import uk.ac.ox.cs.rsacomb.util.{DataFactory, RSA} /** Canonical model generator * @@ -92,7 +92,7 @@ class CanonicalModel(val ontology: RSAOntology) { val (facts, rules): (List[TupleTableAtom], List[Rule]) = { // Compute rules from ontology axioms val (facts, rules) = { - val term = RSAUtil.genFreshVariable() + val term = Variable.create("X") val unsafe = ontology.unsafe ontology.axioms .map(a => @@ -216,13 +216,13 @@ class CanonicalModel(val ontology: RSAOntology) { unsafe: List[OWLObjectPropertyExpression], skolem: SkolemStrategy, suffix: RSASuffix - ): Result = + )(implicit fresh: DataFactory): Result = axiom match { case a: OWLSubClassOfAxiom if a.isT5 => { val role = axiom.objectPropertyExpressionsInSignature(0) if (unsafe contains role) - super.convert(a, term, unsafe, new Standard(a), Forward) + super.convert(a, term, unsafe, new Standard(a), Forward)(fresh) else { val (f1, r1) = rules1(a) (f1, r1 ::: rules2(a) ::: rules3(a)) @@ -231,12 +231,12 @@ class CanonicalModel(val ontology: RSAOntology) { case a: OWLSubObjectPropertyOfAxiom => { val (facts, rules) = List(Empty, Forward, Backward) - .map(super.convert(a, term, unsafe, NoSkolem, _)) + .map(super.convert(a, term, unsafe, NoSkolem, _)(fresh)) .unzip (facts.flatten, rules.flatten) } - case a => super.convert(a, term, unsafe, skolem, suffix) + case a => super.convert(a, term, unsafe, skolem, suffix)(fresh) } } -- cgit v1.2.3 From bc37ee9293d8a4098edce2a77db6efa3d87b6dd2 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Thu, 30 Sep 2021 18:10:01 +0100 Subject: Make canonical model generation parametric over named graph --- .../scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala | 35 +++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala') diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala index 3467d3c..a39b9c0 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala @@ -31,7 +31,8 @@ import tech.oxfordsemantic.jrdfox.logic.datalog.{ BodyFormula, Negation, Rule, - TupleTableAtom + TupleTableAtom, + TupleTableName } import tech.oxfordsemantic.jrdfox.logic.expression.{IRI, Term, Variable} @@ -48,8 +49,9 @@ import uk.ac.ox.cs.rsacomb.util.{DataFactory, RSA} * (via materialization). * * @param ontology the RSA ontology the canonical model is targeting. + * @param graph the graph the canonical model will be generated into. */ -class CanonicalModel(val ontology: RSAOntology) { +class CanonicalModel(val ontology: RSAOntology, val graph: IRI) { /** Simplify conversion between OWLAPI and RDFox concepts */ import implicits.RDFox._ @@ -65,6 +67,7 @@ class CanonicalModel(val ontology: RSAOntology) { * versions need to be explicitly stated in terms of logic rules. */ val rolesAdditionalRules: List[Rule] = { + val tt = TupleTableName.create(graph.getIRI) ontology.roles .collect { case prop: OWLObjectProperty => prop } .flatMap((pred) => { @@ -83,8 +86,8 @@ class CanonicalModel(val ontology: RSAOntology) { ) ) yield Rule.create( - TupleTableAtom.rdf(varX, iri :: hSuffix, varY), - TupleTableAtom.rdf(varX, iri :: bSuffix, varY) + TupleTableAtom.create(tt, varX, iri :: hSuffix, varY), + TupleTableAtom.create(tt, varX, iri :: bSuffix, varY) ) }) } @@ -108,6 +111,8 @@ class CanonicalModel(val ontology: RSAOntology) { object CanonicalModelConverter extends RDFoxConverter { + override val graph = TupleTableName.create(CanonicalModel.this.graph.getIRI) + private def rules1( axiom: OWLSubClassOfAxiom ): Result = { @@ -115,11 +120,10 @@ class CanonicalModel(val ontology: RSAOntology) { // Fresh Variables val v0 = RSA("v0_" ++ axiom.hashed) val varX = Variable.create("X") - implicit val unfoldTerm = RSA(unfold.hashCode.toString) // TODO: use axiom.toTriple instead val atomA: TupleTableAtom = { val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI - TupleTableAtom.rdf(varX, IRI.RDF_TYPE, cls) + TupleTableAtom.create(graph, varX, IRI.RDF_TYPE, cls) } val roleRf: TupleTableAtom = { val prop = @@ -132,12 +136,15 @@ class CanonicalModel(val ontology: RSAOntology) { .getFiller .asInstanceOf[OWLClass] .getIRI - TupleTableAtom.rdf(v0, IRI.RDF_TYPE, cls) + TupleTableAtom.create(graph, v0, IRI.RDF_TYPE, cls) } - val facts = unfold map RSA.In + val unfoldSet = RSA(unfold.hashCode.toString) + val facts = unfold.map(TupleTableAtom.create(graph, _, RSA.IN, unfoldSet)) + val notInX = + Negation.create(TupleTableAtom.create(graph, varX, RSA.IN, unfoldSet)) val rules = List( - Rule.create(roleRf, atomA, RSA.NotIn(varX)), - Rule.create(atomB, atomA, RSA.NotIn(varX)) + Rule.create(roleRf, atomA, notInX), + Rule.create(atomB, atomA, notInX) ) (facts, rules) } @@ -155,7 +162,7 @@ class CanonicalModel(val ontology: RSAOntology) { // Predicates def atomA(t: Term): TupleTableAtom = { val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI - TupleTableAtom.rdf(t, IRI.RDF_TYPE, cls) + TupleTableAtom.create(graph, t, IRI.RDF_TYPE, cls) } def roleRf(t1: Term, t2: Term): TupleTableAtom = super.convert(roleR, t1, t2, Forward) @@ -165,7 +172,7 @@ class CanonicalModel(val ontology: RSAOntology) { .getFiller .asInstanceOf[OWLClass] .getIRI - TupleTableAtom.rdf(t, IRI.RDF_TYPE, cls) + TupleTableAtom.create(graph, t, IRI.RDF_TYPE, cls) } //Rules List( @@ -190,7 +197,7 @@ class CanonicalModel(val ontology: RSAOntology) { // Predicates def atomA(t: Term): TupleTableAtom = { val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI - TupleTableAtom.rdf(t, IRI.RDF_TYPE, cls) + TupleTableAtom.create(graph, t, IRI.RDF_TYPE, cls) } def roleRf(t: Term): TupleTableAtom = super.convert(roleR, t, v1, Forward) @@ -200,7 +207,7 @@ class CanonicalModel(val ontology: RSAOntology) { .getFiller .asInstanceOf[OWLClass] .getIRI - TupleTableAtom.rdf(v1, IRI.RDF_TYPE, cls) + TupleTableAtom.create(graph, v1, IRI.RDF_TYPE, cls) } cycle.flatMap { x => List( -- cgit v1.2.3 From c86e7d32420adcc05546efa45b21e0e31d0f6c90 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Mon, 4 Oct 2021 18:01:50 +0100 Subject: Fix issue where not all roles where considered for top axiomatisation --- src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala') diff --git a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala index a39b9c0..bd3d3c3 100644 --- a/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala +++ b/src/main/scala/uk/ac/ox/cs/rsacomb/CanonicalModel.scala @@ -68,7 +68,7 @@ class CanonicalModel(val ontology: RSAOntology, val graph: IRI) { */ val rolesAdditionalRules: List[Rule] = { val tt = TupleTableName.create(graph.getIRI) - ontology.roles + ontology.objroles .collect { case prop: OWLObjectProperty => prop } .flatMap((pred) => { val iri = pred.getIRI.getIRIString -- cgit v1.2.3