206 skiprels=('is', 'is_instance_of', 'identity', |
188 skiprels=('is', 'is_instance_of', 'identity', |
207 'owned_by', 'created_by'), |
189 'owned_by', 'created_by'), |
208 skipmeta=skipmeta) |
190 skipmeta=skipmeta) |
209 self.w(ureport_as_html(layout)) |
191 self.w(ureport_as_html(layout)) |
210 |
192 |
211 |
|
212 class OWLView(StartupView): |
|
213 id = 'owl' |
|
214 title = _('owl') |
|
215 templatable =False |
|
216 |
|
217 def call(self): |
|
218 skipmeta = int(self.req.form.get('skipmeta', True)) |
|
219 self.visit_schemaOWL(display_relations=True, |
|
220 skiprels=('is', 'is_instance_of', 'identity', |
|
221 'owned_by', 'created_by'), |
|
222 skipmeta=skipmeta) |
|
223 |
|
224 |
|
225 def visit_schemaOWL(self, display_relations=0, |
|
226 skiprels=(), skipmeta=True): |
|
227 """get a layout for a whole schema""" |
|
228 self.w(u'''<?xml version="1.0" encoding="UTF-8"?> |
|
229 <!DOCTYPE rdf:RDF [ |
|
230 <!ENTITY owl "http://www.w3.org/2002/07/owl#" > |
|
231 <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > |
|
232 <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > |
|
233 <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" > |
|
234 <!ENTITY %s "http://logilab.org/owl/ontologies/%s#" > |
|
235 |
|
236 ]> |
|
237 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
|
238 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" |
|
239 xmlns:xsd="http://www.w3.org/2001/XMLSchema#" |
|
240 xmlns:owl="http://www.w3.org/2002/07/owl#" |
|
241 xmlns="http://logilab.org/owl/ontologies/%s#" |
|
242 xmlns:%s="http://logilab.org/owl/ontologies/%s#" |
|
243 xml:base="http://logilab.org/owl/ontologies/%s"> |
|
244 |
|
245 <owl:Ontology rdf:about=""> |
|
246 <rdfs:comment> |
|
247 %s Cubicweb OWL Ontology |
|
248 |
|
249 </rdfs:comment> |
|
250 </owl:Ontology> |
|
251 ''' % (self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name)) |
|
252 entities = [eschema for eschema in self.schema.entities() |
|
253 if not eschema.is_final()] |
|
254 if skipmeta: |
|
255 entities = [eschema for eschema in entities |
|
256 if not eschema.meta] |
|
257 keys = [(eschema.type, eschema) for eschema in entities] |
|
258 self.w(u'<!-- classes definition -->') |
|
259 for key, eschema in sorted(keys): |
|
260 self.visit_entityschemaOWL(eschema, skiprels) |
|
261 self.w(u'<!-- property definition -->') |
|
262 self.w(u'<!-- object property -->') |
|
263 for key, eschema in sorted(keys): |
|
264 self.visit_property_schemaOWL(eschema, skiprels) |
|
265 self.w(u'<!-- datatype property -->') |
|
266 for key, eschema in sorted(keys): |
|
267 self.visit_property_object_schemaOWL(eschema, skiprels) |
|
268 self.w(u'</rdf:RDF>') |
|
269 |
|
270 def eschema_link_url(self, eschema): |
|
271 return self.req.build_url('eetype/%s?vid=eschema' % eschema) |
|
272 |
|
273 def rschema_link_url(self, rschema): |
|
274 return self.req.build_url('ertype/%s?vid=eschema' % rschema) |
|
275 |
|
276 def possible_views(self, etype): |
|
277 rset = self.req.etype_rset(etype) |
|
278 return [v for v in self._possible_views(self.req, rset) |
|
279 if v.category != 'startupview'] |
|
280 |
|
281 def stereotype(self, name): |
|
282 return Span((' <<%s>>' % name,), klass='stereotype') |
|
283 |
|
284 def visit_entityschemaOWL(self, eschema, skiprels=()): |
|
285 """get a layout for an entity OWL schema""" |
|
286 etype = eschema.type |
|
287 |
|
288 if eschema.meta: |
|
289 self.stereotype('meta') |
|
290 self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/> |
|
291 '''%eschema, stereotype) |
|
292 else: |
|
293 self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/> |
|
294 '''% eschema) |
|
295 |
|
296 self.w(u'<!-- relations -->') |
|
297 for rschema, targetschemas, role in eschema.relation_definitions(): |
|
298 if rschema.type in skiprels: |
|
299 continue |
|
300 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
|
301 continue |
|
302 for oeschema in targetschemas: |
|
303 label = rschema.type |
|
304 if role == 'subject': |
|
305 card = rschema.rproperty(eschema, oeschema, 'cardinality')[0] |
|
306 else: |
|
307 card = rschema.rproperty(oeschema, eschema, 'cardinality')[1] |
|
308 self.w(u'''<rdfs:subClassOf> |
|
309 <owl:Restriction> |
|
310 <owl:onProperty rdf:resource="#%s"/> |
|
311 %s |
|
312 </owl:Restriction> |
|
313 </rdfs:subClassOf> |
|
314 ''' % (label, OWL_CARD_MAP[card])) |
|
315 |
|
316 self.w(u'<!-- attributes -->') |
|
317 |
|
318 for rschema, aschema in eschema.attribute_definitions(): |
|
319 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
|
320 continue |
|
321 aname = rschema.type |
|
322 if aname == 'eid': |
|
323 continue |
|
324 card_data = aschema.type |
|
325 self.w(u'''<rdfs:subClassOf> |
|
326 <owl:Restriction> |
|
327 <owl:onProperty rdf:resource="#%s"/> |
|
328 <rdf:type rdf:resource="&owl;FunctionalProperty"/> |
|
329 </owl:Restriction> |
|
330 </rdfs:subClassOf>''' |
|
331 |
|
332 % aname) |
|
333 self.w(u'</owl:Class>') |
|
334 |
|
335 def visit_property_schemaOWL(self, eschema, skiprels=()): |
|
336 """get a layout for property entity OWL schema""" |
|
337 etype = eschema.type |
|
338 |
|
339 for rschema, targetschemas, role in eschema.relation_definitions(): |
|
340 if rschema.type in skiprels: |
|
341 continue |
|
342 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
|
343 continue |
|
344 rschemaurl = self.rschema_link_url(rschema) |
|
345 for oeschema in targetschemas: |
|
346 label = rschema.type |
|
347 self.w(u'''<owl:ObjectProperty rdf:ID="%s"> |
|
348 <rdfs:domain rdf:resource="#%s"/> |
|
349 <rdfs:range rdf:resource="#%s"/> |
|
350 </owl:ObjectProperty> |
|
351 |
|
352 ''' % (label, eschema, oeschema.type )) |
|
353 |
|
354 def visit_property_object_schemaOWL(self, eschema, skiprels=()): |
|
355 |
|
356 for rschema, aschema in eschema.attribute_definitions(): |
|
357 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
|
358 continue |
|
359 aname = rschema.type |
|
360 if aname == 'eid': |
|
361 continue |
|
362 card_data = aschema.type |
|
363 self.w(u'''<owl:DatatypeProperty rdf:ID="%s"> |
|
364 <rdfs:domain rdf:resource="#%s"/> |
|
365 <rdfs:range rdf:resource="%s"/> |
|
366 </owl:DatatypeProperty>''' |
|
367 % (aname, eschema, OWL_CARD_MAP_DATA[card_data])) |
|
368 |
|
369 |
|