Ashutosh1975270's picture
docs: add Hugging Face Space YAML metadata to README.md
f29cc94
|
Raw
History Blame Contribute Delete
24.3 kB
metadata
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

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

  1. Graph Retrieval β€” Cypher subgraph traversal (neighborhood, multi-hop)
  2. Vector Retrieval β€” ChromaDB cosine similarity search
  3. Hybrid Retrieval β€” Merged graph + vector context

Query Capabilities

  1. Natural Language Query β€” Question β†’ answer with citations
  2. NL-to-Cypher β€” Schema-aware text β†’ Cypher translation
  3. Multi-Hop Reasoning β€” Up to 4-hop relationship chains
  4. Community Detection β€” Louvain algorithm for entity clustering

Frontend (7 Screens)

  1. Query + Graph Split View β€” Main workspace with real-time graph
  2. Graph Explorer β€” Force-directed visualization with search/filter
  3. Community View β€” Community cards with graph sub-view
  4. Multi-Hop Reasoning β€” Step-by-step reasoning path display
  5. Retrieval Comparison β€” Side-by-side Graph vs Vector vs Hybrid
  6. Document Management β€” Upload with progress tracking
  7. 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

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

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

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

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

curl -X POST http://localhost:8000/api/documents/upload/ \
  -H "Authorization: Bearer <your_access_token>" \
  -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)

(: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)

(: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

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

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

cd backend
python manage.py test graphrag.tests_comprehensive
# 112 tests, ~57 seconds

Frontend E2E Tests (Playwright)

cd frontend
npm run test:e2e:install  # Install Chromium
npm run test:e2e          # Run Playwright tests

API Smoke Test

# 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:

curl -X POST http://localhost:8000/api/evaluation/ \
  -H "Authorization: Bearer <token>" \
  -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

# 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

# Verify Neo4j is healthy
docker compose ps neo4j
# Check Neo4j logs
docker compose logs neo4j

LLM API key errors

# 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

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.