Changeset 91
- Timestamp:
- 02/04/08 10:31:17 (4 years ago)
- Location:
- rdfalchemy/trunk
- Files:
-
- 3 added
- 8 modified
-
rdfalchemy/descriptors.py (added)
-
rdfalchemy/engine/__init__.py (modified) (1 diff)
-
rdfalchemy/__init__.py (modified) (1 diff)
-
rdfalchemy/rdfalchemy.py (modified) (14 diffs)
-
rdfalchemy/samples/company.py (modified) (3 diffs)
-
rdfalchemy/samples/data/rdfalchemy_doap.n3 (modified) (2 diffs)
-
rdfalchemy/samples/doap.py (modified) (3 diffs)
-
rdfalchemy/samples/example.py (modified) (3 diffs)
-
rdfalchemy/samples/foaf.py (modified) (2 diffs)
-
test (added)
-
test/count_test.py (added)
Legend:
- Unmodified
- Added
- Removed
-
rdfalchemy/trunk/rdfalchemy/engine/__init__.py
r64 r91 14 14 for zodb: 15 15 the key in the Zope database is hardcoded as 'rdflib' 16 urls inding with .fsindicate FileStorage16 urls ending in `.fs` indicate FileStorage 17 17 otherwise ClientStoreage is assumed which requires 18 18 a ZEO Server to be running""" -
rdfalchemy/trunk/rdfalchemy/__init__.py
r59 r91 1 1 from rdfalchemy import * 2 from descriptors import * -
rdfalchemy/trunk/rdfalchemy/rdfalchemy.py
r89 r91 33 33 from rdflib import ConjunctiveGraph 34 34 from rdflib import Literal, BNode, Namespace, URIRef 35 from itertools import chain 35 from rdflib.Identifier import Identifier 36 from rdflib.exceptions import * 36 37 import re 38 39 try: 40 from hashlib import md5 41 except ImportError: 42 from md5 import md5 43 37 44 import logging 38 39 45 ##console = logging.StreamHandler() 40 ## console.setLevel(logging.DEBUG) ## <- the debug level goes here41 46 ##formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 42 47 ##console.setFormatter(formatter) … … 51 56 re_ns_n = re.compile('(.*[/#])(.*)') 52 57 53 from exceptions import *54 58 55 59 # Look into caching as in: … … 58 62 # Data descriptors (get and set) use the __get__ first 59 63 60 # helper function, might be somewhere in rdflib I need to look for it there 61 def getList(sub, pred=None, db=None): 62 """Attempts to return a list from sub (subject that is) 63 passed in if it is a Collection or a Container (Bag,Seq or Alt)""" 64 if not db: 65 if isinstance(sub,rdfObject): 66 db=sub.db 67 else: 68 db=rdfObject.db 69 if pred: 70 if isinstance(sub, rdfObject): 71 subUri=sub.resUri 72 base = db.value(subUri,pred,any=True) 73 else: 74 # if there was no predicate assume a base node was passed in 75 base=sub 76 if type(base) != BNode: 77 # Doesn't look like a list or a collection, just return multiple values (or an error?) 78 val=[o for o in db.objects(subUri, pred)] 79 return val 80 members=[] 81 first = db.value(base, RDF.first) 82 # OK let's work at returning a list if there is an RDF.first 83 if first: 84 while first: 85 members.append(first) 86 base = db.value(base, RDF.rest) 87 first = db.value(base, RDF.first) 88 return members 89 # OK let's work at returning a Collection (Seq,Bag or Alt) if was no RDF.first 90 else: 91 i=1 92 first=db.value(base, RDF._1) 93 if not first: 94 raise AttributeError, "Not a list, or collection but another type of BNode" 95 while first: 96 members.append(first) 97 i += 1 98 first=db.value(base, RDF['_%d'%i]) 99 return members 100 101 class rdflibAbstract(object): 102 """Abstract base class for descriptors 103 Descriptors are to map class instance variables to predicates 104 optional cacheName is where to store items 105 range_type is the rdf:type of the range of this predicate""" 106 def __init__(self, pred, cacheName=None, range_type=None): 107 self.pred = pred 108 self.name = cacheName or pred 109 self.range_type = range_type 110 111 @property 112 def range_class(self): 113 """return the class that this descriptor is mapped to through the range_type""" 114 if self.range_type: 115 try: 116 return self._mappedClass 117 except AttributeError: 118 log.warn("Descriptor %s has range of: %s but not yet mapped"%(self, self.range_type)) 119 return rdfObject 120 else: 121 return rdfObject 122 123 def __delete__(self, obj): 124 """deletes or removes from the database triples with: 125 obj.resUri as subject and self.pred as predicate 126 if the object of that triple is a Literal that stop 127 if the object of that triple is a BNode 128 then cascade the delete if that BNode has no further references to it 129 i.e. it is not the object in any other triples. 130 """ 131 # be done ala getList above 132 log.debug("DELETE with descriptor for %s on %s"%(self.pred, obj.resUri)) 133 # first drop the cached value 134 del obj.__dict__[self.name] 135 # next, drop the triples 136 for s,p,o in obj.db.triples((obj.resUri, self.pred, None)): 137 obj.db.remove((s,p,o)) 138 #finally if the object in the triple was a bnode 139 #cascade delete the thing it referenced 140 if isinstance(o,BNode): 141 rdfObject(o).remove(db=obj.db,cascade='bnode') 142 143 144 145 146 class rdflibSingle(rdflibAbstract): 147 '''This is a Discriptor 148 Takes a the URI of the predicate at initialization 149 Expects to return a single item 150 on Assignment will set that value to the 151 ONLY triple with that subject,predicate pair''' 152 def __init__(self, pred, cacheName=None, range_type=None): 153 super(rdflibSingle, self).__init__(pred, cacheName, range_type) 154 155 def __get__(self, obj, cls): 156 if obj is None: 157 return self 158 if self.name in obj.__dict__: 159 return obj.__dict__[self.name] 160 log.debug("Geting with descriptor %s for %s"%(self.pred,obj.resUri)) 161 val=obj.__getitem__(self.pred) 162 if isinstance(val, rdfObject) or isinstance(val, BNode) or isinstance(val,URIRef): 163 val = self.range_class(val) 164 obj.__dict__[self.name]= val 165 return val 166 167 def __set__(self, obj, value): 168 log.debug("SET with descriptor value %s of type %s"%(value,type(value))) 169 #setattr(obj, self.name, value) #this recurses indefinatly 170 obj.__dict__[self.name]= value 171 if isinstance(value,Literal) or isinstance(value,URIRef) or isinstance(value,BNode): 172 o = value 173 elif isinstance(value,rdfObject): 174 o = value.resUri 175 else: 176 o = Literal(value) 177 obj.db.set((obj.resUri,self.pred, o)) 178 #return None 179 180 181 class rdflibMultiple(rdflibAbstract): 182 '''This is a Discriptor 183 Expects to return a list of values (could be a list of one)''' 184 def __init__(self, pred, cacheName=None, range_type=None): 185 super(rdflibMultiple, self).__init__(pred, cacheName, range_type) 186 187 def __get__(self, obj, cls): 188 if obj is None: 189 return self 190 val=[o for o in obj.db.objects(obj.resUri, self.pred)] 191 # check to see if this is a Container or Collection 192 # if so, return collection as a list 193 if len(val) == 1 \ 194 and (obj.db.value(o,RDF.first) or obj.db.value(o,RDF._1)): 195 val=getList(obj, self.pred) 196 val=[((isinstance(v,BNode) or isinstance(v,URIRef)) and self.range_class(v) or v) for v in val] 197 setattr(obj, self.name, val) 198 try: 199 log.debug("Geting %s for %s"%(obj.db.qname(self.pred),obj.db.qname(obj.resUri))) 200 except: 201 log.debug("Geting %s for %s"%(self.pred,obj.resUri)) 202 return val 203 204 205 206 207 class rdflibList(rdflibMultiple): 208 '''This is a Discriptor 209 Expects to return a list of values (could be a list of one)''' 210 def __init__(self, pred, cacheName=None, range_type=None): 211 super(rdflibMultiple, self).__init__(pred, cacheName, range_type) 212 213 def __get__(self, obj, cls): 214 if obj is None: 215 return self 216 #log.debug("Geting %s for %s"%(obj.db.qname(self.pred),obj.db.qname(obj.resUri))) 217 log.debug("Geting %s for %s"%(self.pred,obj.resUri)) 218 base = obj.db.value(obj.resUri,self.pred) 219 if not base: 220 return [] 221 members=[] 222 first = obj.db.value(base, RDF.first) 223 # OK let's work at returning a list if there is an RDF.first 224 if not first: 225 raise AttributeError, ("expected node [%s] to be a list but it's not" %base.n3()) 226 while first: 227 members.append(first) 228 base = db.value(base, RDF.rest) 229 first = db.value(base, RDF.first) 230 231 val=[((isinstance(v,BNode) or isinstance(v,URIRef)) and self.range_class(v) or v) for v in members] 232 setattr(obj, self.name, members) 233 return members 234 235 class rdflibContainer(rdflibMultiple): 236 '''This is a Discriptor 237 Expects to return a list of values (could be a list of one)''' 238 def __init__(self, pred, cacheName=None, range_type=None): 239 super(rdflibMultiple, self).__init__(pred, cacheName, range_type) 240 241 def __get__(self, obj, cls): 242 if obj is None: 243 return self 244 #log.debug("Geting %s for %s"%(obj.db.qname(self.pred),obj.db.qname(obj.resUri))) 245 log.debug("Geting %s for %s"%(self.pred,obj.resUri)) 246 base = obj.db.value(obj.resUri,self.pred) 247 if not base: 248 return [] 249 members=[] 250 i=1 251 first=db.value(base, RDF._1) 252 if not first: 253 raise AttributeError, ("expected node [%s] to be a list but it's not" % base.n3()) 254 while first: 255 members.append(first) 256 i += 1 257 first=db.value(base, RDF['_%d'%i]) 258 259 val=[((isinstance(v,BNode) or isinstance(v,URIRef)) and self.range_class(v) or v) for v in members] 260 setattr(obj, self.name, members) 261 return members 262 263 264 265 class rdfObject(object): 64 65 ################################################################################## 66 # define our Base Class for all "subjects" in python 67 ################################################################################## 68 69 #class rdfSubject(object): 70 class rdfSubject(Identifier): 266 71 db=ConjunctiveGraph() 267 72 """Default graph for access to instances of this type""" 268 73 rdf_type=None 269 74 """rdf:type of instances of this class""" 270 def __init__(self, resUri): 271 """The constructor tries hard to do return you an rdfObject 75 def __new__(cls, resUri = None, **kwargs): 76 """docstring for __new__""" 77 if not resUri or isinstance(resUri, BNode): 78 sub = BNode.__new__(cls, resUri) 79 sub.node_type = 'bnode' 80 elif isinstance(resUri, (str, unicode)) and resUri.startswith("_:"): 81 sub = BNode.__new__(cls, resUri[2:]) 82 sub.node_type = 'bnode' 83 elif isinstance(resUri, URIRef): 84 sub = URIRef.__new__(cls, resUri) 85 sub.node_type = 'uri' 86 elif isinstance(resUri, (str, unicode)) and resUri[0]=="<" and resUri[-1]==">": 87 sub = URIRef.__new__(cls, resUri[1:-1]) 88 sub.node_type = 'uri' 89 elif isinstance(resUri, rdfSubject): 90 sub = Identifier.__new__(cls, resUri) 91 sub.node_type = resUri.node_type 92 if sub.db != resUri.db: 93 sub.db = resUri.db 94 else: 95 raise AttributeError("cannot construct rdfSubject from %s"%(str(resUri))) 96 return sub 97 98 def __init__(self, resUri = None, **kwargs): 99 """The constructor tries hard to do return you an rdfSubject 272 100 the parameter resUri can be: 273 * an instance of an rdf Object101 * an instance of an rdfSubject 274 102 * an instance of a BNode or a URIRef 275 103 * an n3 uriref string like: <urn:isbn:1234567890> 276 * an n3 bnode string like _:xyz1234 """277 if isinstance(resUri, rdfObject):278 self.resUri=resUri.resUri279 self.db=resUri.db280 elif isinstance(resUri, BNode) or isinstance(resUri, URIRef):281 self. resUri=resUri282 elif resUri[0]=="<" and resUri[-1]==">": 283 self.resUri=URIRef(resUri[1:-1])284 elif resUri.startswith("_:"):285 self.resUri=BNode(resUri[2:])286 else:287 raise AttributeError("cannot construct rdfObject from %s"%(str(resUri)))288 289 rdftype = list(self.db.objects(self .resUri, RDF.type))104 * an n3 bnode string like _:xyz1234 105 a null resUri will cause a new one created of 106 this classes rdf_type 107 `kwargs` is a set of values that will be set""" 108 if kwargs: 109 self._set_with_dict(kwargs) 110 111 if not resUri: 112 # lets create a new one 113 if self.rdf_type: 114 self.db.set((self,RDF.type, self.rdf_type)) 115 # lets get a default namespace for this 116 # ??obsolete ??? 117 rdftype = list(self.db.objects(self, RDF.type)) 290 118 if len(rdftype)==1: 291 119 self.namespace, trash = re_ns_n.match(rdftype[0]).groups() 292 120 self.namespace=Namespace(self.namespace) 293 elif isinstance(self .resUri,URIRef):294 ns_n = re_ns_n.match(self .resUri)121 elif isinstance(self,URIRef): 122 ns_n = re_ns_n.match(self) 295 123 if ns_n: 296 124 self.namespace, self.name = ns_n.groups() … … 298 126 299 127 def n3(self): 300 return self.resUri.n3() 301 128 """n3 repr of this node""" 129 if self.node_type == 'bnode': 130 return "_:%s"%self 131 elif self.node_type == 'uri': 132 return "<%s>"%self 133 else: 134 raise AttributeError("Unknown node type for %s"(self)) 135 302 136 303 137 @classmethod … … 312 146 raise AttributeError("descriptor %s not found for class %s" % (key,cls)) 313 147 148 #short term hack. Need to go to a sqlalchemy 0.4 style query method 149 # obj.query.get_by should map to obj.get_by ..same for fetch_by 150 @property 151 def query(self): 152 return self 314 153 315 154 @classmethod … … 325 164 that is of type owl:InverseFunctional""" 326 165 if len(kwargs) != 1: 327 raise ValueError("get_by did not want %i args"%(len(kwargs)))166 raise ValueError("get_by wanted eaactly 1 but got %i args\nMaybe you wanted filter_by"%(len(kwargs))) 328 167 key,value = kwargs.items()[0] 329 168 if isinstance(value, URIRef) or isinstance(value,BNode) or isinstance(value,Literal): … … 337 176 else: 338 177 raise LookupError("%s = %s not found"%(key,value)) 339 #short term hack. Need to go to a sqlalchemy 0.4 style query method340 query_get_by=get_by341 342 178 343 179 @classmethod … … 356 192 pred = cls._getdescriptor(key).pred 357 193 # try to make the value be OK for the triple query as an object 358 if isinstance(value, rdfObject): 359 obj = rdfObject.resUri 360 elif isinstance(value, URIRef) or isinstance(value,BNode): 194 if isinstance(value, Identifier): 361 195 obj = value 362 196 else: … … 367 201 filters.append((RDF.type,cls.rdf_type)) 368 202 pred, obj = filters[0] 369 print "Checking %s, %s" % (pred,obj)203 log.debug("Checking %s, %s" % (pred,obj)) 370 204 for sub in cls.db.subjects(pred,obj): 371 print "maybe %s" % sub205 log.debug( "maybe %s" % sub ) 372 206 for pred,obj in filters[1:]: 373 print "Checking %s, %s" % (pred,obj) 374 if not list(cls.db.triples((sub,pred,obj))): 375 print "Not %s" % s 376 continue 377 yield cls(sub) 207 log.debug("Checking %s, %s" % (pred,obj)) 208 try: 209 cls.db.triples((sub,pred,obj)).next() 210 except: 211 log.warn( "No %s" % sub ) 212 break 213 else: 214 yield cls(sub) 378 215 379 216 @classmethod … … 392 229 393 230 def __repr__(self): 394 return " <%s: %s>"%(self.__class__.__name__, self.n3())395 231 return """%s('%s')""" % (self.__class__.__name__, self.n3()) 232 396 233 def __getitem__(self, pred): 397 #log.debug("Get ing with __getitem__ %s for %s"%(self.db.qname(pred),self.db.qname(self.resUri)))398 log.debug("Get ing with __getitem__ %s for %s"%(pred,self.resUri))399 val=self.db.value(self .resUri,pred)234 #log.debug("Getting with __getitem__ %s for %s"%(self.db.qname(pred),self.db.qname(self.resUri))) 235 log.debug("Getting with __getitem__ %s for %s"%(pred,self.n3())) 236 val=self.db.value(self,pred) 400 237 if isinstance(val,Literal): 401 238 val = val.toPython() 402 239 elif isinstance(val, BNode) or isinstance(val,URIRef): 403 val=rdf Object(val)240 val=rdfSubject(val) 404 241 return val 405 242 406 def remove(self, node=None, db=None, cascade = 'bnode', bnodeCheck=True): 407 """remove all triples where this rdfObject is the subject of the triple 243 ## def __setitem__(self,pred,value): 244 ## not even sure if this is a good idea here 245 246 def __delitem__(self, pred): 247 #log.debug("Deleting with __delitem__ %s for %s"%(self.db.qname(pred),self.db.qname(self.resUri))) 248 log.debug("Deleting with __delitem__ %s for %s"%(pred,self)) 249 for s,p,o in self.db.triples((self, pred, None)): 250 self.db.remove((s,p,o)) 251 #finally if the object in the triple was a bnode 252 #cascade delete the thing it referenced 253 if isinstance(o,BNode): 254 rdfSubject(o)._remove(db=self.db,cascade='bnode') 255 256 def _set_with_dict(self, kv): 257 """for each key,value pair in dict kv 258 set self.key = value""" 259 for key,value in kv.items(): 260 #item.__class__._getdescriptor('authors').__get__(item, item.__class__) 261 descriptor = self.__class__._getdescriptor(key) 262 descriptor.__set__(self, value) 263 264 265 def _remove(self, node=None, db=None, cascade = 'bnode', bnodeCheck=True): 266 """remove all triples where this rdfSubject is the subject of the triple 408 267 db -- limit the remove operation to this graph 409 268 node -- node to remove from the graph defaults to self … … 420 279 """ 421 280 if not node: 422 node = self .resUri281 node = self 423 282 log.debug("Called remove on %s" % node) 424 283 if not db: … … 426 285 # we cannot delete a bnode if it is still referenced, 427 286 # i.e. if it is the o of a s,p,o 428 if bnodeCheck and isinstance(node,BNode): 429 for s,p,o in db.triples((None,None,node)): 430 raise RDFAlchemyError("Cannot delete a bnode %s becuase %s still references it" % (node.n3(), s.n3())) 287 if bnodeCheck: 288 if isinstance(node,BNode) or isinstance(node,rdfSubject) and node.node_type=='bnode': 289 for s,p,o in db.triples((None,None,node)): 290 raise RDFAlchemyError("Cannot delete a bnode %s becuase %s still references it" % (node.n3(), s.n3())) 431 291 # determine an appropriate test for cascade decisions 432 292 if cascade == 'bnode': 433 293 #we cannot delete a bnode if there are still references to it 434 294 def test(node): 435 if not isinstance(node,BNode): 295 if isinstance(node,(URIRef,Literal)) \ 296 or isinstance(node,rdfSubject) and node.node_type <> 'bnode': 436 297 return False 437 298 for s,p,o in db.triples((None,None,node)): … … 453 314 db.remove((s,p,o)) 454 315 if test(o): 455 self. remove(node=o, db=db,cascade=cascade)316 self._remove(node=o, db=db,cascade=cascade) 456 317 457 def rename(self, name, db=None):318 def _rename(self, name, db=None): 458 319 """rename a node """ 459 320 if not db: … … 461 322 if not (isinstance(name,BNode) or isinstance(name,URIRef)): 462 323 raise AttributeError, ("cannot rename to %s" % name) 463 for s,p,o in db.triples((self .resUri,None,None)):324 for s,p,o in db.triples((self,None,None)): 464 325 db.set((name, p, o)) 465 for s,p,o in db.triples((None,None,self .resUri)):326 for s,p,o in db.triples((None,None,self)): 466 327 db.set((s, p, name)) 467 328 self.resUri = name 468 329 469 330 470 def ppo(self,db=None):331 def _ppo(self,db=None): 471 332 """Like pretty print... 472 333 Return a 'pretty predicate,object' of self 473 334 returning all predicate object pairs with qnames""" 474 335 db = db or self.db 475 for p,o in db.predicate_objects(self .resUri):336 for p,o in db.predicate_objects(self): 476 337 print "%20s = %s"% (db.qname(p),str(o)) 338 print " " 339 340 def md5_term_hash(self): 341 d = md5(str(self)) 342 d.update("R") 343 return d.hexdigest() 344 345 346 -
rdfalchemy/trunk/rdfalchemy/samples/company.py
r76 r91 2 2 from rdflib import Literal, BNode, Namespace, URIRef 3 3 4 # this has the rdf Object stuff and the Fresnel stuff4 # this has the rdfSubject stuff and the Fresnel stuff 5 5 from rdfalchemy import * 6 6 … … 9 9 edgarns = Namespace('http://www.sec.gov/Archives/edgar') 10 10 11 class Company(rdf Object):11 class Company(rdfSubject): 12 12 rdf_type = ov.Company 13 13 symbol = rdflibSingle(ov.symbol,) … … 19 19 20 20 21 class EdgarFiling(rdf Object):21 class EdgarFiling(rdfSubject): 22 22 rdf_type = edgarns.xbrlFiling 23 23 accessionNumber = rdflibSingle(edgarns.accessionNumber) -
rdfalchemy/trunk/rdfalchemy/samples/data/rdfalchemy_doap.n3
r65 r91 5 5 [ a :Project; 6 6 :name "RDFAlchemy"; 7 :description """RDFAlchemy is to RDF as SQLAlchemy is to SQL. 8 It is an ORM that allows access to rdflib or sesame RDF datastores"""; 7 :programming-language "Python"; 9 8 :homepage <http://www.openvest.com/trac/wiki/RDFAlchemy>; 10 9 :license <http://usefulinc.com/doap/licenses/bsd>; … … 13 12 foaf:homepage <http://www.openvest.com/ContactUs>; 14 13 foaf:mbox_sha1sum "cc886cc71aeae9895a9e1e1e2a99a143a01d2d13"]; 15 16 :programming-language "Python";17 14 :repository [ a :SVNRepository; 18 15 :browse <http://www.openvest.com/trac/browser/rdfalchemy/trunk>; 19 :location <http://www.openvest.com/svn/public/rdfalchemy/trunk>; 20 :shortdesc "A python orm for rdf datastores"]. 16 :location <http://www.openvest.com/svn/public/rdfalchemy/trunk>]; 17 :shortdesc "A python orm for rdf datastores"; 18 :description """RDFAlchemy is to RDF as SQLAlchemy is to SQL. 19 It is an ORM that allows access to rdflib or sesame RDF datastores"""; 20 ]. -
rdfalchemy/trunk/rdfalchemy/samples/doap.py
r86 r91 1 from rdfalchemy import rdf Object, rdflibSingle, rdflibMultiple1 from rdfalchemy import rdfSubject, rdflibSingle, rdflibMultiple 2 2 from rdflib import Namespace 3 3 … … 6 6 7 7 8 class Project(rdf Object):8 class Project(rdfSubject): 9 9 rdf_type = DOAP.Project 10 10 name = rdflibSingle(DOAP.name) … … 13 13 shortdesc = rdflibMultiple(DOAP.shortdesc) 14 14 releases = rdflibMultiple(DOAP.release) 15 language = rdflibSingle(DOAP['programming-language']) # the hyphen means we can't use DOAP.programming-language 15 16 maintainer = rdflibSingle(DOAP.maintainer,range_type=FOAF.Person) 16 17 17 18 if __name__ == '__main__': 18 19 from rdflib import ConjunctiveGraph 19 rdf Object.db=ConjunctiveGraph()20 rdfSubject.db=ConjunctiveGraph() 20 21 accs_uri="http://doapspace.org/doap/sf/accs.rdf" 21 rdf Object.db.load(accs_uri)22 rdfSubject.db.load(accs_uri) 22 23 23 24 p = Project.ClassInstances().next() -
rdfalchemy/trunk/rdfalchemy/samples/example.py
r72 r91 1 from rdf Alchemy import rdfObject, rdflibSingle, rdflibMultiple1 from rdfalchemy import rdfSubject, rdflibSingle, rdflibMultiple 2 2 from rdflib import ConjunctiveGraph, Namespace, Literal 3 3 … … 5 5 VCARD = Namespace("http://www.w3.org/2006/vcard/ns#") 6 6 7 rdf Object.db = ConjunctiveGraph()8 rdf Object.db.load('./example.n3', format='n3')7 rdfSubject.db = ConjunctiveGraph() 8 rdfSubject.db.load('./data/example.n3', format='n3') 9 9 10 class Company(rdf Object):10 class Company(rdfSubject): 11 11 owlType = OV.Company 12 12 symbol = rdflibSingle(OV.symbol,'symbol') … … 49 49 50 50 ## add an attribute (from the database) 51 c = Company.get_by(symbol = 'J ava')51 c = Company.get_by(symbol = 'JAVA') 52 52 c.industry = 'Computer stuff' 53 53 -
rdfalchemy/trunk/rdfalchemy/samples/foaf.py
r72 r91 7 7 Copyright (c) 2007 Openvest. All rights reserved. 8 8 """ 9 from rdfalchemy import rdf Object, rdflibSingle, rdflibMultiple9 from rdfalchemy import rdfSubject, rdflibSingle, rdflibMultiple 10 10 from rdflib import Namespace 11 11 12 12 FOAF=Namespace("http://xmlns.com/foaf/0.1/" ) 13 13 14 class Agent(rdf Object):14 class Agent(rdfSubject): 15 15 rdf_type = FOAF.Agent 16 16 name = rdflibSingle(FOAF.name) … … 21 21 rdf_type = FOAF.Person 22 22 first = rdflibSingle(FOAF.firstName,'first') 23 given = rdflibSingle(FOAF.givenname,'first')24 23 last = rdflibSingle(FOAF.surname,'last') 25 family = rdflibSingle(FOAF.family_name,'last') 24 givenname = rdflibSingle(FOAF.givenname,'first') 25 surname = rdflibSingle(FOAF.surname,'last') 26 26
