diff options
Diffstat (limited to 'rdflib')
-rw-r--r-- | rdflib/graph.py | 452 |
1 files changed, 262 insertions, 190 deletions
diff --git a/rdflib/graph.py b/rdflib/graph.py index f68300cb..162f8092 100644 --- a/rdflib/graph.py +++ b/rdflib/graph.py @@ -3,9 +3,9 @@ from __future__ import division from __future__ import print_function from rdflib.term import Literal # required for doctests -assert Literal # avoid warning +assert Literal # avoid warning from rdflib.namespace import Namespace # required for doctests -assert Namespace # avoid warning +assert Namespace # avoid warning __doc__ = """\ @@ -234,26 +234,16 @@ Using Namespace class: """ import logging + logger = logging.getLogger(__name__) -# import md5 import random -import warnings - -from hashlib import md5 - - from rdflib.namespace import RDF, RDFS, SKOS - from rdflib import plugin, exceptions, query - from rdflib.term import Node, URIRef, Genid from rdflib.term import BNode - import rdflib.term - from rdflib.paths import Path - from rdflib.store import Store from rdflib.serializer import Serializer from rdflib.parser import Parser @@ -271,9 +261,15 @@ from six import b from six.moves.urllib.parse import urlparse __all__ = [ - 'Graph', 'ConjunctiveGraph', 'QuotedGraph', 'Seq', - 'ModificationException', 'Dataset', - 'UnSupportedAggregateOperation', 'ReadOnlyGraphAggregate'] + "Graph", + "ConjunctiveGraph", + "QuotedGraph", + "Seq", + "ModificationException", + "Dataset", + "UnSupportedAggregateOperation", + "ReadOnlyGraphAggregate", +] class Graph(Node): @@ -291,12 +287,11 @@ class Graph(Node): The Graph constructor can take an identifier which identifies the Graph by name. If none is given, the graph is assigned a BNode for its identifier. - For more on named graphs, see: http://www.w3.org/2004/03/trix/ + For more on named graphs, see: http://www.w3.org/2004/03/trix/ """ - def __init__(self, store='default', identifier=None, - namespace_manager=None): + def __init__(self, store="default", identifier=None, namespace_manager=None): super(Graph, self).__init__() self.__identifier = identifier or BNode() @@ -315,10 +310,12 @@ class Graph(Node): def __get_store(self): return self.__store + store = property(__get_store) # read-only attr def __get_identifier(self): return self.__identifier + identifier = property(__get_identifier) # read-only attr def _get_namespace_manager(self): @@ -329,23 +326,24 @@ class Graph(Node): def _set_namespace_manager(self, nm): self.__namespace_manager = nm - namespace_manager = property(_get_namespace_manager, - _set_namespace_manager, - doc="this graph's namespace-manager") + namespace_manager = property( + _get_namespace_manager, + _set_namespace_manager, + doc="this graph's namespace-manager", + ) def __repr__(self): return "<Graph identifier=%s (%s)>" % (self.identifier, type(self)) def __str__(self): if isinstance(self.identifier, URIRef): - return ("%s a rdfg:Graph;rdflib:storage " + - "[a rdflib:Store;rdfs:label '%s'].") % ( - self.identifier.n3(), - self.store.__class__.__name__) + return ( + "%s a rdfg:Graph;rdflib:storage " + "[a rdflib:Store;rdfs:label '%s']." + ) % (self.identifier.n3(), self.store.__class__.__name__) else: - return ("[a rdfg:Graph;rdflib:storage " + - "[a rdflib:Store;rdfs:label '%s']].") % ( - self.store.__class__.__name__) + return ( + "[a rdfg:Graph;rdflib:storage " + "[a rdflib:Store;rdfs:label '%s']]." + ) % self.store.__class__.__name__ def toPython(self): return self @@ -377,28 +375,26 @@ class Graph(Node): Might be necessary for stores that require closing a connection to a database or releasing some resource. """ - self.__store.close( - commit_pending_transaction=commit_pending_transaction) + self.__store.close(commit_pending_transaction=commit_pending_transaction) def add(self, triple): """Add a triple with self as context""" s, p, o = triple - assert isinstance(s, Node), \ - "Subject %s must be an rdflib term" % (s,) - assert isinstance(p, Node), \ - "Predicate %s must be an rdflib term" % (p,) - assert isinstance(o, Node), \ - "Object %s must be an rdflib term" % (o,) + assert isinstance(s, Node), "Subject %s must be an rdflib term" % (s,) + assert isinstance(p, Node), "Predicate %s must be an rdflib term" % (p,) + assert isinstance(o, Node), "Object %s must be an rdflib term" % (o,) self.__store.add((s, p, o), self, quoted=False) def addN(self, quads): """Add a sequence of triple with context""" - self.__store.addN((s, p, o, c) for s, p, o, c in quads - if isinstance(c, Graph) and - c.identifier is self.identifier and - _assertnode(s, p, o) - ) + self.__store.addN( + (s, p, o, c) + for s, p, o, c in quads + if isinstance(c, Graph) + and c.identifier is self.identifier + and _assertnode(s, p, o) + ) def remove(self, triple): """Remove a triple from the graph @@ -417,10 +413,10 @@ class Graph(Node): s, p, o = triple if isinstance(p, Path): for _s, _o in p.eval(self, s, o): - yield (_s, p, _o) + yield _s, p, _o else: for (s, p, o), cg in self.__store.triples((s, p, o), context=self): - yield (s, p, o) + yield s, p, o def __getitem__(self, item): """ @@ -489,7 +485,9 @@ class Graph(Node): return self.predicate_objects(item) else: - raise TypeError("You can only index a graph by a single rdflib term or path, or a slice of rdflib terms.") + raise TypeError( + "You can only index a graph by a single rdflib term or path, or a slice of rdflib terms." + ) def __len__(self): """Returns the number of triples in the graph @@ -516,7 +514,7 @@ class Graph(Node): if other is None: return -1 elif isinstance(other, Graph): - return cmp(self.identifier, other.identifier) + return (self.identifier > other.identifier) - (self.identifier < other.identifier) else: # Note if None is considered equivalent to owl:Nothing # Then perhaps a graph with length 0 should be considered @@ -524,21 +522,20 @@ class Graph(Node): return 1 def __eq__(self, other): - return isinstance(other, Graph) \ - and self.identifier == other.identifier + return isinstance(other, Graph) and self.identifier == other.identifier def __lt__(self, other): - return (other is None) \ - or (isinstance(other, Graph) and - self.identifier < other.identifier) + return (other is None) or ( + isinstance(other, Graph) and self.identifier < other.identifier + ) def __le__(self, other): return self < other or self == other def __gt__(self, other): - return (isinstance(other, Graph) and - self.identifier > other.identifier) \ - or (other is not None) + return (isinstance(other, Graph) and self.identifier > other.identifier) or ( + other is not None + ) def __ge__(self, other): return self > other or self == other @@ -560,8 +557,7 @@ class Graph(Node): """Set-theoretic union BNode IDs are not changed.""" retval = Graph() - for (prefix, uri) in set( - list(self.namespaces()) + list(other.namespaces())): + for (prefix, uri) in set(list(self.namespaces()) + list(other.namespaces())): retval.bind(prefix, uri) for x in self: retval.add(x) @@ -583,7 +579,7 @@ class Graph(Node): BNode IDs are not changed.""" retval = Graph() for x in self: - if not x in other: + if x not in other: retval.add(x) return retval @@ -604,10 +600,12 @@ class Graph(Node): (subject, predicate, object). """ (subject, predicate, object_) = triple - assert subject is not None, \ - "s can't be None in .set([s,p,o]), as it would remove (*, p, *)" - assert predicate is not None, \ - "p can't be None in .set([s,p,o]), as it would remove (s, *, *)" + assert ( + subject is not None + ), "s can't be None in .set([s,p,o]), as it would remove (*, p, *)" + assert ( + predicate is not None + ), "p can't be None in .set([s,p,o]), as it would remove (s, *, *)" self.remove((subject, predicate, None)) self.add((subject, predicate, object_)) @@ -644,11 +642,13 @@ class Graph(Node): def triples_choices(self, triple, context=None): subject, predicate, object_ = triple for (s, p, o), cg in self.store.triples_choices( - (subject, predicate, object_), context=self): - yield (s, p, o) + (subject, predicate, object_), context=self + ): + yield s, p, o - def value(self, subject=None, predicate=RDF.value, object=None, - default=None, any=True): + def value( + self, subject=None, predicate=RDF.value, object=None, default=None, any=True + ): """Get a value for a pair of two criteria Exactly one of subject, predicate, object must be None. Useful if one @@ -665,9 +665,11 @@ class Graph(Node): """ retval = default - if (subject is None and predicate is None) or \ - (subject is None and object is None) or \ - (predicate is None and object is None): + if ( + (subject is None and predicate is None) + or (subject is None and object is None) + or (predicate is None and object is None) + ): return None if object is None: @@ -685,20 +687,25 @@ class Graph(Node): if any is False: try: next(values) - msg = ("While trying to find a value for (%s, %s, %s) the" - " following multiple values where found:\n" % - (subject, predicate, object)) - triples = self.store.triples( - (subject, predicate, object), None) + msg = ( + "While trying to find a value for (%s, %s, %s) the" + " following multiple values where found:\n" + % (subject, predicate, object) + ) + triples = self.store.triples((subject, predicate, object), None) for (s, p, o), contexts in triples: msg += "(%s, %s, %s)\n (contexts: %s)\n" % ( - s, p, o, list(contexts)) + s, + p, + o, + list(contexts), + ) raise exceptions.UniquenessError(msg) except StopIteration: pass return retval - def label(self, subject, default=''): + def label(self, subject, default=""): """Query for the RDFS.label of the subject Return default if no label exists or any label if multiple exist. @@ -707,8 +714,13 @@ class Graph(Node): return default return self.value(subject, RDFS.label, default=default, any=True) - def preferredLabel(self, subject, lang=None, default=None, - labelProperties=(SKOS.prefLabel, RDFS.label)): + def preferredLabel( + self, + subject, + lang=None, + default=None, + labelProperties=(SKOS.prefLabel, RDFS.label), + ): """ Find the preferred label for subject. @@ -755,12 +767,20 @@ class Graph(Node): # setup the language filtering if lang is not None: - if lang == '': # we only want not language-tagged literals - def langfilter(l): return l.language is None + if lang == "": # we only want not language-tagged literals + + def langfilter(l): + return l.language is None + else: - def langfilter(l): return l.language == lang + + def langfilter(l): + return l.language == lang + else: # we don't care about language tags - def langfilter(l): return True + + def langfilter(l): + return True for labelProp in labelProperties: labels = list(filter(langfilter, self.objects(subject, labelProp))) @@ -770,7 +790,7 @@ class Graph(Node): return [(labelProp, l) for l in labels] return default - def comment(self, subject, default=''): + def comment(self, subject, default=""): """Query for the RDFS.comment of the subject Return default if no comment exists @@ -905,7 +925,8 @@ class Graph(Node): """ return self.namespace_manager.bind( - prefix, namespace, override=override, replace=replace) + prefix, namespace, override=override, replace=replace + ) def namespaces(self): """Generator over all the prefix, namespace tuples""" @@ -916,8 +937,9 @@ class Graph(Node): """Turn uri into an absolute URI if it's not one already""" return self.namespace_manager.absolutize(uri, defrag) - def serialize(self, destination=None, format="xml", - base=None, encoding=None, **args): + def serialize( + self, destination=None, format="xml", base=None, encoding=None, **args + ): """Serialize the Graph to destination If destination is None serialize method returns the serialization as a @@ -938,8 +960,9 @@ class Graph(Node): location = destination scheme, netloc, path, params, _query, fragment = urlparse(location) if netloc != "": - print("WARNING: not saving as location" + - "is not a local file reference") + print( + "WARNING: not saving as location" + "is not a local file reference" + ) return fd, name = tempfile.mkstemp() stream = os.fdopen(fd, "wb") @@ -951,8 +974,16 @@ class Graph(Node): shutil.copy(name, path) os.remove(name) - def parse(self, source=None, publicID=None, format=None, - location=None, file=None, data=None, **args): + def parse( + self, + source=None, + publicID=None, + format=None, + location=None, + file=None, + data=None, + **args + ): """ Parse source adding the resulting triples to the Graph. @@ -1018,9 +1049,14 @@ class Graph(Node): """ - source = create_input_source(source=source, publicID=publicID, - location=location, file=file, - data=data, format=format) + source = create_input_source( + source=source, + publicID=publicID, + location=location, + file=file, + data=data, + format=format, + ) if format is None: format = source.content_type if format is None: @@ -1038,9 +1074,16 @@ class Graph(Node): def load(self, source, publicID=None, format="xml"): self.parse(source, publicID, format) - def query(self, query_object, processor='sparql', - result='sparql', initNs=None, initBindings=None, - use_store_provided=True, **kwargs): + def query( + self, + query_object, + processor="sparql", + result="sparql", + initNs=None, + initBindings=None, + use_store_provided=True, + **kwargs + ): """ Query this graph. @@ -1061,11 +1104,12 @@ class Graph(Node): if hasattr(self.store, "query") and use_store_provided: try: return self.store.query( - query_object, initNs, initBindings, - self.default_union and - '__UNION__' or - self.identifier, - **kwargs) + query_object, + initNs, + initBindings, + self.default_union and "__UNION__" or self.identifier, + **kwargs + ) except NotImplementedError: pass # store has no own implementation @@ -1074,12 +1118,17 @@ class Graph(Node): if not isinstance(processor, query.Processor): processor = plugin.get(processor, query.Processor)(self) - return result(processor.query( - query_object, initBindings, initNs, **kwargs)) - - def update(self, update_object, processor='sparql', - initNs=None, initBindings=None, - use_store_provided=True, **kwargs): + return result(processor.query(query_object, initBindings, initNs, **kwargs)) + + def update( + self, + update_object, + processor="sparql", + initNs=None, + initBindings=None, + use_store_provided=True, + **kwargs + ): """Update this graph with the given update query.""" initBindings = initBindings or {} initNs = initNs or dict(self.namespaces()) @@ -1087,11 +1136,12 @@ class Graph(Node): if hasattr(self.store, "update") and use_store_provided: try: return self.store.update( - update_object, initNs, initBindings, - self.default_union and - '__UNION__' or - self.identifier, - **kwargs) + update_object, + initNs, + initBindings, + self.default_union and "__UNION__" or self.identifier, + **kwargs + ) except NotImplementedError: pass # store has no own implementation @@ -1222,7 +1272,7 @@ class Graph(Node): s = s.skolemize(authority=authority, basepath=basepath) if o == bnode: o = o.skolemize(authority=authority, basepath=basepath) - return (s, p, o) + return s, p, o def do_skolemize2(t): (s, p, o) = t @@ -1230,15 +1280,14 @@ class Graph(Node): s = s.skolemize(authority=authority, basepath=basepath) if isinstance(o, BNode): o = o.skolemize(authority=authority, basepath=basepath) - return (s, p, o) + return s, p, o retval = Graph() if new_graph is None else new_graph if bnode is None: self._process_skolem_tuples(retval, do_skolemize2) elif isinstance(bnode, BNode): - self._process_skolem_tuples( - retval, lambda t: do_skolemize(bnode, t)) + self._process_skolem_tuples(retval, lambda t: do_skolemize(bnode, t)) return retval @@ -1249,7 +1298,7 @@ class Graph(Node): s = s.de_skolemize() if o == uriref: o = o.de_skolemize() - return (s, p, o) + return s, p, o def do_de_skolemize2(t): (s, p, o) = t @@ -1257,15 +1306,14 @@ class Graph(Node): s = s.de_skolemize() if isinstance(o, Genid): o = o.de_skolemize() - return (s, p, o) + return s, p, o retval = Graph() if new_graph is None else new_graph if uriref is None: self._process_skolem_tuples(retval, do_de_skolemize2) elif isinstance(uriref, Genid): - self._process_skolem_tuples( - retval, lambda t: do_de_skolemize(uriref, t)) + self._process_skolem_tuples(retval, lambda t: do_de_skolemize(uriref, t)) return retval @@ -1314,15 +1362,14 @@ class Graph(Node): # find all triples with s as the subject and add these to the subgraph for s2, p2, o2 in self.triples((s, None, None)): subgraph.add((s2, p2, o2)) + add_to_cbd(resource) return subgraph class ConjunctiveGraph(Graph): - - """ - A ConjunctiveGraph is an (unnamed) aggregation of all the named + """A ConjunctiveGraph is an (unnamed) aggregation of all the named graphs in a store. It has a ``default`` graph, whose name is associated with the @@ -1333,21 +1380,22 @@ class ConjunctiveGraph(Graph): All methods that add triples work against this default graph. All queries are carried out against the union of all graphs. - """ - def __init__(self, store='default', identifier=None): + def __init__(self, store="default", identifier=None): super(ConjunctiveGraph, self).__init__(store, identifier=identifier) - assert self.store.context_aware, ("ConjunctiveGraph must be backed by" - " a context aware store.") + assert self.store.context_aware, ( + "ConjunctiveGraph must be backed by" " a context aware store." + ) self.context_aware = True self.default_union = True # Conjunctive! - self.default_context = Graph(store=self.store, - identifier=identifier or BNode()) + self.default_context = Graph(store=self.store, identifier=identifier or BNode()) def __str__(self): - pattern = ("[a rdflib:ConjunctiveGraph;rdflib:storage " - "[a rdflib:Store;rdfs:label '%s']]") + pattern = ( + "[a rdflib:ConjunctiveGraph;rdflib:storage " + "[a rdflib:Store;rdfs:label '%s']]" + ) return pattern % self.store.__class__.__name__ def _spoc(self, triple_or_quad, default=False): @@ -1397,8 +1445,7 @@ class ConjunctiveGraph(Graph): """Add a sequence of triples with context""" self.store.addN( - (s, p, o, self._graph(c)) for s, p, o, c in quads if - _assertnode(s, p, o) + (s, p, o, self._graph(c)) for s, p, o, c in quads if _assertnode(s, p, o) ) def remove(self, triple_or_quad): @@ -1438,7 +1485,7 @@ class ConjunctiveGraph(Graph): context = self for s, o in p.eval(context, s, o): - yield (s, p, o) + yield s, p, o else: for (s, p, o), cg in self.store.triples((s, p, o), context=context): yield s, p, o @@ -1461,9 +1508,8 @@ class ConjunctiveGraph(Graph): else: context = self._graph(context) - for (s1, p1, o1), cg in self.store.triples_choices((s, p, o), - context=context): - yield (s1, p1, o1) + for (s1, p1, o1), cg in self.store.triples_choices((s, p, o), context=context): + yield s1, p1, o1 def __len__(self): """Number of triples in the entire conjunctive graph""" @@ -1488,8 +1534,7 @@ class ConjunctiveGraph(Graph): identifier must be a URIRef or BNode. """ - return Graph(store=self.store, identifier=identifier, - namespace_manager=self) + return Graph(store=self.store, identifier=identifier, namespace_manager=self) def remove_context(self, context): """Removes the given context from the graph""" @@ -1502,8 +1547,16 @@ class ConjunctiveGraph(Graph): context_id = "#context" return URIRef(context_id, base=uri) - def parse(self, source=None, publicID=None, format="xml", - location=None, file=None, data=None, **args): + def parse( + self, + source=None, + publicID=None, + format="xml", + location=None, + file=None, + data=None, + **args + ): """ Parse source adding the resulting triples to its own context (sub graph of this graph). @@ -1517,8 +1570,13 @@ class ConjunctiveGraph(Graph): """ source = create_input_source( - source=source, publicID=publicID, location=location, - file=file, data=data, format=format) + source=source, + publicID=publicID, + location=location, + file=file, + data=data, + format=format, + ) g_id = publicID and publicID or source.getPublicId() if not isinstance(g_id, Node): @@ -1530,10 +1588,10 @@ class ConjunctiveGraph(Graph): return context def __reduce__(self): - return (ConjunctiveGraph, (self.store, self.identifier)) + return ConjunctiveGraph, (self.store, self.identifier) -DATASET_DEFAULT_GRAPH_ID = URIRef('urn:x-rdflib:default') +DATASET_DEFAULT_GRAPH_ID = URIRef("urn:x-rdflib:default") class Dataset(ConjunctiveGraph): @@ -1639,26 +1697,30 @@ class Dataset(ConjunctiveGraph): .. versionadded:: 4.0 """ - def __init__(self, store='default', default_union=False): + def __init__(self, store="default", default_union=False): super(Dataset, self).__init__(store=store, identifier=None) if not self.store.graph_aware: raise Exception("DataSet must be backed by a graph-aware store!") - self.default_context = Graph(store=self.store, identifier=DATASET_DEFAULT_GRAPH_ID) + self.default_context = Graph( + store=self.store, identifier=DATASET_DEFAULT_GRAPH_ID + ) self.default_union = default_union def __str__(self): - pattern = ("[a rdflib:Dataset;rdflib:storage " - "[a rdflib:Store;rdfs:label '%s']]") + pattern = ( + "[a rdflib:Dataset;rdflib:storage " "[a rdflib:Store;rdfs:label '%s']]" + ) return pattern % self.store.__class__.__name__ def graph(self, identifier=None): if identifier is None: from rdflib.term import rdflib_skolem_genid + self.bind( - "genid", "http://rdflib.net" + rdflib_skolem_genid, - override=False) + "genid", "http://rdflib.net" + rdflib_skolem_genid, override=False + ) identifier = BNode().skolemize() g = self._graph(identifier) @@ -1666,9 +1728,19 @@ class Dataset(ConjunctiveGraph): self.store.add_graph(g) return g - def parse(self, source=None, publicID=None, format="xml", - location=None, file=None, data=None, **args): - c = ConjunctiveGraph.parse(self, source, publicID, format, location, file, data, **args) + def parse( + self, + source=None, + publicID=None, + format="xml", + location=None, + file=None, + data=None, + **args + ): + c = ConjunctiveGraph.parse( + self, source, publicID, format, location, file, data, **args + ) self.graph(c) return c @@ -1699,9 +1771,9 @@ class Dataset(ConjunctiveGraph): def quads(self, quad): for s, p, o, c in super(Dataset, self).quads(quad): if c.identifier == self.default_context: - yield (s, p, o, None) + yield s, p, o, None else: - yield (s, p, o, c.identifier) + yield s, p, o, c.identifier class QuotedGraph(Graph): @@ -1718,12 +1790,9 @@ class QuotedGraph(Graph): def add(self, triple): """Add a triple with self as context""" s, p, o = triple - assert isinstance(s, Node), \ - "Subject %s must be an rdflib term" % (s,) - assert isinstance(p, Node), \ - "Predicate %s must be an rdflib term" % (p,) - assert isinstance(o, Node), \ - "Object %s must be an rdflib term" % (o,) + assert isinstance(s, Node), "Subject %s must be an rdflib term" % (s,) + assert isinstance(p, Node), "Predicate %s must be an rdflib term" % (p,) + assert isinstance(o, Node), "Object %s must be an rdflib term" % (o,) self.store.add((s, p, o), self, quoted=True) @@ -1731,10 +1800,11 @@ class QuotedGraph(Graph): """Add a sequence of triple with context""" self.store.addN( - (s, p, o, c) for s, p, o, c in quads - if isinstance(c, QuotedGraph) and - c.identifier is self.identifier and - _assertnode(s, p, o) + (s, p, o, c) + for s, p, o, c in quads + if isinstance(c, QuotedGraph) + and c.identifier is self.identifier + and _assertnode(s, p, o) ) def n3(self): @@ -1744,12 +1814,14 @@ class QuotedGraph(Graph): def __str__(self): identifier = self.identifier.n3() label = self.store.__class__.__name__ - pattern = ("{this rdflib.identifier %s;rdflib:storage " - "[a rdflib:Store;rdfs:label '%s']}") + pattern = ( + "{this rdflib.identifier %s;rdflib:storage " + "[a rdflib:Store;rdfs:label '%s']}" + ) return pattern % (identifier, label) def __reduce__(self): - return (QuotedGraph, (self.store, self.identifier)) + return QuotedGraph, (self.store, self.identifier) # Make sure QuotedGraph is ordered correctly @@ -1784,7 +1856,7 @@ class Seq(object): LI_INDEX = URIRef(str(RDF) + "_") for (p, o) in graph.predicate_objects(subject): if p.startswith(LI_INDEX): # != RDF.Seq: # - i = int(p.replace(LI_INDEX, '')) + i = int(p.replace(LI_INDEX, "")) _list.append((i, o)) # here is the trick: the predicates are _1, _2, _3, etc. Ie, @@ -1810,23 +1882,22 @@ class Seq(object): class ModificationException(Exception): - def __init__(self): pass def __str__(self): - return ("Modifications and transactional operations not allowed on " - "ReadOnlyGraphAggregate instances") + return ( + "Modifications and transactional operations not allowed on " + "ReadOnlyGraphAggregate instances" + ) class UnSupportedAggregateOperation(Exception): - def __init__(self): pass def __str__(self): - return ("This operation is not supported by ReadOnlyGraphAggregate " - "instances") + return "This operation is not supported by ReadOnlyGraphAggregate " "instances" class ReadOnlyGraphAggregate(ConjunctiveGraph): @@ -1836,16 +1907,17 @@ class ReadOnlyGraphAggregate(ConjunctiveGraph): ConjunctiveGraph over an explicit subset of the entire store. """ - def __init__(self, graphs, store='default'): + def __init__(self, graphs, store="default"): if store is not None: super(ReadOnlyGraphAggregate, self).__init__(store) Graph.__init__(self, store) self.__namespace_manager = None - assert isinstance(graphs, list) \ - and graphs \ - and [g for g in graphs if isinstance(g, Graph)], \ - "graphs argument must be a list of Graphs!!" + assert ( + isinstance(graphs, list) + and graphs + and [g for g in graphs if isinstance(g, Graph)] + ), "graphs argument must be a list of Graphs!!" self.graphs = graphs def __repr__(self): @@ -1887,7 +1959,7 @@ class ReadOnlyGraphAggregate(ConjunctiveGraph): yield s, p, o else: for s1, p1, o1 in graph.triples((s, p, o)): - yield (s1, p1, o1) + yield s1, p1, o1 def __contains__(self, triple_or_quad): context = None @@ -1904,7 +1976,7 @@ class ReadOnlyGraphAggregate(ConjunctiveGraph): s, p, o = triple for graph in self.graphs: for s1, p1, o1 in graph.triples((s, p, o)): - yield (s1, p1, o1, graph) + yield s1, p1, o1, graph def __len__(self): return sum(len(g) for g in self.graphs) @@ -1918,7 +1990,7 @@ class ReadOnlyGraphAggregate(ConjunctiveGraph): elif isinstance(other, Graph): return -1 elif isinstance(other, ReadOnlyGraphAggregate): - return cmp(self.graphs, other.graphs) + return (self.graphs > other.graphs) - (self.graphs < other.graphs) else: return -1 @@ -1935,15 +2007,15 @@ class ReadOnlyGraphAggregate(ConjunctiveGraph): for graph in self.graphs: choices = graph.triples_choices((subject, predicate, object_)) for (s, p, o) in choices: - yield (s, p, o) + yield s, p, o def qname(self, uri): - if hasattr(self, 'namespace_manager') and self.namespace_manager: + if hasattr(self, "namespace_manager") and self.namespace_manager: return self.namespace_manager.qname(uri) raise UnSupportedAggregateOperation() def compute_qname(self, uri, generate=True): - if hasattr(self, 'namespace_manager') and self.namespace_manager: + if hasattr(self, "namespace_manager") and self.namespace_manager: return self.namespace_manager.compute_qname(uri, generate) raise UnSupportedAggregateOperation() @@ -1951,7 +2023,7 @@ class ReadOnlyGraphAggregate(ConjunctiveGraph): raise UnSupportedAggregateOperation() def namespaces(self): - if hasattr(self, 'namespace_manager'): + if hasattr(self, "namespace_manager"): for prefix, namespace in self.namespace_manager.namespaces(): yield prefix, namespace else: @@ -1974,15 +2046,15 @@ class ReadOnlyGraphAggregate(ConjunctiveGraph): def _assertnode(*terms): for t in terms: - assert isinstance(t, Node), \ - 'Term %s must be an rdflib term' % (t,) + assert isinstance(t, Node), "Term %s must be an rdflib term" % (t,) return True def test(): import doctest + doctest.testmod() -if __name__ == '__main__': +if __name__ == "__main__": test() |