aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/rsacomb
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2020-11-09 18:15:30 +0000
committerFederico Igne <federico.igne@cs.ox.ac.uk>2020-11-09 18:15:30 +0000
commit6364c8afcece09230fa256613b4d28aede79e40d (patch)
tree0763035c1fd303b7cb42fb0e4ab202f2136cf7f4 /src/main/scala/rsacomb
parentb60f60013c560a4d481e95f762e6a7c31c7a5ad2 (diff)
downloadRSAComb-6364c8afcece09230fa256613b4d28aede79e40d.tar.gz
RSAComb-6364c8afcece09230fa256613b4d28aede79e40d.zip
Fix `notIn` implementation in canonical model
The informal definition provided by the paper in wrong, and it turns out `notIn` just means "not in".
Diffstat (limited to 'src/main/scala/rsacomb')
-rw-r--r--src/main/scala/rsacomb/RSAOntology.scala35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/main/scala/rsacomb/RSAOntology.scala b/src/main/scala/rsacomb/RSAOntology.scala
index 60008a2..8d6fe8c 100644
--- a/src/main/scala/rsacomb/RSAOntology.scala
+++ b/src/main/scala/rsacomb/RSAOntology.scala
@@ -19,7 +19,7 @@ import org.semanticweb.owlapi.model.{IRI => OWLIRI}
19import uk.ac.manchester.cs.owl.owlapi.OWLObjectPropertyImpl 19import uk.ac.manchester.cs.owl.owlapi.OWLObjectPropertyImpl
20 20
21import tech.oxfordsemantic.jrdfox.client.{UpdateType, DataStoreConnection} 21import tech.oxfordsemantic.jrdfox.client.{UpdateType, DataStoreConnection}
22import tech.oxfordsemantic.jrdfox.logic.datalog.{Rule, TupleTableAtom} 22import tech.oxfordsemantic.jrdfox.logic.datalog.{Rule, TupleTableAtom, Negation}
23import tech.oxfordsemantic.jrdfox.logic.expression.{ 23import tech.oxfordsemantic.jrdfox.logic.expression.{
24 Term, 24 Term,
25 Variable, 25 Variable,
@@ -97,11 +97,11 @@ trait RSAOntology {
97 val unsafe = this.unsafeRoles 97 val unsafe = this.unsafeRoles
98 98
99 /* DEBUG: print rules in DL syntax and unsafe roles */ 99 /* DEBUG: print rules in DL syntax and unsafe roles */
100 val renderer = new DLSyntaxObjectRenderer() 100 //val renderer = new DLSyntaxObjectRenderer()
101 println("\nDL rules:") 101 //println("\nDL rules:")
102 axioms.foreach(x => println(renderer.render(x))) 102 //axioms.foreach(x => println(renderer.render(x)))
103 println("\nUnsafe roles:") 103 //println("\nUnsafe roles:")
104 println(unsafe) 104 //println(unsafe)
105 105
106 /* Ontology convertion into LP rules */ 106 /* Ontology convertion into LP rules */
107 val datalog = for { 107 val datalog = for {
@@ -116,8 +116,8 @@ trait RSAOntology {
116 } yield rule 116 } yield rule
117 117
118 /* DEBUG: print datalog rules */ 118 /* DEBUG: print datalog rules */
119 println("\nDatalog roles:") 119 //println("\nDatalog roles:")
120 datalog.foreach(println) 120 //datalog.foreach(println)
121 121
122 // Open connection with RDFox 122 // Open connection with RDFox
123 val (server, data) = RDFoxUtil.openConnection("RSACheck") 123 val (server, data) = RDFoxUtil.openConnection("RSACheck")
@@ -147,7 +147,7 @@ trait RSAOntology {
147 /* Build graph 147 /* Build graph
148 */ 148 */
149 val graph = this.rsaGraph(data); 149 val graph = this.rsaGraph(data);
150 println(graph) 150 //println(graph)
151 151
152 // Close connection to RDFox 152 // Close connection to RDFox
153 RDFoxUtil.closeConnection(server, data) 153 RDFoxUtil.closeConnection(server, data)
@@ -426,20 +426,21 @@ trait RSAOntology {
426 private def rules1(axiom: OWLSubClassOfAxiom): List[Rule] = { 426 private def rules1(axiom: OWLSubClassOfAxiom): List[Rule] = {
427 val unfold = ontology.unfold(axiom).toList 427 val unfold = ontology.unfold(axiom).toList
428 // Fresh Variables 428 // Fresh Variables
429 val v0 = IRI.create("v0_" ++ axiom.hashCode.toString) 429 val v0 = RSA.internal("v0_" ++ axiom.hashCode.toString)
430 val varX = Variable.create("X") 430 val varX = Variable.create("X")
431 // Predicates 431 // Predicates
432 val atomA: TupleTableAtom = { 432 val atomA: TupleTableAtom = {
433 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 433 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI
434 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, cls) 434 TupleTableAtom.rdf(varX, IRI.RDF_TYPE, cls)
435 } 435 }
436 def notIn(t: Term): TupleTableAtom = { 436 def in(t: Term): TupleTableAtom = {
437 TupleTableAtom.rdf( 437 TupleTableAtom.rdf(
438 t, 438 t,
439 RSA.internal("notIn"), 439 RSA.internal("IN"),
440 RSA.internal(unfold.hashCode.toString) 440 RSA.internal(unfold.hashCode.toString)
441 ) 441 )
442 } 442 }
443 def notIn(t: Term): Negation = Negation.create(in(t))
443 val roleRf: TupleTableAtom = { 444 val roleRf: TupleTableAtom = {
444 val visitor = 445 val visitor =
445 new RDFoxPropertyExprConverter(varX, v0, RSASuffix.Forward) 446 new RDFoxPropertyExprConverter(varX, v0, RSASuffix.Forward)
@@ -461,7 +462,7 @@ trait RSAOntology {
461 // returning facts as `Rule`s with true body. While this is correct 462 // returning facts as `Rule`s with true body. While this is correct
462 // there is an easier way to import facts into RDFox. Are we able to 463 // there is an easier way to import facts into RDFox. Are we able to
463 // do that? 464 // do that?
464 val facts = unfold.map(x => Rule.create(notIn(x))) 465 val facts = unfold.map(x => Rule.create(in(x)))
465 val rules = List( 466 val rules = List(
466 Rule.create(roleRf, atomA, notIn(varX)), 467 Rule.create(roleRf, atomA, notIn(varX)),
467 Rule.create(atomB, atomA, notIn(varX)) 468 Rule.create(atomB, atomA, notIn(varX))
@@ -476,9 +477,9 @@ trait RSAOntology {
476 .getProperty 477 .getProperty
477 if (ontology.confl(roleR) contains roleR) { 478 if (ontology.confl(roleR) contains roleR) {
478 // Fresh Variables 479 // Fresh Variables
479 val v0 = IRI.create("v0_" ++ axiom.hashCode.toString) 480 val v0 = RSA.internal("v0_" ++ axiom.hashCode.toString)
480 val v1 = IRI.create("v1_" ++ axiom.hashCode.toString) 481 val v1 = RSA.internal("v1_" ++ axiom.hashCode.toString)
481 val v2 = IRI.create("v2_" ++ axiom.hashCode.toString) 482 val v2 = RSA.internal("v2_" ++ axiom.hashCode.toString)
482 // Predicates 483 // Predicates
483 def atomA(t: Term): TupleTableAtom = { 484 def atomA(t: Term): TupleTableAtom = {
484 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 485 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI
@@ -516,7 +517,7 @@ trait RSAOntology {
516 .asInstanceOf[OWLObjectSomeValuesFrom] 517 .asInstanceOf[OWLObjectSomeValuesFrom]
517 .getProperty 518 .getProperty
518 // Fresh Variables 519 // Fresh Variables
519 val v1 = IRI.create("v1_" ++ axiom.hashCode.toString) 520 val v1 = RSA.internal("v1_" ++ axiom.hashCode.toString)
520 // Predicates 521 // Predicates
521 def atomA(t: Term): TupleTableAtom = { 522 def atomA(t: Term): TupleTableAtom = {
522 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI 523 val cls = axiom.getSubClass.asInstanceOf[OWLClass].getIRI