OwlView generated a owl layout from schema application. It can be registered with an owl extension.
authorLaure Bourgois <Laure.Bourgois@logilab.fr>
Wed, 21 Jan 2009 14:35:15 +0100
changeset 452 8dd71540902f
parent 451 1261226552ec
child 453 d1b72b31e315
OwlView generated a owl layout from schema application. It can be registered with an owl extension.
web/views/startup.py
--- a/web/views/startup.py	Wed Jan 21 08:37:32 2009 +0100
+++ b/web/views/startup.py	Wed Jan 21 14:35:15 2009 +0100
@@ -15,6 +15,25 @@
 
 _ = unicode
 
+OWL_CARD_MAP = {'1': '''<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+                        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>''',
+                '?': '<owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>',
+                '+': '<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>',
+                '*': '<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">n</owl:cardinality>'
+                }
+
+OWL_CARD_MAP_DATA = {'String': 'xsd:string',
+                     'Datetime': 'xsd:dateTime',
+                     'Bytes': 'xsd:byte',
+                     'Float': 'xsd:float',
+                     'Boolean': 'xsd:boolean',
+                     'Int': 'xsd:int',
+                     'Date':'xsd:date',
+                     'Time': 'xsd:time',
+                     'Password': 'xsd:byte',
+                     'Decimal' : 'xsd:decimal',
+                     'Interval': 'xsd:duration'
+                     }
 
 class ManageView(StartupView):
     id = 'manage'
@@ -190,3 +209,164 @@
                                      skipmeta=skipmeta)
         self.w(ureport_as_html(layout))
 
+
+class OWLView(StartupView):
+    id = 'owl'
+    title = _('owl')
+    templatable =False
+
+    def call(self):
+        skipmeta = int(self.req.form.get('skipmeta', True))
+        self.visit_schemaOWL(display_relations=True,
+                             skiprels=('is', 'is_instance_of', 'identity',
+                                       'owned_by', 'created_by'),
+                             skipmeta=skipmeta)
+
+
+    def visit_schemaOWL(self, display_relations=0,
+                     skiprels=(), skipmeta=True):
+        """get a layout for a whole schema"""
+        self.w(u'''<?xml version="1.0" encoding="UTF-8"?>
+        <!DOCTYPE rdf:RDF [
+        <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
+        <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
+        <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
+        <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
+        <!ENTITY %s "http://logilab.org/owl/ontologies/%s#" >
+        
+        ]>        
+        <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+            xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+            xmlns:owl="http://www.w3.org/2002/07/owl#"
+            xmlns="http://logilab.org/owl/ontologies/%s#"
+            xmlns:%s="http://logilab.org/owl/ontologies/%s#"
+            xml:base="http://logilab.org/owl/ontologies/%s#">
+
+    <owl:Ontology rdf:about="">
+        <rdfs:comment>
+        Cubicweb OWL Ontology                           
+      Author: Laure Bourgois                                   
+        </rdfs:comment>
+        ''' % (self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name))
+        entities = [eschema for eschema in self.schema.entities()
+                    if not eschema.is_final()]
+        if skipmeta:
+            entities = [eschema for eschema in entities
+                        if not eschema.meta]
+        keys = [(eschema.type, eschema) for eschema in entities]
+        self.w(u'<!-- classes definition -->')
+        for key, eschema in sorted(keys):
+            self.visit_entityschemaOWL(eschema, skiprels)
+        self.w(u'<!-- property definition -->')
+        self.w(u'<!-- object property -->')
+        for key, eschema in sorted(keys):
+             self.visit_property_schemaOWL(eschema, skiprels)
+        self.w(u'<!-- datatype property -->')
+        for key, eschema in sorted(keys):
+            self.visit_property_object_schemaOWL(eschema, skiprels)
+        self.w(u' </owl:Ontology></rdf:RDF>')
+           
+    def eschema_link_url(self, eschema):
+        return self.req.build_url('eetype/%s?vid=eschema' % eschema)
+    
+    def rschema_link_url(self, rschema):
+        return self.req.build_url('ertype/%s?vid=eschema' % rschema)
+
+    def possible_views(self, etype):
+        rset = self.req.etype_rset(etype)
+        return [v for v in self._possible_views(self.req, rset)
+                if v.category != 'startupview']
+
+    def stereotype(self, name):
+        return Span((' <<%s>>' % name,), klass='stereotype')
+                       
+    def visit_entityschemaOWL(self, eschema, skiprels=()):
+        """get a layout for an entity OWL schema"""
+        etype = eschema.type
+        
+        if eschema.meta:
+            self.stereotype('meta')
+            self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
+                                '''%eschema, stereotype)
+        else:
+             self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
+                                '''% eschema)         
+       
+        self.w(u'<!-- relations -->')    
+        for rschema, targetschemas, role in eschema.relation_definitions():
+            if rschema.type in skiprels:
+                continue
+            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
+                continue
+            for oeschema in targetschemas:
+                label = rschema.type
+                if role == 'subject':
+                    card = rschema.rproperty(eschema, oeschema, 'cardinality')[0]
+                else:
+                    card = rschema.rproperty(oeschema, eschema, 'cardinality')[1]
+                self.w(u'''<rdfs:subClassOf>
+                              <owl:Restriction>
+                              <owl:onProperty rdf:resource="#%s"/>
+                                %s
+                              </owl:Restriction>
+                           </rdfs:subClassOf>
+                                ''' % (label, OWL_CARD_MAP[card]))
+
+        self.w(u'<!-- attributes -->')
+              
+        for rschema, aschema in eschema.attribute_definitions():
+            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
+                continue
+            aname = rschema.type
+            if aname == 'eid':
+                continue
+            card_data = aschema.type
+            self.w(u'''<rdfs:subClassOf>
+                              <owl:Restriction>
+                                  <owl:onProperty rdf:resource="#%s"/>
+                                  <owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
+                              </owl:Restriction>
+                        </rdfs:subClassOf>'''
+                          
+                   % aname)
+        self.w(u'</owl:Class>')
+      
+    def visit_property_schemaOWL(self, eschema, skiprels=()):
+        """get a layout for property entity OWL schema"""
+        etype = eschema.type
+
+        for rschema, targetschemas, role in eschema.relation_definitions():
+            if rschema.type in skiprels:
+                continue
+            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
+                continue
+            rschemaurl = self.rschema_link_url(rschema)
+            for oeschema in targetschemas:
+                label = rschema.type
+                self.w(u'''<owl:ObjectProperty rdf:ID="%s">
+                              <rdfs:domain rdf:resource="#%s"/>
+                              <rdfs:range rdf:resource="#%s"/>
+                           </owl:ObjectProperty>                   
+                             
+                                ''' % (label, eschema, oeschema.type ))
+
+    def visit_property_object_schemaOWL(self, eschema, skiprels=()):
+               
+        for rschema, aschema in eschema.attribute_definitions():
+            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
+                continue
+            aname = rschema.type
+            if aname == 'eid':
+                continue
+            card_data = aschema.type
+            self.w(u'''<owl:DatatypeProperty rdf:ID="%s">
+                          <rdfs:domain rdf:resource="#%s"/>
+                          <rdfs:range rdf:resource="%s"/>
+                       </owl:DatatypeProperty>'''
+                   % (aname, eschema, OWL_CARD_MAP_DATA[card_data]))
+# <owl:DatatypeProperty rdf:ID="%s"/>
+# </owl:DatatypeProperty>
+
+        
+