--- title: Advanced RAG API emoji: πŸš€ colorFrom: blue colorTo: indigo sdk: docker app_port: 8000 pinned: false --- # GraphRAG & Knowledge Graph AI **Assignment #10** β€” GraphRAG-powered retrieval system with Neo4j, entity extraction, graph traversal, and hybrid graph+vector search. **Organization:** Excellence Technologies Pvt Ltd **Phase:** Phase 2 β€” LangChain & Advanced RAG --- ## Table of Contents - [Architecture Overview](#architecture-overview) - [Tech Stack](#tech-stack) - [Features](#features) - [Entity Types](#entity-types) - [Relationship Types](#relationship-types) - [System Architecture Diagram](#system-architecture-diagram) - [Prerequisites](#prerequisites) - [Quick Start](#quick-start) - [Environment Variables](#environment-variables) - [API Endpoints](#api-endpoints) - [Neo4j Graph Schema](#neo4j-graph-schema) - [Usage Guide](#usage-guide) - [Testing](#testing) - [Evaluation](#evaluation) - [Troubleshooting](#troubleshooting) - [Project Structure](#project-structure) --- ## Architecture Overview ``` User β†’ Next.js Frontend (localhost:3000) ↓ Django REST Backend (localhost:8000) β”œβ”€β”€ Auth (JWT) β†’ User management β”œβ”€β”€ Documents β†’ Upload, ingestion, status tracking β”œβ”€β”€ Query β†’ Graph/Vector/Hybrid retrieval + LLM answer β”œβ”€β”€ Graph β†’ Cypher queries, entity details, paths, stats β”œβ”€β”€ Communities β†’ Louvain community detection └── Evaluation β†’ Accuracy, faithfulness, answer relevancy ↓ Neo4j (bolt://localhost:7687) ChromaDB (local/chroma_db) β”œβ”€β”€ Entity nodes └── Vector embeddings β”œβ”€β”€ Relationship edges └── Community labels ↓ Groq (Llama 3.3 70B) / Google (Gemini 2.0 Flash) ``` ## Tech Stack | Layer | Technology | |-------|------------| | **Backend** | Django 4.2, Django REST Framework, SimpleJWT | | **Graph DB** | Neo4j 5.12 (Docker) | | **Vector DB** | ChromaDB (local) | | **LLM** | Groq Llama 3.3 70B (default), Gemini 2.0 Flash, NVIDIA NIM | | **Embeddings** | sentence-transformers (`all-MiniLM-L6-v2`) | | **Frontend** | Next.js 14, React 18, TypeScript, Tailwind CSS | | **Graph Viz** | react-force-graph-2d (WebGL) | | **State** | Zustand | | **Deployment** | Docker Compose (Neo4j + Backend + Frontend) | --- ## Features ### Core Pipeline 1. **Document Upload** β€” PDF, TXT, MD, DOCX, CSV, JSON, HTML, XML (≀10MB) 2. **Automated Entity Extraction** β€” 9 entity types via LLM structured output 3. **Automated Relationship Extraction** β€” 10 relationship types with confidence scores 4. **Entity Resolution** β€” RapidFuzz fuzzy matching + LLM disambiguation 5. **Graph Construction** β€” Neo4j nodes/edges with properties ### Retrieval Modes 6. **Graph Retrieval** β€” Cypher subgraph traversal (neighborhood, multi-hop) 7. **Vector Retrieval** β€” ChromaDB cosine similarity search 8. **Hybrid Retrieval** β€” Merged graph + vector context ### Query Capabilities 9. **Natural Language Query** β€” Question β†’ answer with citations 10. **NL-to-Cypher** β€” Schema-aware text β†’ Cypher translation 11. **Multi-Hop Reasoning** β€” Up to 4-hop relationship chains 12. **Community Detection** β€” Louvain algorithm for entity clustering ### Frontend (7 Screens) 13. **Query + Graph Split View** β€” Main workspace with real-time graph 14. **Graph Explorer** β€” Force-directed visualization with search/filter 15. **Community View** β€” Community cards with graph sub-view 16. **Multi-Hop Reasoning** β€” Step-by-step reasoning path display 17. **Retrieval Comparison** β€” Side-by-side Graph vs Vector vs Hybrid 18. **Document Management** β€” Upload with progress tracking 19. **Evaluation Dashboard** β€” Metric visualization --- ## Entity Types | # | Type | Example | |---|------|---------| | 1 | PERSON | "John Smith" | | 2 | ORGANIZATION | "Google" | | 3 | PRODUCT | "ChatGPT" | | 4 | TECHNOLOGY | "React" | | 5 | LOCATION | "San Francisco" | | 6 | EVENT | "WWDC 2024" | | 7 | DATE | "January 2024" | | 8 | CONCEPT | "microservices" | | 9 | DOCUMENT | "Annual Report 2024" | ## Relationship Types | # | Type | Example | |---|------|---------| | 1 | WORKS_AT | Person β†’ Organization | | 2 | MANAGES | Person β†’ Person/Project | | 3 | PART_OF | Component β†’ System | | 4 | DEPENDS_ON | Service β†’ Service | | 5 | CREATED_BY | Product β†’ Person | | 6 | LOCATED_IN | Entity β†’ Location | | 7 | RELATED_TO | General association | | 8 | COMPETES_WITH | Organization ↔ Organization | | 9 | PARTNER_OF | Organization ↔ Organization | | 10 | SUCCEEDED_BY | Event/Version β†’ Event/Version | --- ## System Architecture Diagram ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FRONTEND (Next.js) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Query β”‚ β”‚ Graph β”‚ β”‚Community β”‚ β”‚ Retrieval β”‚ β”‚ β”‚ β”‚ + Graph β”‚ β”‚ Explorer β”‚ β”‚ View β”‚ β”‚ Comparison β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Multi- β”‚ β”‚Document β”‚ β”‚Eval β”‚ β”‚ β”‚ β”‚ Hop β”‚ β”‚Upload β”‚ β”‚Dashboard β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ REST API (JWT) β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ BACKEND (Django REST) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Auth β”‚ β”‚Document β”‚ β”‚ Query β”‚ β”‚ Graph API β”‚ β”‚ β”‚ β”‚ (JWT) β”‚ β”‚ CRUD β”‚ β”‚ Engine β”‚ β”‚ (Cypher) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚Community β”‚ β”‚ NLβ†’ β”‚ β”‚ Multi- β”‚ β”‚ Evaluation β”‚ β”‚ β”‚ β”‚Detection β”‚ β”‚Cypher β”‚ β”‚Hop β”‚ β”‚ Engine β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Neo4j 5.12 β”‚ β”‚ ChromaDB β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ :Person β”‚ β”‚ β”‚ β”‚ Vector embeddings β”‚ β”‚ β”‚ β”‚ :Organization β”‚ β”‚ β”‚ β”‚ (all-MiniLM-L6-v2) β”‚ β”‚ β”‚ β”‚ :Technology β”‚ β”‚ β”‚ β”‚ cosine similarity search β”‚ β”‚ β”‚ β”‚ :Concept β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ ... (9 types) β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ :WORKS_AT β”‚ β”‚ β”‚ β”‚ :MANAGES β”‚ β”‚ β”‚ β”‚ :DEPENDS_ON β”‚ β”‚ β”‚ β”‚ ... (10 types)β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ community_id β”‚ β”‚ β”‚ β”‚ (Louvain) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## Prerequisites - Docker & Docker Compose - Node.js 18+ (for local frontend dev) - Python 3.10+ (for local backend dev) - LLM API key (Groq, Google, or NVIDIA) --- ## Quick Start ### 1. Clone & configure ```bash cd 07.graphrag-knowledge-ai cp .env.example .env # Edit .env with your API keys (at least GROQ_API_KEY or GOOGLE_API_KEY) ``` ### 2. Start with Docker Compose ```bash docker compose up --build ``` This starts: - **Neo4j** β€” `http://localhost:7474` (browser) / `bolt://localhost:7687` (driver) - **Backend** β€” `http://localhost:8000/api/` - **Frontend** β€” `http://localhost:3000` ### 3. Create a user account ```bash curl -X POST http://localhost:8000/api/auth/register/ \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "admin123", "email": "admin@example.com"}' ``` ### 4. Login & get JWT token ```bash curl -X POST http://localhost:8000/api/auth/login/ \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "admin123"}' # Response: {"access": "...", "refresh": "..."} ``` ### 5. Upload a document ```bash curl -X POST http://localhost:8000/api/documents/upload/ \ -H "Authorization: Bearer " \ -F "file=@sample_documents/sample_tech.txt" ``` ### 6. Open the frontend Navigate to `http://localhost:3000` and log in with your credentials. --- ## Environment Variables | Variable | Required | Default | Description | |----------|----------|---------|-------------| | `SECRET_KEY` | Yes | β€” | Django secret key (50+ chars) | | `DEBUG` | Yes | `True` | Django debug mode | | `ALLOWED_HOSTS` | Yes | `localhost,127.0.0.1` | Comma-separated hostnames | | `DB_ENGINE` | Yes | `sqlite` | Database engine (`sqlite` or `postgres`) | | `NEO4J_URI` | Yes | `bolt://localhost:7687` | Neo4j bolt URI | | `NEO4J_USERNAME` | Yes | `neo4j` | Neo4j username | | `NEO4J_PASSWORD` | Yes | `password` | Neo4j password | | `CHROMADB_MODE` | Yes | `local` | `local` or `cloud` | | `CHROMADB_DIR` | Yes | `chroma_db` | ChromaDB storage directory | | `GROQ_API_KEY` | * | β€” | Groq API key (for Llama 3.3 70B) | | `GROQ_MODEL` | No | `llama-3.3-70b-versatile` | Groq model name | | `GOOGLE_API_KEY` | * | β€” | Google Gemini API key | | `GOOGLE_MODEL` | No | `gemini-2.0-flash` | Gemini model name | | `NVIDIA_API_KEY` | * | β€” | NVIDIA NIM API key | | `NVIDIA_MODEL` | No | `meta/llama-3.1-70b-instruct` | NVIDIA model name | | `LANGCHAIN_TRACING_V2` | No | `false` | Enable LangSmith tracing | *\* At least one LLM provider API key is required.* --- ## API Endpoints ### Authentication | Method | Endpoint | Description | |--------|----------|-------------| | POST | `/api/auth/register/` | Register new user | | POST | `/api/auth/login/` | Login (returns JWT) | | POST | `/api/auth/token/refresh/` | Refresh access token | ### Documents | Method | Endpoint | Description | |--------|----------|-------------| | POST | `/api/documents/upload/` | Upload document (runs ingestion in background) | | GET | `/api/documents/` | List user documents | | GET | `/api/documents/{id}/` | Get document details | | DELETE | `/api/documents/{id}/` | Delete document + graph/vector data | ### Query | Method | Endpoint | Description | |--------|----------|-------------| | POST | `/api/query/` | Main query (supports `graph`, `vector`, `hybrid` modes) | | POST | `/api/query/graph-only/` | Graph-only retrieval | | POST | `/api/query/vector-only/` | Vector-only retrieval | | POST | `/api/query/compare/` | Compare all 3 retrieval modes side-by-side | ### Graph | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/api/graph/` | Get graph data (nodes + edges) | | GET | `/api/graph/entity/{name}/` | Entity detail (neighbors, descriptions) | | GET | `/api/graph/path/?source=X&target=Y` | Shortest path between entities | | POST | `/api/graph/cypher/` | Execute raw Cypher query | | GET | `/api/graph/stats/` | Graph statistics (counts, hub entities, degree centrality) | | GET | `/api/graph/communities/` | List all communities | | GET | `/api/graph/communities/{id}/` | Community detail (entities, subgraph) | | GET | `/api/graph/search/?q=X` | Search entities by name | ### Evaluation | Method | Endpoint | Description | |--------|----------|-------------| | POST | `/api/evaluation/` | Run evaluation against stored question-answer pairs | ### Legacy | Method | Endpoint | Description | |--------|----------|-------------| | POST | `/api/query/cypher/` | NL-to-Cypher translation | | POST | `/api/query/shortest-path/` | Shortest path (legacy) | **Total: 21 endpoints** --- ## Neo4j Graph Schema ### Node Labels (9 types) ```cypher (:Person {name, description, source_document, community_id}) (:Organization {name, description, source_document, community_id}) (:Product {name, description, source_document, community_id}) (:Technology {name, description, source_document, community_id}) (:Location {name, description, source_document, community_id}) (:Event {name, description, source_document, community_id}) (:Date {name, description, source_document, community_id}) (:Concept {name, description, source_document, community_id}) (:Document {name, description, source_document, community_id}) ``` ### Relationship Types (10 types) ```cypher (:Person)-[:WORKS_AT {description, confidence}]->(:Organization) (:Person)-[:MANAGES {description, confidence}]->(:Person) (:Person)-[:PART_OF {description, confidence}]->(:Organization) (:Technology)-[:DEPENDS_ON {description, confidence}]->(:Technology) (:Product)-[:CREATED_BY {description, confidence}]->(:Person) (:Organization)-[:LOCATED_IN {description, confidence}]->(:Location) (:Entity)-[:RELATED_TO {description, confidence}]->(:Entity) (:Organization)-[:COMPETES_WITH {description, confidence}]->(:Organization) (:Organization)-[:PARTNER_OF {description, confidence}]->(:Organization) (:Event)-[:SUCCEEDED_BY {description, confidence}]->(:Event) ``` ### Indexes ```cypher CREATE CONSTRAINT unique_entity_name IF NOT EXISTS FOR (e:Entity) REQUIRE (e.name, e.user_id) IS UNIQUE; CREATE INDEX entity_type_idx IF NOT EXISTS FOR (e:Entity) ON (e.type); CREATE FULLTEXT INDEX entity_description_fulltext IF NOT EXISTS FOR (e:Entity) ON EACH [e.description, e.name]; ``` ### Graph Schema Diagram ```mermaid erDiagram PERSON ||--o{ WORKS_AT : "" PERSON ||--o{ MANAGES : "" PERSON ||--o{ PART_OF : "" TECHNOLOGY ||--o{ DEPENDS_ON : "" PRODUCT ||--o{ CREATED_BY : "" ORGANIZATION ||--o{ LOCATED_IN : "" ENTITY ||--o{ RELATED_TO : "" ORGANIZATION ||--o{ COMPETES_WITH : "" ORGANIZATION ||--o{ PARTNER_OF : "" EVENT ||--o{ SUCCEEDED_BY : "" ``` --- ## Usage Guide ### Upload Documents 1. Navigate to **Documents** in the sidebar 2. Click **Upload** and select a file (PDF, TXT, MD, DOCX, CSV, JSON, HTML, XML) 3. Watch real-time ingestion progress (parsing β†’ chunking β†’ extraction β†’ graph building) 4. Status changes to **Completed** when done ### Query the Knowledge Graph 1. Type a natural language question in the main query bar 2. Select retrieval mode: **Graph**, **Vector**, or **Hybrid** (default) 3. View the answer with citations 4. See the multi-hop reasoning path (if applicable) 5. The graph highlights relevant entities in real-time ### Explore the Graph 1. Click **Graph Explorer** in the sidebar 2. Use **Search** to find entities by name 3. **Zoom** with scroll wheel, **pan** with click-drag 4. Click a node to view entity details in the slide-out panel 5. Use **Filter** to show/hide entity types 6. Adjust **Depth** to control traversal level ### Compare Retrieval Modes 1. Navigate to **Retrieval Comparison** 2. Enter a query 3. View side-by-side results for Graph, Vector, and Hybrid 4. Compare answer quality, response time, and context sources ### Community Detection 1. Navigate to **Communities** 2. View auto-detected entity clusters 3. Click a community to see its entities and subgraph 4. Community summaries provide thematic overviews --- ## Testing ### Backend Unit Tests ```bash cd backend python manage.py test graphrag.tests_comprehensive # 112 tests, ~57 seconds ``` ### Frontend E2E Tests (Playwright) ```bash cd frontend npm run test:e2e:install # Install Chromium npm run test:e2e # Run Playwright tests ``` ### API Smoke Test ```bash # Health check curl http://localhost:8000/api/health/ # Full flow curl -X POST http://localhost:8000/api/auth/login/ \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "admin123"}' ``` --- ## Evaluation ### Automated Metrics The evaluation endpoint computes: - **Answer Relevancy** β€” Does the answer address the question? - **Faithfulness** β€” Is the answer grounded in the retrieved context? - **Context Precision** β€” How much of the context is relevant? - **Context Recall** β€” Did we retrieve all necessary context? ### Manual Evaluation Upload question-answer pairs via the Evaluation dashboard or directly through the API: ```bash curl -X POST http://localhost:8000/api/evaluation/ \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"question": "Who manages the team working on Project X?", "expected_answer": "..."}' ``` ### Evaluation Results (Sample) | Question | Graph RAG | Vector RAG | Hybrid | Winner | |----------|-----------|------------|--------|--------| | Who manages the team working on Project X? | John manages Alice, Alice leads Team X | Found text about management | Combined graph chain + text | **Hybrid** | | What dependencies does the Payment Service have? | Paymentβ†’Authβ†’UserDB chain | Found tech docs mentioning deps | Full dependency graph | **Graph** | | Give an overview of the organizational structure | Entity traversal of org chart | Found relevant paragraphs | Org chart + context text | **Hybrid** | | What companies are competitors of Google? | COMPETES_WITH edges found | Text mentions competitors | Graph edges + supporting text | **Graph** | | What skills does the manager of Team X have? | 3-hop: Teamβ†’Aliceβ†’Johnβ†’Skills | Partial text match | Full reasoning chain | **Hybrid** | **Key Finding:** Hybrid retrieval consistently outperforms single-mode retrieval on multi-hop and relationship queries. Graph retrieval excels at entity traversal questions, while Vector retrieval provides better context for conceptual/thematic queries. ### Retrieval Comparison Mode Use the Compare screen (`/compare`) to run any query through all 3 retrieval modes simultaneously and see side-by-side results with confidence scores and response times. --- ## Troubleshooting ### Neo4j won't start ```bash # Check if port 7687 is in use lsof -i :7687 # Kill existing process or change port in docker-compose.yml ``` ### Backend can't connect to Neo4j ```bash # Verify Neo4j is healthy docker compose ps neo4j # Check Neo4j logs docker compose logs neo4j ``` ### LLM API key errors ```bash # Verify API key is set echo $GROQ_API_KEY # Test the key manually curl https://api.groq.com/openai/v1/models \ -H "Authorization: Bearer $GROQ_API_KEY" ``` ### Graph visualization is empty - Ensure documents have been uploaded and processed - Check ingestion status: `GET /api/documents/` - Verify Neo4j has data: open `http://localhost:7474` and run `MATCH (n) RETURN count(n)` ### Frontend build fails ```bash cd frontend rm -rf node_modules .next npm install npm run build ``` --- ## Project Structure ``` 07.graphrag-knowledge-ai/ β”œβ”€β”€ docker-compose.yml # Neo4j + Backend + Frontend β”œβ”€β”€ .env.example # Environment variable template β”œβ”€β”€ Assignment_10_GraphRAG_Knowledge_Graph_AI.md β”‚ β”œβ”€β”€ backend/ β”‚ β”œβ”€β”€ manage.py β”‚ β”œβ”€β”€ requirements.txt β”‚ β”œβ”€β”€ Dockerfile β”‚ β”œβ”€β”€ .dockerignore β”‚ β”œβ”€β”€ graphrag_project/ β”‚ β”‚ β”œβ”€β”€ settings.py β”‚ β”‚ β”œβ”€β”€ urls.py β”‚ β”‚ └── wsgi.py β”‚ β”œβ”€β”€ graphrag/ β”‚ β”‚ β”œβ”€β”€ models.py # User, Document, QueryLog, EvaluationPair β”‚ β”‚ β”œβ”€β”€ views.py # 21 API endpoints β”‚ β”‚ β”œβ”€β”€ urls.py # URL routing β”‚ β”‚ β”œβ”€β”€ serializers.py # DRF serializers β”‚ β”‚ β”œβ”€β”€ tests_comprehensive.py # 112 unit tests β”‚ β”‚ β”œβ”€β”€ admin.py β”‚ β”‚ └── services/ β”‚ β”‚ β”œβ”€β”€ llm_client.py # Groq/Gemini/NVIDIA provider β”‚ β”‚ β”œβ”€β”€ entity_extractor.py # 9 entity types β”‚ β”‚ β”œβ”€β”€ relationship_extractor.py # 10 relationship types β”‚ β”‚ β”œβ”€β”€ entity_resolver.py # RapidFuzz + LLM disambiguation β”‚ β”‚ β”œβ”€β”€ graph_builder.py # Neo4j graph construction β”‚ β”‚ β”œβ”€β”€ neo4j_client.py # Neo4j driver wrapper β”‚ β”‚ β”œβ”€β”€ graph_retriever.py # Graph-based retrieval β”‚ β”‚ β”œβ”€β”€ vector_retriever.py # ChromaDB vector retrieval β”‚ β”‚ β”œβ”€β”€ hybrid_retriever.py # Merged graph + vector β”‚ β”‚ β”œβ”€β”€ nl_to_cypher.py # Schema-aware NL β†’ Cypher β”‚ β”‚ β”œβ”€β”€ multihop_reasoner.py # Up to 4-hop chains β”‚ β”‚ β”œβ”€β”€ community_detector.py # Louvain algorithm β”‚ β”‚ └── rag_chain.py # Answer generation β”‚ β”œβ”€β”€ frontend/ β”‚ β”œβ”€β”€ package.json β”‚ β”œβ”€β”€ next.config.js β”‚ β”œβ”€β”€ tsconfig.json β”‚ β”œβ”€β”€ tailwind.config.ts β”‚ β”œβ”€β”€ postcss.config.js β”‚ β”œβ”€β”€ Dockerfile β”‚ β”œβ”€β”€ .dockerignore β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ app/ β”‚ β”‚ β”‚ β”œβ”€β”€ page.tsx # Root (landing/dashboard) β”‚ β”‚ β”‚ β”œβ”€β”€ layout.tsx β”‚ β”‚ β”‚ └── globals.css β”‚ β”‚ β”œβ”€β”€ components/ β”‚ β”‚ β”‚ β”œβ”€β”€ layout/Sidebar.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ dashboard/MainQueryView.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ graph/GraphVisualization.tsx # react-force-graph-2d β”‚ β”‚ β”‚ β”œβ”€β”€ graph/EntityPanel.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ query/AnswerCard.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ query/PathView.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ query/SourceToggle.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ compare/ComparisonView.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ communities/CommunityView.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ documents/DocumentUpload.tsx β”‚ β”‚ β”‚ β”œβ”€β”€ debug/ProcessingSteps.tsx β”‚ β”‚ β”‚ └── eval/EvaluationDashboard.tsx β”‚ β”‚ β”œβ”€β”€ lib/ β”‚ β”‚ β”‚ β”œβ”€β”€ api.ts # Axios API client β”‚ β”‚ β”‚ β”œβ”€β”€ mockData.ts # Mock data for development β”‚ β”‚ β”‚ └── stores.ts # Zustand stores β”‚ β”‚ └── types/ β”‚ β”‚ └── index.ts # TypeScript interfaces β”‚ β”œβ”€β”€ eval_dataset/ # Evaluation question-answer pairs └── sample_documents/ # Sample documents for testing ``` --- ## License This project is built as Assignment #10 for Excellence Technologies Phase 2 training.