---
name: relation_candidate
lang: py
domain: datascience
version: "1.0.0"
algebraic: product
definition: |
  @dataclass
  class RelationCandidate:
      from_name: str
      to_name: str
      from_id: str = ""
      to_id: str = ""
      relation_type: str = ""
      description: str = ""
      confidence: float = 0.0
      source_chunk_index: int = -1
description: "Candidato de relacion entre dos entidades extraido por el LLM. from_id y to_id se resuelven durante la deduplicacion."
tags: [extraction, relation, llm, knowledge-graph, nlp, datascience]
uses_types: []
file_path: "python/types/datascience/relation_candidate.py"
---

## Campos

- `from_name`: nombre crudo de la entidad origen tal como aparece en el texto
- `to_name`: nombre crudo de la entidad destino
- `from_id`: entity ID resuelto (se llena en la fase de deduplicacion)
- `to_id`: entity ID resuelto del destino
- `relation_type`: tipo de relacion segun los presets del dominio
- `description`: descripcion textual libre de la relacion
- `confidence`: score de confianza 0.0-1.0
- `source_chunk_index`: indice del chunk del que se extrajo (-1 si es desconocido)

## Ejemplo

```python
from python.types.datascience.relation_candidate import RelationCandidate

rel = RelationCandidate(
    from_name="John Smith",
    to_name="Acme Corp",
    relation_type="works_at",
    description="John Smith es CEO de Acme Corp",
    confidence=0.88,
    source_chunk_index=2,
)

print(rel.to_dict())
```

## Notas

Los campos `from_id` y `to_id` empiezan vacios y se resuelven contra el `name_to_id` del `DeduplicationResult`. Relaciones donde no se puede resolver alguno de los IDs se descartan y se cuentan en `ExtractionStats.relations_discarded`. Los self-loops (`from_id == to_id`) tambien se descartan.
