add bulk delete (#837)
* add bulk delete * Update graphiti_core/edges.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update graphiti_core/edges.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update graphiti_core/edges.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
This commit is contained in:
parent
0a5000af7b
commit
1278f877d8
5 changed files with 49 additions and 10 deletions
|
|
@ -64,6 +64,21 @@ class Edge(BaseModel, ABC):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def delete_by_uuids(cls, driver: GraphDriver, uuids: list[str]):
|
||||||
|
result = await driver.execute_query(
|
||||||
|
"""
|
||||||
|
MATCH (n)-[e:MENTIONS|RELATES_TO|HAS_MEMBER]->(m)
|
||||||
|
WHERE e.uuid IN $uuids
|
||||||
|
DELETE e
|
||||||
|
""",
|
||||||
|
uuids=uuids,
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.debug(f'Deleted Edges: {uuids}')
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash(self.uuid)
|
return hash(self.uuid)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ from graphiti_core.driver.driver import GraphDriver
|
||||||
from graphiti_core.driver.neo4j_driver import Neo4jDriver
|
from graphiti_core.driver.neo4j_driver import Neo4jDriver
|
||||||
from graphiti_core.edges import (
|
from graphiti_core.edges import (
|
||||||
CommunityEdge,
|
CommunityEdge,
|
||||||
|
Edge,
|
||||||
EntityEdge,
|
EntityEdge,
|
||||||
EpisodicEdge,
|
EpisodicEdge,
|
||||||
create_entity_edge_embeddings,
|
create_entity_edge_embeddings,
|
||||||
|
|
@ -46,6 +47,7 @@ from graphiti_core.nodes import (
|
||||||
EntityNode,
|
EntityNode,
|
||||||
EpisodeType,
|
EpisodeType,
|
||||||
EpisodicNode,
|
EpisodicNode,
|
||||||
|
Node,
|
||||||
create_entity_node_embeddings,
|
create_entity_node_embeddings,
|
||||||
)
|
)
|
||||||
from graphiti_core.search.search import SearchConfig, search
|
from graphiti_core.search.search import SearchConfig, search
|
||||||
|
|
@ -1066,12 +1068,7 @@ class Graphiti:
|
||||||
if record['episode_count'] == 1:
|
if record['episode_count'] == 1:
|
||||||
nodes_to_delete.append(node)
|
nodes_to_delete.append(node)
|
||||||
|
|
||||||
await semaphore_gather(
|
await Node.delete_by_uuids(self.driver, [node.uuid for node in nodes_to_delete])
|
||||||
*[node.delete(self.driver) for node in nodes_to_delete],
|
|
||||||
max_coroutines=self.max_coroutines,
|
await Edge.delete_by_uuids(self.driver, [edge.uuid for edge in edges_to_delete])
|
||||||
)
|
|
||||||
await semaphore_gather(
|
|
||||||
*[edge.delete(self.driver) for edge in edges_to_delete],
|
|
||||||
max_coroutines=self.max_coroutines,
|
|
||||||
)
|
|
||||||
await episode.delete(self.driver)
|
await episode.delete(self.driver)
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,33 @@ class Node(BaseModel, ABC):
|
||||||
batch_size=batch_size,
|
batch_size=batch_size,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def delete_by_uuids(cls, driver: GraphDriver, uuids: list[str], batch_size: int = 100):
|
||||||
|
if driver.provider == GraphProvider.FALKORDB:
|
||||||
|
for label in ['Entity', 'Episodic', 'Community']:
|
||||||
|
await driver.execute_query(
|
||||||
|
f"""
|
||||||
|
MATCH (n:{label})
|
||||||
|
WHERE n.uuid IN $uuids
|
||||||
|
DETACH DELETE n
|
||||||
|
""",
|
||||||
|
uuids=uuids,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
async with driver.session() as session:
|
||||||
|
await session.run(
|
||||||
|
"""
|
||||||
|
MATCH (n:Entity|Episodic|Community)
|
||||||
|
WHERE n.uuid IN $uuids
|
||||||
|
CALL {
|
||||||
|
WITH n
|
||||||
|
DETACH DELETE n
|
||||||
|
} IN TRANSACTIONS OF $batch_size ROWS
|
||||||
|
""",
|
||||||
|
uuids=uuids,
|
||||||
|
batch_size=batch_size,
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def get_by_uuid(cls, driver: GraphDriver, uuid: str): ...
|
async def get_by_uuid(cls, driver: GraphDriver, uuid: str): ...
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
[project]
|
[project]
|
||||||
name = "graphiti-core"
|
name = "graphiti-core"
|
||||||
description = "A temporal graph building library"
|
description = "A temporal graph building library"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
authors = [
|
authors = [
|
||||||
{ name = "Paul Paliychuk", email = "paul@getzep.com" },
|
{ name = "Paul Paliychuk", email = "paul@getzep.com" },
|
||||||
{ name = "Preston Rasmussen", email = "preston@getzep.com" },
|
{ name = "Preston Rasmussen", email = "preston@getzep.com" },
|
||||||
|
|
|
||||||
2
uv.lock
generated
2
uv.lock
generated
|
|
@ -746,7 +746,7 @@ wheels = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "graphiti-core"
|
name = "graphiti-core"
|
||||||
version = "0.18.6"
|
version = "0.18.7"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "diskcache" },
|
{ name = "diskcache" },
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue