Phase 4 구현 완료: Neo4j 벡터 검색 + 그래프 저장소

This commit is contained in:
lasta
2026-05-14 10:35:31 +09:00
parent ec4f9a64f6
commit 7ea8df65d8
34 changed files with 4459 additions and 7 deletions

View File

@@ -0,0 +1,5 @@
"""API routes."""
from .extraction import router as extraction_router
__all__ = ["extraction_router"]

View File

@@ -0,0 +1,71 @@
"""
Phase 0 Extraction routes: Fast JSON Extraction MVP.
No database storage - just extract and return JSON candidates.
Goal: 10-30 seconds per URL.
"""
from fastapi import APIRouter, HTTPException
import time
from ont_platform.core.extractors.web_extractor import extract_web_content
from ont_platform.core.extraction.lightweight_extractor import LightweightExtractor
router = APIRouter(prefix="/api/v1", tags=["extraction"])
@router.post("/extract/url")
async def extract_url(url: str):
"""
Extract candidates from URL (Phase 0 MVP).
Returns:
{
"url": "...",
"title": "...",
"entities": [...],
"relations": [...],
"extraction_time_sec": 0.5,
"warnings": [...]
}
"""
if not url:
raise HTTPException(status_code=400, detail="url is required")
start_time = time.time()
try:
# Step 1: Extract web content with Trafilatura
extracted = extract_web_content(url=url)
# Step 2: Extract JSON candidates with lightweight extractor
lightweight = LightweightExtractor(use_llm=False)
candidates = lightweight.extract(
text=extracted.text,
project_id="default", # Phase 0: no projects yet
document_id="temp",
)
extraction_time = time.time() - start_time
# Return just the JSON (entities/relations are already dicts)
return {
"url": url,
"title": extracted.title,
"author": extracted.author,
"published_date": extracted.publish_date,
"language": extracted.language,
"text_length": len(extracted.text),
"entities": candidates.entities,
"relations": candidates.relations,
"extraction_time_sec": round(extraction_time, 2),
"entity_count": len(candidates.entities),
"relation_count": len(candidates.relations),
"warnings": candidates.warnings,
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Extraction failed: {str(e)}")
__all__ = ["router"]