def remove(self, triplepat, context = None): logging.debug(f'BaseStore remove {triplepat} {context}') Store.remove(self, triplepat, context) for triple, contexts in self.localtriples(triplepat, context): for ctx in self.__getTripleContexts(triple): if context is not None and context != ctx: continue self.__removeTripleContext(triple, ctx) ctxs = self.__getTripleContexts(triple, skipQuoted=True) if None in ctxs and (context is None or len(ctxs) == 1): self.__removeTripleContext(triple, None) if len(self.__getTripleContexts(triple)) == 0: # triple has been removed from all contexts sub, pre, obj = triple self.__subjectIndex[sub].remove(triple) self.__predicateIndex[pre].remove(triple) self.__objectIndex[obj].remove(triple) del self.__tripleContexts[triple] if not context is None and context in self.__contextTriples and len(self.__contextTriples[context]) == 0: # all triples are removed out of this context # and it's not the default context so delete it del self.__contextTriples[context] if triplepat == (None, None, None) and context in self.__all_contexts and not self.graph_aware: # remove the whole context self.__all_contexts.remove(context)
def remove(self, triple, context=None): Store.remove(self, triple, context) if context is not None: if context == self: context = None # f = self.forward r = self.reverse if context is None: for triple, cg in self.triples(triple): subject, predicate, object = triple si, pi, oi = self.identifierToInt((subject, predicate, object)) contexts = list(self.contexts(triple)) for context in contexts: ci = r[context] del self.cspo[ci][si][pi][oi] del self.cpos[ci][pi][oi][si] del self.cosp[ci][oi][si][pi] self._removeNestedIndex(self.spo, si, pi, oi, ci) self._removeNestedIndex(self.pos, pi, oi, si, ci) self._removeNestedIndex(self.osp, oi, si, pi, ci) # grr!! hafta ref-count these before you can collect # them dumbass! # del f[si], f[pi], f[oi] # del r[subject], r[predicate], r[object] else: subject, predicate, object = triple ci = r.get(context, None) if ci: for triple, cg in self.triples(triple, context): si, pi, oi = self.identifierToInt(triple) del self.cspo[ci][si][pi][oi] del self.cpos[ci][pi][oi][si] del self.cosp[ci][oi][si][pi] try: self._removeNestedIndex(self.spo, si, pi, oi, ci) self._removeNestedIndex(self.pos, pi, oi, si, ci) self._removeNestedIndex(self.osp, oi, si, pi, ci) except KeyError: # the context may be a quoted one in which # there will not be a triple in spo, pos or # osp. So ignore any KeyErrors pass # TODO delete references to resources in # self.forward/self.reverse that are not in use anymore... if subject is None and predicate is None and object is None: # remove context try: ci = self.reverse[context] del self.cspo[ci], self.cpos[ci], self.cosp[ci] except KeyError: # TODO: no exception when removing non-existant context? pass
def remove(self, triple, context=None): Store.remove(self, triple, context) if context is not None: if context == self: context = None # f = self.forward r = self.reverse if context is None: for triple, cg in self.triples(triple): subject, predicate, object = triple si, pi, oi = self.identifierToInt((subject, predicate, object)) contexts = list(self.contexts(triple)) for context in contexts: ci = r[context] del self.cspo[ci][si][pi][oi] del self.cpos[ci][pi][oi][si] del self.cosp[ci][oi][si][pi] self._removeNestedIndex(self.spo, si, pi, oi, ci) self._removeNestedIndex(self.pos, pi, oi, si, ci) self._removeNestedIndex(self.osp, oi, si, pi, ci) # grr!! hafta ref-count these before you can collect # them dumbass! #del f[si], f[pi], f[oi] #del r[subject], r[predicate], r[object] else: subject, predicate, object = triple ci = r.get(context, None) if ci: for triple, cg in self.triples(triple, context): si, pi, oi = self.identifierToInt(triple) del self.cspo[ci][si][pi][oi] del self.cpos[ci][pi][oi][si] del self.cosp[ci][oi][si][pi] try: self._removeNestedIndex(self.spo, si, pi, oi, ci) self._removeNestedIndex(self.pos, pi, oi, si, ci) self._removeNestedIndex(self.osp, oi, si, pi, ci) except KeyError: # the context may be a quoted one in which # there will not be a triple in spo, pos or # osp. So ignore any KeyErrors pass # TODO delete references to resources in # self.forward/self.reverse that are not in use anymore... if subject is None and predicate is None and object is None: # remove context try: ci = self.reverse[context] del self.cspo[ci], self.cpos[ci], self.cosp[ci] except KeyError: # TODO: no exception when removing non-existant context? pass
def remove(self, triple, context): (subject, predicate, object) = triple assert self.__open, "The Store must be open." Store.remove(self, (subject, predicate, object), context) _to_string = self._to_string if context is not None: if context == self: context = None if subject is not None \ and predicate is not None \ and object is not None \ and context is not None: s = _to_string(subject) p = _to_string(predicate) o = _to_string(object) c = _to_string(context) value = self.__indices[0].get(bb("%s^%s^%s^%s^" % (c, s, p, o))) if value is not None: self.__remove((bb(s), bb(p), bb(o)), bb(c)) self.__needs_sync = True else: cspo, cpos, cosp = self.__indices index, prefix, from_key, results_from_key = self.__lookup( (subject, predicate, object), context) needs_sync = False for key in index.match_prefix(prefix): c, s, p, o = from_key(key) if context is None: contexts_value = index.get(key) or b("") # remove triple from all non quoted contexts contexts = set(contexts_value.split(b("^"))) contexts.add(b("")) # and from the conjunctive index for c in contexts: for i, _to_key, _ in self.__indices_info: i.remove(_to_key((s, p, o), c)) else: self.__remove((s, p, o), c) needs_sync = True if context is not None: if subject is None and predicate is None and object is None: # TODO: also if context becomes empty and not just on # remove((None, None, None), c) try: self.__contexts.remove(bb(_to_string(context))) # except db.DBNotFoundError, e: # pass except Exception as e: # pragma: NO COVER print("%s, Failed to delete %s" % ( e, context)) # pragma: NO COVER pass # pragma: NO COVER self.__needs_sync = needs_sync
def remove(self, triple, context, txn=None): assert self.__open, "The Store must be open." Store.remove(self, triple, context) for result in self.triples(triple): (spo, ctx) = result result = self.session.run( "CALL n10s.rdf.delete.inline($rdf,'N-Triples')", rdf=self.__serialise(spo)).single() if (result["terminationStatus"]) == "KO": raise Exception("Could not delete triple from Neo4j: ", result["extraInfo"])
def remove(self, triplepat, context=None): Store.remove(self, triplepat, context) context = getattr(context, 'identifier', context) if context is None: context = DEFAULT defid = self._obj2id(DEFAULT) req_cid = self._obj2id(context) was_in_all_triples = False for triple, contexts in self.triples(triplepat, context): was_in_all_triples = self._is_in_all_triples enctriple = self._encodeTriple(triple) for cid in self._getTripleContexts(enctriple): if context is not DEFAULT and req_cid != cid: continue self._removeTripleContext(enctriple, cid) ctxs = self._getTripleContexts(enctriple, skipQuoted=True) if defid in ctxs and (context is DEFAULT or len(ctxs) == 1): self._removeTripleContext(enctriple, defid) if len(self._getTripleContexts(enctriple)) == 0: # triple has been removed from all contexts sid, pid, oid = enctriple self._subjectIndex[sid].remove(enctriple) self._predicateIndex[pid].remove(enctriple) self._objectIndex[oid].remove(enctriple) del self._tripleContexts[enctriple] if triplepat == (None, None, None) and \ context in self._all_contexts and \ not self.graph_aware: # remove the whole context but not empty graphs self._all_contexts.remove(context) self._contextIndex.pop(req_cid) if was_in_all_triples: trips = self._contextIndex.get(req_cid, None) if trips is not None: if isinstance(triplepat[2], tuple): raise NotImplementedError('Cannot remove ranges') else: self._contextIndex.pop(req_cid)
def remove(self, triple, context): """Remove the set of triples matching the pattern from the store :param triple: Triple (subject, predicate, object) to remove. :param context: :returns: """ # pylint: disable-msg=W0222 # Signature differs from overriden method LOG.debug("-- ProxyStore.remove(triple=%s, context=%s) --", triple, context) Store.remove(self, triple, context) if triple == (None, None, None): self._graph = Graph() # the default implementation of Graph is not efficient in doing # this, so better create a new empty one else: self._graph.store.remove(triple)
i.remove(_to_key((s, p, o), c)) if not quoted: if contexts_value: for i, _to_key, _from_key in self.__indices_info: i.set(_to_key((s, p, o), b("")), contexts_value) else: for i, _to_key, _from_key in self.__indices_info: try: i.remove(_to_key((s, p, o), b(""))) except self.db.DBNotFoundError, e: #pragma: NO COVER _logger.debug("__remove failed with %s" % e) #pragma: NO COVER pass # TODO: is it okay to ignore these? def remove(self, (subject, predicate, object), context): assert self.__open, "The Store must be open." Store.remove(self, (subject, predicate, object), context) _to_string = self._to_string if context is not None: if context == self: context = None if subject is not None \ and predicate is not None \ and object is not None \ and context is not None: s = _to_string(subject) p = _to_string(predicate) o = _to_string(object) c = _to_string(context) value = self.__indices[0].get(bb("%s^%s^%s^%s^" % (c, s, p, o))) if value is not None:
for i, _to_key, _from_key in self.__indicies_info: i.delete(_to_key((s, p, o), c), txn=txn) if not quoted: if contexts_value: for i, _to_key, _from_key in self.__indicies_info: i.put(_to_key((s, p, o), b("")), contexts_value, txn=txn) else: for i, _to_key, _from_key in self.__indicies_info: try: i.delete(_to_key((s, p, o), b("")), txn=txn) except db.DBNotFoundError, e: pass # TODO: is it okay to ignore these? def remove(self, (subject, predicate, object), context, txn=None): assert self.__open, "The Store must be open." Store.remove(self, (subject, predicate, object), context) _to_string = self._to_string if context is not None: if context == self: context = None if subject is not None and predicate is not None and object is not None and context is not None: s = _to_string(subject, txn=txn) p = _to_string(predicate, txn=txn) o = _to_string(object, txn=txn) c = _to_string(context, txn=txn) value = self.__indicies[0].get(bb("%s^%s^%s^%s^" % (c, s, p, o)), txn=txn) if value is not None: self.__remove((bb(s), bb(p), bb(o)), bb(c), txn=txn)
def remove(self, spo, context, txn=None): subject, predicate, object = spo assert self.__open, "The Store must be open." Store.remove(self, (subject, predicate, object), context) _to_string = self._to_string if context is not None: if context == self: context = None if ( subject is not None and predicate is not None and object is not None and context is not None ): s = _to_string(subject, txn=txn) p = _to_string(predicate, txn=txn) o = _to_string(object, txn=txn) c = _to_string(context, txn=txn) value = self.__indicies[0].get(bb("%s^%s^%s^%s^" % (c, s, p, o)), txn=txn) if value is not None: self.__remove((bb(s), bb(p), bb(o)), bb(c), txn=txn) self.__needs_sync = True else: cspo, cpos, cosp = self.__indicies index, prefix, from_key, results_from_key = self.__lookup( (subject, predicate, object), context, txn=txn ) cursor = index.cursor(txn=txn) try: current = cursor.set_range(prefix) needs_sync = True except db.DBNotFoundError: current = None needs_sync = False cursor.close() while current: key, value = current cursor = index.cursor(txn=txn) try: cursor.set_range(key) # Hack to stop 2to3 converting this to next(cursor) current = getattr(cursor, "next")() except db.DBNotFoundError: current = None cursor.close() if key.startswith(prefix): c, s, p, o = from_key(key) if context is None: contexts_value = index.get(key, txn=txn) or "".encode("latin-1") # remove triple from all non quoted contexts contexts = set(contexts_value.split("^".encode("latin-1"))) # and from the conjunctive index contexts.add("".encode("latin-1")) for c in contexts: for i, _to_key, _ in self.__indicies_info: i.delete(_to_key((s, p, o), c), txn=txn) else: self.__remove((s, p, o), c, txn=txn) else: break if context is not None: if subject is None and predicate is None and object is None: # TODO: also if context becomes empty and not just on # remove((None, None, None), c) try: self.__contexts.delete( bb(_to_string(context, txn=txn)), txn=txn ) except db.DBNotFoundError: pass self.__needs_sync = needs_sync
def remove(self, spo, context, txn=None): subject, predicate, object = spo assert self.__open, "The Store must be open." Store.remove(self, (subject, predicate, object), context) _to_string = self._to_string if context is not None: if context == self: context = None if subject is not None \ and predicate is not None \ and object is not None \ and context is not None: s = _to_string(subject, txn=txn) p = _to_string(predicate, txn=txn) o = _to_string(object, txn=txn) c = _to_string(context, txn=txn) value = self.__indicies[0].get(bb("%s^%s^%s^%s^" % (c, s, p, o)), txn=txn) if value is not None: self.__remove((bb(s), bb(p), bb(o)), bb(c), txn=txn) self.__needs_sync = True else: cspo, cpos, cosp = self.__indicies index, prefix, from_key, results_from_key = self.__lookup( (subject, predicate, object), context, txn=txn) cursor = index.cursor(txn=txn) try: current = cursor.set_range(prefix) needs_sync = True except db.DBNotFoundError: current = None needs_sync = False cursor.close() while current: key, value = current cursor = index.cursor(txn=txn) try: cursor.set_range(key) # Hack to stop 2to3 converting this to next(cursor) current = getattr(cursor, 'next')() except db.DBNotFoundError: current = None cursor.close() if key.startswith(prefix): c, s, p, o = from_key(key) if context is None: contexts_value = index.get(key, txn=txn) or b("") # remove triple from all non quoted contexts contexts = set(contexts_value.split(b("^"))) # and from the conjunctive index contexts.add(b("")) for c in contexts: for i, _to_key, _ in self.__indicies_info: i.delete(_to_key((s, p, o), c), txn=txn) else: self.__remove((s, p, o), c, txn=txn) else: break if context is not None: if subject is None and predicate is None and object is None: # TODO: also if context becomes empty and not just on # remove((None, None, None), c) try: self.__contexts.delete( bb(_to_string(context, txn=txn)), txn=txn) except db.DBNotFoundError: pass self.__needs_sync = needs_sync