Changeset 136

Show
Ignore:
Timestamp:
05/26/08 15:26:01 (4 years ago)
Author:
phil
Message:

RDFAlchemy added descriptors for locale and some tests

Location:
rdfalchemy/trunk
Files:
2 added
5 modified

Legend:

Unmodified
Added
Removed
  • rdfalchemy/trunk/rdfalchemy/descriptors.py

    r132 r136  
    1515import logging 
    1616 
    17 __all__=["rdfSingle","rdfMultiple","rdfList","rdfContainer"] 
     17__all__=["rdfSingle","rdfMultiple","rdfList","rdfContainer","owlTransitive"] 
    1818 
    1919#console = logging.StreamHandler() 
     
    8282# each one will map an attribute of a class (derived from rdfObjet) to a predicate  
    8383################################################################################## 
     84 
    8485 
    8586class rdfAbstract(object): 
     
    167168            return obj.__dict__[self.name] 
    168169        val=[o for o in obj.db.objects(obj.resUri, self.pred)] 
     170        log.debug("Geting with descriptor %s for %s"%(self.pred,obj.n3())) 
    169171        # check to see if this is a Container or Collection 
    170172        # if so, return collection as a list 
     
    173175                  val=getList(obj, self.pred) 
    174176        val=[(isinstance(v, (BNode,URIRef)) and self.range_class(v) or v.toPython()) for v in val] 
    175         # ?? FIXME why does the debug statement show up twice?? 
    176         #setattr(obj, self.name, val) changed to next line 01/31/08  was calling twice 
    177177        obj.__dict__[self.name]= val 
    178         try: 
    179             log.debug("Geting %s for %s"%(obj.db.qname(self.pred),obj.db.qname(obj.resUri))) 
    180         except: 
    181             log.debug("Geting %s for %s"%(self.pred.n3(),obj.n3())) 
    182178        return val 
    183179 
     
    201197        obj.__dict__[self.name] = copy(newvals) 
    202198         
     199class rdfBest(rdfSingle): 
     200    '''This is a Discriptor  that returns one value that is the  
     201    "best" result out of possible multiple matches 
     202     
     203    returns a single value or None 
     204     
     205    It is the responsibility of the select_fun to return a default 
     206    like choices[0] if no "Best" is found''' 
     207     
     208    def __init__(self, pred, select_fun = None, cacheName=None, range_type=None ): 
     209        if select_fun: 
     210            self.select_fun = select_fun 
     211        super(rdfMultiple, self).__init__(pred, range_type) 
     212         
     213    def __get__(self, obj, cls): 
     214        if obj is None: 
     215            return self 
     216        if self.name in obj.__dict__: 
     217            return obj.__dict__[self.name] 
     218        log.debug("Geting with descriptor %s for %s"%(self.pred,obj.n3())) 
     219        vals=[o for o in obj.db.objects(obj.resUri, self.pred)] 
     220        if vals: 
     221            val = self.select_fun(vals) 
     222            val = isinstance(val, (BNode,URIRef)) and self.range_class(val) or val.toPython() 
     223        else: 
     224            val = None 
     225        obj.__dict__[self.name]= val 
     226        return val 
     227 
     228class rdfLocale(rdfBest): 
     229    '''This is like rdfBest with a predefined select_fun to select  
     230    from multiple choices like labels or comments and select the one 
     231    with the correct locale'''     
     232    def __init__(self, pred, lang, cacheName=None): 
     233        self.lang = lang 
     234        cacheNameLang = cacheName or ("%s@%s" % (pred, lang)) 
     235        super(rdfBest, self).__init__(pred,cacheName = cacheNameLang) 
     236 
     237    def select_fun(self, choices): 
     238        for x in choices: 
     239            if isinstance(x,Literal) and x.language==self.lang: 
     240                return x 
     241        return choices[0] 
    203242 
    204243class rdfList(rdfMultiple): 
     
    206245       Expects to return a list of values (could be a list of one) 
    207246       `__set__` will set the predicate as a RDF List''' 
     247        
    208248    def __init__(self, pred, range_type=None): 
    209249        super(rdfMultiple, self).__init__(pred, range_type) 
     
    273313    '''This is a Discriptor     
    274314       Expects to return a list of values (could be a list of one) 
     315        
     316       container_type in `__init__` should be one of  
     317 
     318               * rdf:Seq 
     319               * rdf:Bag 
     320               * rdf:Alt 
     321                
    275322       `__set__` will set the predicate as a RDF Container type (defaults to rdf:Seq)''' 
     323 
    276324    def __init__(self, pred,  range_type=None, container_type="http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq"): 
    277325        super(rdfMultiple, self).__init__(pred,  range_type) 
     
    320368            obj.db.add((seq, RDF['_%i'%(i+1)], value2object(newvals[i]))) 
    321369        obj.__dict__[self.name] = copy(newvals) 
    322  
     370         
     371################################################################################# 
     372# More owl-ish and rdfs-ish descriptors 
     373 
     374class owlTransitive(rdfMultiple): 
     375    """owlTransitive is a descriptor based on a transitive predicate 
     376    The predicate should be of type owl:TransitiveProperty 
     377    """ 
     378         
     379    def __get__(self, obj, cls): 
     380        if obj is None: 
     381            return self 
     382        if self.name in obj.__dict__: 
     383            return obj.__dict__[self.name] 
     384        log.debug("Geting with descriptor %s for %s"%(self.pred,obj.n3())) 
     385        val=[self.range_class(o) for o in obj.db.transitive_objects(obj.resUri, self.pred)] 
     386        obj.__dict__[self.name]= val 
     387        return val 
  • rdfalchemy/trunk/rdfalchemy/__init__.py

    r130 r136  
    11from rdflib import URIRef, BNode, Namespace, RDF, RDFS 
    2 from rdfalchemy.Literal import Literal 
    3 from rdfalchemy.rdfSubject import rdfSubject 
    4 from rdfalchemy.descriptors import * 
     2from Literal import Literal 
     3from rdfSubject import rdfSubject 
     4from descriptors import * 
    55 
    6 from rdfalchemy.engine import create_engine, engine_from_config 
     6from engine import create_engine, engine_from_config 
    77 
    88__version__="0.2b2" 
  • rdfalchemy/trunk/rdfalchemy/rdfsSubject.py

    r135 r136  
    1313""" 
    1414 
    15 from rdfalchemy import rdfSubject, rdfSingle, rdfMultiple, RDF, RDFS, Namespace 
    16 from rdfalchemy.orm import mapper, allsub 
     15from rdfalchemy import  rdfSubject, RDF, RDFS, Namespace 
     16from descriptors import * 
     17from orm import mapper, allsub 
     18 
     19from weakref import WeakValueDictionary 
    1720import re 
    1821 
     
    2124_all_ = ['rdfsSubject','rdfsClass','rdfsProperty', 
    2225         'owlObjectProperty','owlDatatypeProperty', 
     26         'owlSymetricProperty', 'owlTransitiveProperty'        
    2327         'owlFunctionalProperty','owlInverseFunctionalProperty'] 
    2428 
     
    2832 
    2933class rdfsSubject(rdfSubject): 
     34    __weakrefs = WeakValueDictionary() 
    3035     
    3136    def _splitname(self): 
     
    8489        # this doesn't get the rdfsProperty subclasses 
    8590        # return list(rdfsProperty.filter_by(domain=self.resUri)) 
     91        # TODO: why iterate all rdfsProperty subclasses 
     92        #       try self.db.subjects(RDFS.domain,self.resUri) 
    8693        return [x for x in rdfsProperty.ClassInstances() if x.domain == self] 
     94         
    8795         
    8896     
     
    194202class owlTransitiveProperty(owlObjectProperty): 
    195203    rdf_type = OWL.TransitiveProperty 
    196     default_descriptor = rdfMultiple 
    197          
     204    default_descriptor = owlTransitive 
    198205     
    199206# this maps the return type of subClassOf back to rdfsClass 
  • rdfalchemy/trunk/rdfalchemy/rdfSubject.py

    r132 r136  
    132132            that is of type owl:InverseFunctional""" 
    133133        if len(kwargs) != 1: 
    134             raise ValueError("get_by wanted eaactly 1 but got  %i args\nMaybe you wanted filter_by"%(len(kwargs))) 
     134            raise ValueError("get_by wanted exactly 1 but got  %i args\nMaybe you wanted filter_by"%(len(kwargs))) 
    135135        key,value = kwargs.items()[0] 
    136136        if isinstance(value, URIRef) or isinstance(value,BNode) or isinstance(value,Literal): 
     
    195195    def GetRandom(cls): 
    196196        """for develoment just returns a random instance of this class""" 
    197         from random import randint 
     197        from random import choice 
    198198        xii=list(cls.ClassInstances()) 
    199         return xii[randint(0,len(xii)-1)] 
     199        return choice(xii) 
    200200         
    201201    def __repr__(self): 
  • rdfalchemy/trunk/test/subclass_test.py

    r132 r136  
    4343 
    4444def subclass_testLen1(): 
     45    "Test these things that are just rdfSubject ... no inferencing" 
    4546    assert len(list(A.ClassInstances())) == 2 
    4647    assert len(list(B.ClassInstances())) == 2     
    4748     
    4849def subclass_testLen2(): 
     50    "Test these things that are just rdfSubject ... no inferencing" 
    4951    assert len(list(C.ClassInstances())) == 1 
    5052    assert len(list(D.ClassInstances())) == 3     
     
    7577 
    7678def ssubclass_testLen1(): 
     79    "Test these things that are rdfSSubject ... with inferencing" 
    7780    assert len(list(As.ClassInstances())) == 2, len(list(As.ClassInstances())) 
    7881    assert len(list(Bs.ClassInstances())) == 6, len(list(Bs.ClassInstances()))     
    7982     
    8083def ssubclass_testLen2(): 
     84    "Test these things that are rdfsSubject ... with inferencing" 
    8185    assert len(list(Cs.ClassInstances())) == 4, len(list(Cs.ClassInstances())) 
    8286    assert len(list(Ds.ClassInstances())) == 3, len(list(Ds.ClassInstances()))