Enhance graph API endpoints with detailed docs and field validation

- Remove redundant README section
- Add Pydantic field validation
- Expand endpoint docstrings
- Include request/response examples
- Document merge operation benefits
This commit is contained in:
yangdx 2025-10-10 12:49:00 +08:00
parent 85d1a563b3
commit 12facac506
2 changed files with 162 additions and 96 deletions

View file

@ -543,69 +543,6 @@ You can test the API endpoints using the provided curl commands or through the S
4. Query the system using the query endpoints 4. Query the system using the query endpoints
5. Trigger document scan if new files are put into the inputs directory 5. Trigger document scan if new files are put into the inputs directory
### Graph Manipulation Endpoints
LightRAG provides REST API endpoints for direct knowledge graph manipulation:
#### Create Entity
Create a new entity in the knowledge graph:
```bash
curl -X POST "http://localhost:9621/graph/entity/create" \
-H "Content-Type: application/json" \
-d '{
"entity_name": "Tesla",
"entity_data": {
"description": "Electric vehicle manufacturer",
"entity_type": "ORGANIZATION"
}
}'
```
#### Create Relationship
Create a new relationship between two existing entities:
```bash
curl -X POST "http://localhost:9621/graph/relation/create" \
-H "Content-Type: application/json" \
-d '{
"source_entity": "Elon Musk",
"target_entity": "Tesla",
"relation_data": {
"description": "Elon Musk is the CEO of Tesla",
"keywords": "CEO, founder",
"weight": 1.0
}
}'
```
#### Merge Entities
Consolidate duplicate or misspelled entities while preserving all relationships:
```bash
curl -X POST "http://localhost:9621/graph/entities/merge" \
-H "Content-Type: application/json" \
-d '{
"entities_to_change": ["Elon Msk", "Ellon Musk"],
"entity_to_change_into": "Elon Musk"
}'
```
**What the merge operation does:**
- Deletes the specified source entities
- Transfers all relationships from source entities to the target entity
- Intelligently merges duplicate relationships
- Updates vector embeddings for accurate retrieval
- Preserves the entire graph structure
This is particularly useful for:
- Fixing spelling errors in entity names
- Consolidating duplicate entities discovered after document processing
- Cleaning up the knowledge graph for better query performance
## Asynchronous Document Indexing with Progress Tracking ## Asynchronous Document Indexing with Progress Tracking
LightRAG implements asynchronous document indexing to enable frontend monitoring and querying of document processing progress. Upon uploading files or inserting text through designated endpoints, a unique Track ID is returned to facilitate real-time progress monitoring. LightRAG implements asynchronous document indexing to enable frontend monitoring and querying of document processing progress. Upon uploading files or inserting text through designated endpoints, a unique Track ID is returned to facilitate real-time progress monitoring.

View file

@ -5,7 +5,7 @@ This module contains all graph-related routes for the LightRAG API.
from typing import Optional, Dict, Any from typing import Optional, Dict, Any
import traceback import traceback
from fastapi import APIRouter, Depends, Query, HTTPException from fastapi import APIRouter, Depends, Query, HTTPException
from pydantic import BaseModel from pydantic import BaseModel, Field
from lightrag.utils import logger from lightrag.utils import logger
from ..utils_api import get_combined_auth_dependency from ..utils_api import get_combined_auth_dependency
@ -26,19 +26,63 @@ class RelationUpdateRequest(BaseModel):
class EntityMergeRequest(BaseModel): class EntityMergeRequest(BaseModel):
entities_to_change: list[str] entities_to_change: list[str] = Field(
entity_to_change_into: str ...,
description="List of entity names to be merged and deleted. These are typically duplicate or misspelled entities.",
min_length=1,
examples=[["Elon Msk", "Ellon Musk"]],
)
entity_to_change_into: str = Field(
...,
description="Target entity name that will receive all relationships from the source entities. This entity will be preserved.",
min_length=1,
examples=["Elon Musk"],
)
class EntityCreateRequest(BaseModel): class EntityCreateRequest(BaseModel):
entity_name: str entity_name: str = Field(
entity_data: Dict[str, Any] ...,
description="Unique name for the new entity",
min_length=1,
examples=["Tesla"],
)
entity_data: Dict[str, Any] = Field(
...,
description="Dictionary containing entity properties. Common fields include 'description' and 'entity_type'.",
examples=[
{
"description": "Electric vehicle manufacturer",
"entity_type": "ORGANIZATION",
}
],
)
class RelationCreateRequest(BaseModel): class RelationCreateRequest(BaseModel):
source_entity: str source_entity: str = Field(
target_entity: str ...,
relation_data: Dict[str, Any] description="Name of the source entity. This entity must already exist in the knowledge graph.",
min_length=1,
examples=["Elon Musk"],
)
target_entity: str = Field(
...,
description="Name of the target entity. This entity must already exist in the knowledge graph.",
min_length=1,
examples=["Tesla"],
)
relation_data: Dict[str, Any] = Field(
...,
description="Dictionary containing relationship properties. Common fields include 'description', 'keywords', and 'weight'.",
examples=[
{
"description": "Elon Musk is the CEO of Tesla",
"keywords": "CEO, founder",
"weight": 1.0,
}
],
)
def create_graph_routes(rag, api_key: Optional[str] = None): def create_graph_routes(rag, api_key: Optional[str] = None):
@ -246,15 +290,36 @@ def create_graph_routes(rag, api_key: Optional[str] = None):
""" """
Create a new entity in the knowledge graph Create a new entity in the knowledge graph
Args: This endpoint creates a new entity node in the knowledge graph with the specified
request (EntityCreateRequest): Request containing: properties. The system automatically generates vector embeddings for the entity
- entity_name: Name of the entity to enable semantic search and retrieval.
- entity_data: Dictionary of entity properties (e.g., description, entity_type)
Returns: Request Body:
Dict: Created entity information entity_name (str): Unique name identifier for the entity
entity_data (dict): Entity properties including:
- description (str): Textual description of the entity
- entity_type (str): Category/type of the entity (e.g., PERSON, ORGANIZATION, LOCATION)
- Additional custom properties as needed
Example: Response Schema:
{
"status": "success",
"message": "Entity 'Tesla' created successfully",
"data": {
"entity_name": "Tesla",
"description": "Electric vehicle manufacturer",
"entity_type": "ORGANIZATION",
... (other entity properties)
}
}
HTTP Status Codes:
200: Entity created successfully
400: Invalid request (e.g., missing required fields, duplicate entity)
500: Internal server error
Example Request:
POST /graph/entity/create
{ {
"entity_name": "Tesla", "entity_name": "Tesla",
"entity_data": { "entity_data": {
@ -296,16 +361,45 @@ def create_graph_routes(rag, api_key: Optional[str] = None):
""" """
Create a new relationship between two entities in the knowledge graph Create a new relationship between two entities in the knowledge graph
Args: This endpoint establishes a directed relationship between two existing entities.
request (RelationCreateRequest): Request containing: Both the source and target entities must already exist in the knowledge graph.
- source_entity: Source entity name The system automatically generates vector embeddings for the relationship to
- target_entity: Target entity name enable semantic search and graph traversal.
- relation_data: Dictionary of relation properties (e.g., description, keywords, weight)
Returns: Prerequisites:
Dict: Created relation information - Both source_entity and target_entity must exist in the knowledge graph
- Use /graph/entity/create to create entities first if they don't exist
Example: Request Body:
source_entity (str): Name of the source entity (relationship origin)
target_entity (str): Name of the target entity (relationship destination)
relation_data (dict): Relationship properties including:
- description (str): Textual description of the relationship
- keywords (str): Comma-separated keywords describing the relationship type
- weight (float): Relationship strength/importance (default: 1.0)
- Additional custom properties as needed
Response Schema:
{
"status": "success",
"message": "Relation created successfully between 'Elon Musk' and 'Tesla'",
"data": {
"src_id": "Elon Musk",
"tgt_id": "Tesla",
"description": "Elon Musk is the CEO of Tesla",
"keywords": "CEO, founder",
"weight": 1.0,
... (other relationship properties)
}
}
HTTP Status Codes:
200: Relationship created successfully
400: Invalid request (e.g., missing entities, invalid data, duplicate relationship)
500: Internal server error
Example Request:
POST /graph/relation/create
{ {
"source_entity": "Elon Musk", "source_entity": "Elon Musk",
"target_entity": "Tesla", "target_entity": "Tesla",
@ -351,24 +445,59 @@ def create_graph_routes(rag, api_key: Optional[str] = None):
@router.post("/graph/entities/merge", dependencies=[Depends(combined_auth)]) @router.post("/graph/entities/merge", dependencies=[Depends(combined_auth)])
async def merge_entities(request: EntityMergeRequest): async def merge_entities(request: EntityMergeRequest):
""" """
Merge multiple entities into a single entity, preserving all relationships. Merge multiple entities into a single entity, preserving all relationships
This endpoint is useful for consolidating duplicate or misspelled entities. This endpoint consolidates duplicate or misspelled entities while preserving the entire
All relationships from the source entities will be transferred to the target entity. graph structure. It's particularly useful for cleaning up knowledge graphs after document
processing or correcting entity name variations.
Args: What the Merge Operation Does:
request (EntityMergeRequest): Request containing: 1. Deletes the specified source entities from the knowledge graph
- entities_to_change: List of entity names to be removed 2. Transfers all relationships from source entities to the target entity
- entity_to_change_into: Name of the target entity to merge into 3. Intelligently merges duplicate relationships (if multiple sources have the same relationship)
4. Updates vector embeddings for accurate retrieval and search
5. Preserves the complete graph structure and connectivity
6. Maintains relationship properties and metadata
Returns: Use Cases:
Dict: Result of the merge operation with merged entity information - Fixing spelling errors in entity names (e.g., "Elon Msk" -> "Elon Musk")
- Consolidating duplicate entities discovered after document processing
- Merging name variations (e.g., "NY", "New York", "New York City")
- Cleaning up the knowledge graph for better query performance
- Standardizing entity names across the knowledge base
Example: Request Body:
entities_to_change (list[str]): List of entity names to be merged and deleted
entity_to_change_into (str): Target entity that will receive all relationships
Response Schema:
{
"status": "success",
"message": "Successfully merged 2 entities into 'Elon Musk'",
"data": {
"merged_entity": "Elon Musk",
"deleted_entities": ["Elon Msk", "Ellon Musk"],
"relationships_transferred": 15,
... (merge operation details)
}
}
HTTP Status Codes:
200: Entities merged successfully
400: Invalid request (e.g., empty entity list, target entity doesn't exist)
500: Internal server error
Example Request:
POST /graph/entities/merge
{ {
"entities_to_change": ["Elon Msk", "Ellon Musk"], "entities_to_change": ["Elon Msk", "Ellon Musk"],
"entity_to_change_into": "Elon Musk" "entity_to_change_into": "Elon Musk"
} }
Note:
- The target entity (entity_to_change_into) must exist in the knowledge graph
- Source entities will be permanently deleted after the merge
- This operation cannot be undone, so verify entity names before merging
""" """
try: try:
result = await rag.amerge_entities( result = await rag.amerge_entities(