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")