#!/usr/bin/env python3 """Clean up orphaned Neo4j graph data""" import asyncio from neo4j import GraphDatabase from config import settings async def cleanup_neo4j(): """Remove all nodes and relationships from Neo4j""" print("=" * 60) print("Neo4j Graph Store Cleanup") print("=" * 60) try: driver = GraphDatabase.driver( settings.neo4j_uri, auth=(settings.neo4j_user, settings.neo4j_password) ) with driver.session() as session: # Count before cleanup result = session.run("MATCH (n) RETURN count(n) as count") nodes_before = result.single()['count'] result = session.run("MATCH ()-[r]->() RETURN count(r) as count") rels_before = result.single()['count'] print(f"\nBefore cleanup:") print(f" • Nodes: {nodes_before}") print(f" • Relationships: {rels_before}") # Delete all relationships first print("\n[1] Deleting all relationships...") result = session.run("MATCH ()-[r]->() DELETE r RETURN count(r) as deleted") rels_deleted = result.single()['deleted'] print(f"✓ Deleted {rels_deleted} relationships") # Delete all nodes print("\n[2] Deleting all nodes...") result = session.run("MATCH (n) DELETE n RETURN count(n) as deleted") nodes_deleted = result.single()['deleted'] print(f"✓ Deleted {nodes_deleted} nodes") # Verify cleanup result = session.run("MATCH (n) RETURN count(n) as count") nodes_after = result.single()['count'] result = session.run("MATCH ()-[r]->() RETURN count(r) as count") rels_after = result.single()['count'] print(f"\nAfter cleanup:") print(f" • Nodes: {nodes_after}") print(f" • Relationships: {rels_after}") if nodes_after == 0 and rels_after == 0: print("\n✅ Neo4j graph store successfully cleaned!") else: print(f"\n⚠️ Warning: {nodes_after} nodes and {rels_after} relationships remain") driver.close() except Exception as e: print(f"\n❌ Error during cleanup: {e}") import traceback traceback.print_exc() return 1 print("\n" + "=" * 60) return 0 if __name__ == "__main__": exit_code = asyncio.run(cleanup_neo4j()) exit(exit_code)