Changeset 136
- Timestamp:
- 05/26/08 15:26:01 (4 years ago)
- Location:
- rdfalchemy/trunk
- Files:
-
- 2 added
- 5 modified
-
rdfalchemy/descriptors.py (modified) (8 diffs)
-
rdfalchemy/__init__.py (modified) (1 diff)
-
rdfalchemy/rdfsSubject.py (modified) (5 diffs)
-
rdfalchemy/rdfSubject.py (modified) (2 diffs)
-
test/locale_test.py (added)
-
test/subclass_test.py (modified) (2 diffs)
-
test/subDocument_test.py (added)
Legend:
- Unmodified
- Added
- Removed
-
rdfalchemy/trunk/rdfalchemy/descriptors.py
r132 r136 15 15 import logging 16 16 17 __all__=["rdfSingle","rdfMultiple","rdfList","rdfContainer" ]17 __all__=["rdfSingle","rdfMultiple","rdfList","rdfContainer","owlTransitive"] 18 18 19 19 #console = logging.StreamHandler() … … 82 82 # each one will map an attribute of a class (derived from rdfObjet) to a predicate 83 83 ################################################################################## 84 84 85 85 86 class rdfAbstract(object): … … 167 168 return obj.__dict__[self.name] 168 169 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())) 169 171 # check to see if this is a Container or Collection 170 172 # if so, return collection as a list … … 173 175 val=getList(obj, self.pred) 174 176 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 twice177 177 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()))182 178 return val 183 179 … … 201 197 obj.__dict__[self.name] = copy(newvals) 202 198 199 class 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 228 class 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] 203 242 204 243 class rdfList(rdfMultiple): … … 206 245 Expects to return a list of values (could be a list of one) 207 246 `__set__` will set the predicate as a RDF List''' 247 208 248 def __init__(self, pred, range_type=None): 209 249 super(rdfMultiple, self).__init__(pred, range_type) … … 273 313 '''This is a Discriptor 274 314 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 275 322 `__set__` will set the predicate as a RDF Container type (defaults to rdf:Seq)''' 323 276 324 def __init__(self, pred, range_type=None, container_type="http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq"): 277 325 super(rdfMultiple, self).__init__(pred, range_type) … … 320 368 obj.db.add((seq, RDF['_%i'%(i+1)], value2object(newvals[i]))) 321 369 obj.__dict__[self.name] = copy(newvals) 322 370 371 ################################################################################# 372 # More owl-ish and rdfs-ish descriptors 373 374 class 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 1 1 from rdflib import URIRef, BNode, Namespace, RDF, RDFS 2 from rdfalchemy.Literal import Literal3 from rdf alchemy.rdfSubject import rdfSubject4 from rdfalchemy.descriptors import *2 from Literal import Literal 3 from rdfSubject import rdfSubject 4 from descriptors import * 5 5 6 from rdfalchemy.engine import create_engine, engine_from_config6 from engine import create_engine, engine_from_config 7 7 8 8 __version__="0.2b2" -
rdfalchemy/trunk/rdfalchemy/rdfsSubject.py
r135 r136 13 13 """ 14 14 15 from rdfalchemy import rdfSubject, rdfSingle, rdfMultiple, RDF, RDFS, Namespace 16 from rdfalchemy.orm import mapper, allsub 15 from rdfalchemy import rdfSubject, RDF, RDFS, Namespace 16 from descriptors import * 17 from orm import mapper, allsub 18 19 from weakref import WeakValueDictionary 17 20 import re 18 21 … … 21 24 _all_ = ['rdfsSubject','rdfsClass','rdfsProperty', 22 25 'owlObjectProperty','owlDatatypeProperty', 26 'owlSymetricProperty', 'owlTransitiveProperty' 23 27 'owlFunctionalProperty','owlInverseFunctionalProperty'] 24 28 … … 28 32 29 33 class rdfsSubject(rdfSubject): 34 __weakrefs = WeakValueDictionary() 30 35 31 36 def _splitname(self): … … 84 89 # this doesn't get the rdfsProperty subclasses 85 90 # return list(rdfsProperty.filter_by(domain=self.resUri)) 91 # TODO: why iterate all rdfsProperty subclasses 92 # try self.db.subjects(RDFS.domain,self.resUri) 86 93 return [x for x in rdfsProperty.ClassInstances() if x.domain == self] 94 87 95 88 96 … … 194 202 class owlTransitiveProperty(owlObjectProperty): 195 203 rdf_type = OWL.TransitiveProperty 196 default_descriptor = rdfMultiple 197 204 default_descriptor = owlTransitive 198 205 199 206 # this maps the return type of subClassOf back to rdfsClass -
rdfalchemy/trunk/rdfalchemy/rdfSubject.py
r132 r136 132 132 that is of type owl:InverseFunctional""" 133 133 if len(kwargs) != 1: 134 raise ValueError("get_by wanted e aactly 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))) 135 135 key,value = kwargs.items()[0] 136 136 if isinstance(value, URIRef) or isinstance(value,BNode) or isinstance(value,Literal): … … 195 195 def GetRandom(cls): 196 196 """for develoment just returns a random instance of this class""" 197 from random import randint197 from random import choice 198 198 xii=list(cls.ClassInstances()) 199 return xii[randint(0,len(xii)-1)]199 return choice(xii) 200 200 201 201 def __repr__(self): -
rdfalchemy/trunk/test/subclass_test.py
r132 r136 43 43 44 44 def subclass_testLen1(): 45 "Test these things that are just rdfSubject ... no inferencing" 45 46 assert len(list(A.ClassInstances())) == 2 46 47 assert len(list(B.ClassInstances())) == 2 47 48 48 49 def subclass_testLen2(): 50 "Test these things that are just rdfSubject ... no inferencing" 49 51 assert len(list(C.ClassInstances())) == 1 50 52 assert len(list(D.ClassInstances())) == 3 … … 75 77 76 78 def ssubclass_testLen1(): 79 "Test these things that are rdfSSubject ... with inferencing" 77 80 assert len(list(As.ClassInstances())) == 2, len(list(As.ClassInstances())) 78 81 assert len(list(Bs.ClassInstances())) == 6, len(list(Bs.ClassInstances())) 79 82 80 83 def ssubclass_testLen2(): 84 "Test these things that are rdfsSubject ... with inferencing" 81 85 assert len(list(Cs.ClassInstances())) == 4, len(list(Cs.ClassInstances())) 82 86 assert len(list(Ds.ClassInstances())) == 3, len(list(Ds.ClassInstances()))
