Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
 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)