Source code for lalandre_core.models.act_relations

"""Pydantic model for relationships extracted between legal acts."""

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, ConfigDict, Field

from .types import RelationType


[docs] class ActRelations(BaseModel): """Represent one typed relationship between two legal acts.""" model_config = ConfigDict(from_attributes=True) id: Optional[int] = Field(default=None, description="Primary key") source_act_id: int = Field(..., description="Source act ID") target_act_id: Optional[int] = Field(default=None, description="Target act ID (NULL if not in DB)") target_celex: Optional[str] = Field(default=None, description="Target CELEX (always stored)") relation_type: RelationType = Field(..., description="Type of relation") source_subdivision_id: Optional[int] = Field(default=None, description="Source subdivision ID") target_subdivision_id: Optional[int] = Field(default=None, description="Target subdivision ID") effect_date: Optional[datetime] = Field(default=None, description="Effect date") description: Optional[str] = Field(default=None, description="Description") evidence: Optional[str] = Field(default=None, description="Exact text evidence from LLM") rationale: Optional[str] = Field(default=None, description="LLM rationale for the relation") resolution_method: Optional[str] = Field( default=None, description="Resolution method (explicit, alias, fuzzy, etc.)" ) resolution_score: Optional[float] = Field(default=None, description="Linker score (0-1)") target_reference: Optional[str] = Field(default=None, description="Raw target reference from text") # Metadata for quality and tracking (added in migration 002) confidence: Optional[float] = Field(default=None, description="LLM confidence score (0-1)", ge=0.0, le=1.0) source: Optional[str] = Field( default=None, max_length=50, description=("Source: rule_extraction, llm_candidate_guided, manual, eurlex, inferred, unknown"), ) validated: Optional[bool] = Field(False, description="Manual validation flag") synced_to_neo4j_at: Optional[datetime] = Field(default=None, description="Last Neo4j sync timestamp") is_resolved: Optional[bool] = Field(True, description="Whether target_act_id is resolved") created_at: Optional[datetime] = Field(default=None, description="Creation timestamp")