aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/rsacomb/RSAOntology.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/rsacomb/RSAOntology.scala')
-rw-r--r--src/main/scala/rsacomb/RSAOntology.scala95
1 files changed, 74 insertions, 21 deletions
diff --git a/src/main/scala/rsacomb/RSAOntology.scala b/src/main/scala/rsacomb/RSAOntology.scala
index 3b08e61..06752ef 100644
--- a/src/main/scala/rsacomb/RSAOntology.scala
+++ b/src/main/scala/rsacomb/RSAOntology.scala
@@ -2,7 +2,7 @@ package rsacomb
2 2
3/* Java imports */ 3/* Java imports */
4import java.util.HashMap 4import java.util.HashMap
5import java.util.stream.{Collectors,Stream} 5import java.util.stream.{Collectors, Stream}
6 6
7import org.semanticweb.owlapi.model.OWLOntology 7import org.semanticweb.owlapi.model.OWLOntology
8import org.semanticweb.owlapi.model.OWLObjectPropertyExpression 8import org.semanticweb.owlapi.model.OWLObjectPropertyExpression
@@ -13,7 +13,6 @@ import tech.oxfordsemantic.jrdfox.Prefixes
13import tech.oxfordsemantic.jrdfox.logic.Variable 13import tech.oxfordsemantic.jrdfox.logic.Variable
14import tech.oxfordsemantic.jrdfox.client.UpdateType 14import tech.oxfordsemantic.jrdfox.client.UpdateType
15 15
16
17/* Scala imports */ 16/* Scala imports */
18import scala.collection.JavaConverters._ 17import scala.collection.JavaConverters._
19 18
@@ -42,9 +41,14 @@ trait RSAOntology {
42 * step of approximation of an Horn-ALCHOIQ to RSA 41 * step of approximation of an Horn-ALCHOIQ to RSA
43 */ 42 */
44 43
45 val tbox = 44 val tbox =
46 Stream.concat(ontology.tboxAxioms(Imports.INCLUDED), ontology.rboxAxioms(Imports.INCLUDED)) 45 Stream
47 .collect(Collectors.toList()).asScala 46 .concat(
47 ontology.tboxAxioms(Imports.INCLUDED),
48 ontology.rboxAxioms(Imports.INCLUDED)
49 )
50 .collect(Collectors.toList())
51 .asScala
48 val unsafe = ontology.getUnsafeRoles 52 val unsafe = ontology.getUnsafeRoles
49 53
50 /* DEBUG: print rules in DL syntax */ 54 /* DEBUG: print rules in DL syntax */
@@ -55,18 +59,29 @@ trait RSAOntology {
55 /* Ontology convertion into LP rules */ 59 /* Ontology convertion into LP rules */
56 val datalog = for { 60 val datalog = for {
57 axiom <- tbox 61 axiom <- tbox
58 visitor = new RDFoxAxiomConverter(Variable.create("x"), SkolemStrategy.ConstantRSA(axiom.toString), unsafe) 62 visitor = new RDFoxAxiomConverter(
59 rule <- axiom.accept(visitor) 63 Variable.create("x"),
64 SkolemStrategy.ConstantRSA(axiom.toString),
65 unsafe
66 )
67 rule <- axiom.accept(visitor)
60 } yield rule 68 } yield rule
61 69
62 val prefixes = new Prefixes() 70 val prefixes = new Prefixes()
63 prefixes.declarePrefix(":", "http://example.com/rsa_example.owl#") 71 prefixes.declarePrefix(":", "http://example.com/rsa_example.owl#")
72 prefixes.declarePrefix(
73 "rdf:",
74 "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
75 )
76 prefixes.declarePrefix("rdfs:", "http://www.w3.org/2000/01/rdf-schema#")
77 prefixes.declarePrefix("owl:", "http://www.w3.org/2002/07/owl#")
64 78
65 // Open connection with RDFox 79 // Open connection with RDFox
66 val (server,data) = RDFox.openConnection("RSACheck") 80 val (server, data) = RDFoxUtil.openConnection("RSACheck")
67 // Add Data (hardcoded for now) 81 // Add Data (hardcoded for now)
68 data.importData(UpdateType.ADDITION, prefixes,":a a :A .") 82 data.importData(UpdateType.ADDITION, prefixes, ":a a :A .")
69 /* Add Datalog rules 83
84 /* Add rules
70 * 85 *
71 * NOTE: 86 * NOTE:
72 * - using the `addRules(...)` method in `DataStoreConnection` is not working as expected, complaining 87 * - using the `addRules(...)` method in `DataStoreConnection` is not working as expected, complaining
@@ -76,18 +91,45 @@ trait RSAOntology {
76 * for predicate arguments (e.g., `<predicate>(?X,?Y)`) while the specification for the proprietary RDFox 91 * for predicate arguments (e.g., `<predicate>(?X,?Y)`) while the specification for the proprietary RDFox
77 * syntax uses squared brackets (e.g., `<preditate>[?X,?Y]`). 92 * syntax uses squared brackets (e.g., `<preditate>[?X,?Y]`).
78 */ 93 */
94
95 /* Add built-in rules
96 */
97 data.importData(
98 UpdateType.ADDITION,
99 prefixes,
100 "<internal:E>[?X,?Y] :- <internal:PE>[?X,?Y], <internal:U>[?X], <internal:U>[?Y] ."
101 )
102
103 /* Add ontology rules
104 */
79 data.importData( 105 data.importData(
80 UpdateType.ADDITION, 106 UpdateType.ADDITION,
81 prefixes, 107 prefixes,
82 datalog.foldLeft("")((str,rule) => str ++ "\n" ++ rule.toString().replace("(", "[").replace(")","]")) 108 datalog.foldLeft("")((str, rule) =>
109 str ++ "\n" ++ rule.toString().replace("(", "[").replace(")", "]")
110 )
83 ) 111 )
84 112
85 // Retrieve all instances of PE 113 // Retrieve all instances of PE
86 println("\nQuery results:") 114 println("\nQuery results:")
87 data.evaluateQuery(prefixes,"SELECT ?X ?Y WHERE { ?X <internal:PE> ?Y }", new HashMap[String,String](), System.out, "text/csv"); 115 data.evaluateQuery(
116 prefixes,
117 "SELECT ?X ?Y WHERE { ?X <internal:PE> ?Y }",
118 new HashMap[String, String](),
119 System.out,
120 "text/csv"
121 );
122
123 data.evaluateQuery(
124 prefixes,
125 "SELECT ?X ?Y WHERE { ?X <internal:E> ?Y }",
126 new HashMap[String, String](),
127 System.out,
128 "text/csv"
129 );
88 130
89 // Close connection to RDFox 131 // Close connection to RDFox
90 RDFox.closeConnection(server,data) 132 RDFoxUtil.closeConnection(server, data)
91 133
92 /* DEBUG */ 134 /* DEBUG */
93 true 135 true
@@ -98,13 +140,16 @@ trait RSAOntology {
98 val factory = new StructuralReasonerFactory() 140 val factory = new StructuralReasonerFactory()
99 val reasoner = factory.createReasoner(ontology) 141 val reasoner = factory.createReasoner(ontology)
100 142
101 val tbox = ontology.tboxAxioms(Imports.INCLUDED).collect(Collectors.toSet()).asScala 143 val tbox = ontology
144 .tboxAxioms(Imports.INCLUDED)
145 .collect(Collectors.toSet())
146 .asScala
102 147
103 /* DEBUG: print rules in DL syntax */ 148 /* DEBUG: print rules in DL syntax */
104 //val renderer = new DLSyntaxObjectRenderer() 149 //val renderer = new DLSyntaxObjectRenderer()
105 150
106 /* Checking for (1) unsafety condition: 151 /* Checking for (1) unsafety condition:
107 * 152 *
108 * For all roles r1 appearing in an axiom of type T5, r1 is unsafe 153 * For all roles r1 appearing in an axiom of type T5, r1 is unsafe
109 * if there exists a role r2 (different from top) appearing in an axiom 154 * if there exists a role r2 (different from top) appearing in an axiom
110 * of type T3 and r1 is a subproperty of the inverse of r2. 155 * of type T3 and r1 is a subproperty of the inverse of r2.
@@ -113,11 +158,15 @@ trait RSAOntology {
113 axiom <- tbox 158 axiom <- tbox
114 if axiom.isT5 159 if axiom.isT5
115 role1 <- axiom.objectPropertyExpressionsInSignature 160 role1 <- axiom.objectPropertyExpressionsInSignature
116 roleSuper = role1 +: reasoner.superObjectProperties(role1).collect(Collectors.toList()).asScala 161 roleSuper =
162 role1 +: reasoner
163 .superObjectProperties(role1)
164 .collect(Collectors.toList())
165 .asScala
117 roleSuperInv = roleSuper.map(_.getInverseProperty) 166 roleSuperInv = roleSuper.map(_.getInverseProperty)
118 axiom <- tbox 167 axiom <- tbox
119 if axiom.isT3 && !axiom.isT3top 168 if axiom.isT3 && !axiom.isT3top
120 role2 <- axiom.objectPropertyExpressionsInSignature 169 role2 <- axiom.objectPropertyExpressionsInSignature
121 if roleSuperInv.contains(role2) 170 if roleSuperInv.contains(role2)
122 } yield role1 171 } yield role1
123 172
@@ -126,17 +175,21 @@ trait RSAOntology {
126 * For all roles p1 appearing in an axiom of type T5, p1 is unsafe if 175 * For all roles p1 appearing in an axiom of type T5, p1 is unsafe if
127 * there exists a role p2 appearing in an axiom of type T4 and p1 is a 176 * there exists a role p2 appearing in an axiom of type T4 and p1 is a
128 * subproperty of either p2 or the inverse of p2. 177 * subproperty of either p2 or the inverse of p2.
129 * 178 *
130 */ 179 */
131 val unsafe2 = for { 180 val unsafe2 = for {
132 axiom <- tbox 181 axiom <- tbox
133 if axiom.isT5 182 if axiom.isT5
134 role1 <- axiom.objectPropertyExpressionsInSignature 183 role1 <- axiom.objectPropertyExpressionsInSignature
135 roleSuper = role1 +: reasoner.superObjectProperties(role1).collect(Collectors.toList()).asScala 184 roleSuper =
185 role1 +: reasoner
186 .superObjectProperties(role1)
187 .collect(Collectors.toList())
188 .asScala
136 roleSuperInv = roleSuper.map(_.getInverseProperty) 189 roleSuperInv = roleSuper.map(_.getInverseProperty)
137 axiom <- tbox 190 axiom <- tbox
138 if axiom.isT4 191 if axiom.isT4
139 role2 <- axiom.objectPropertyExpressionsInSignature 192 role2 <- axiom.objectPropertyExpressionsInSignature
140 if roleSuper.contains(role2) || roleSuperInv.contains(role2) 193 if roleSuper.contains(role2) || roleSuperInv.contains(role2)
141 } yield role1 194 } yield role1
142 195
@@ -149,4 +202,4 @@ trait RSAOntology {
149 202
150 } // implicit class RSAOntology 203 } // implicit class RSAOntology
151 204
152} // trait RSAOntology \ No newline at end of file 205} // trait RSAOntology