name: graph-operations description: "Graph Operations — графы знаний, сущности и связи. ИСПОЛЬЗУЙ когда строишь граф знаний, ищешь по графу (LightRAG/GraphRAG), извлекаешь сущности, настраиваешь entity extraction, выбираешь режим поиска. Триггеры: 'граф знаний', 'сущности', 'связи', 'entities', 'LightRAG', 'GraphRAG', 'graph traversal', 'entity extraction', 'knowledge graph'. НЕ для векторного поиска (→ search-pipeline-debug)."
Graph Operations
Когда использовать
- "граф знаний", "сущности", "связи", "entities"
- "LightRAG", "GraphRAG", "graph traversal"
- Построение графа, поиск по графу, entity extraction
Режимы поиска по графу
| Режим | Стоимость | Латентность | Когда |
|---|---|---|---|
| LightRAG | ~100 tokens | <500ms | Простые/средние вопросы (default) |
| GraphRAG Local | ~2000 tokens | 2-5s | Сложные вопросы с контекстом |
| GraphRAG Global | ~5000 tokens | 5-10s | Тематические обзоры, map-reduce |
| Auto | varies | varies | Классификатор → LightRAG или Full |
LightRAG (Phase 38)
Поиск по embeddings сущностей/связей в Qdrant graph_embeddings collection:
- 6694 точек (3166 entities + 3528 relations)
- Entity text:
"EntityName (TYPE): key=val" - Relation text:
"Source -[TYPE]-> Target: key=val" - Auto-select: simple/moderate → LightRAG, complex/thematic → Full GraphRAG
Операции
# Построение графа из чанков
builder = GraphBuilder(extractor, graph_store, concurrency=5)
stats = await builder.build_from_chunks(chunks)
# Построение entity embeddings
entity_builder = EntityEmbeddingBuilder(embedding_engine, lightrag_settings)
await entity_builder.build(graph_store)
# Поиск соседей
neighbors = await graph_store.get_neighbors(entity_id, depth=2)
# Поиск пути
path = await graph_store.find_path(source_id, target_id, max_depth=5)
Конфиг
GRAPHRAG__COMMUNITY_DETECTION_ENABLED=true
GRAPHRAG__LEIDEN_RESOLUTION=1.0
GRAPHRAG__LOCAL_SEARCH_DEPTH=1
GRAPHRAG__GLOBAL_SEARCH_MAX_COMMUNITIES=20
LIGHTRAG__ENABLED=true
LIGHTRAG__ENTITY_TOP_K=10
LIGHTRAG__RELATION_TOP_K=10
LIGHTRAG__AUTO_SELECT_ENABLED=true
GRAPHSTORE__PROVIDER=networkx # networkx|neo4j
Incremental Graph Update (Phase 61)
Инкрементальное обновление графа без полной перестройки:
| Компонент | Класс | Назначение |
|---|---|---|
| Change Detector | GraphChangeDetector | Сравнивает entities/relations с предыдущей версией |
| Incremental Updater | IncrementalGraphUpdater | Добавляет/удаляет/обновляет только изменения |
Pipeline: Re-extract entities → Change Detector (diff) → Incremental Updater (apply delta)
Экономит 80-95% времени при обновлении документа (только изменённые entity/relation).
Диагностика
| Симптом | Причина | Решение |
|---|---|---|
| Пустой граф | Entity extraction без результатов | Проверить LLM prompt + token limits |
| LightRAG fallback на vector | Нет entity embeddings | Запустить entity_builder.build(graph_store) |
| Дубли сущностей | Dedup key mismatch | Ключ: name.lower().strip() + entity_type |
| NetworkX медленный | >10K entities | Использовать set_batch_mode(True) + flush() |
Файлы
- Base:
src/pdf_framework/graph_store/base.py - NetworkX:
src/pdf_framework/graph_store/providers/networkx_store.py - Neo4j:
src/pdf_framework/graph_store/providers/neo4j_store.py - Builder:
src/pdf_framework/graph_store/construction/builder.py - Entity embeddings:
src/pdf_framework/graph_store/entity_embeddings.py - Change Detector:
src/pdf_framework/graph_store/change_detector.py - Incremental Updater:
src/pdf_framework/graph_store/incremental.py - Strategies:
src/pdf_framework/search/strategies/graph_search.py,graphrag_light.py,graphrag_global.py,graphrag_auto.py - Extractor:
src/pdf_framework/processing/extractors/entity_extractor.py