class RDFClassManager(object): """A container like object which represents a SPARQL query and returns RDFClass objects. """ def __init__(self, cls, query=None): self.cls = cls if query: self.query = query else: self.query = SelectQuery().select("?resource").where("?resource", a, cls.class_uri) def run_query(self): """Return a list of URIs representing each of the objects matched by the query. """ return self.cls.endpoint.simple_query(str(self.query)) def __iter__(self): """Return a generator which yields objects of the type passed to the constructor. """ return (self.cls(uri) for uri in self.run_query()) def __getitem__(self, k): """Return a single object of type cls if k is a long or an int, return an iterator over a sequence of objects of type cls is k is a slice. """ results = self.run_query()[k] if isinstance(k, (int, long)): return self.cls(results) elif isinstance(k, slice): return (self.cls(uri) for uri in results) def where(self, predicate, object): """Automatically insert current resource as subject for where query.""" new_query = self.query.where(u"?resource", predicate, object) return RDFClassManager(self.cls, new_query) def optional(self, predicate, object): """Automatically insert current resource as subject for optional query.""" new_query = self.query.optional(u"?resource", predicate, object) return RDFClassManager(self.cls, new_query) def __getattr__(self, name, *args, **kwargs): attr = getattr(self.query, name) new_query = attr(*args, **kwargs) return RDFClassManager(self.cls, new_query)
def __init__(self, cls, query=None): self.cls = cls if query: self.query = query else: self.query = SelectQuery().select("?resource").where("?resource", a, cls.class_uri)