claims.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. """Claim extraction helpers for Atlas layered outputs."""
  2. from __future__ import annotations
  3. from typing import Any
  4. from app.models import AtlasClaim, AtlasEntity, AtlasProvenance
  5. def _prov_to_dict(p: AtlasProvenance | None) -> dict[str, Any] | None:
  6. if p is None:
  7. return None
  8. return {
  9. "source": p.source,
  10. "method": p.retrieval_method,
  11. "confidence": p.confidence,
  12. "retrieved_at": p.retrieved_at,
  13. }
  14. def _id_type_resource(identifier_type: str) -> str:
  15. if identifier_type == "mid":
  16. return "atlas:Mid"
  17. if identifier_type == "qid":
  18. return "atlas:WikidataQID"
  19. return f"atlas:{identifier_type}"
  20. def _claim_to_dict(claim: AtlasClaim) -> dict[str, Any]:
  21. obj: dict[str, Any] = {
  22. "kind": claim.object.kind,
  23. "value": claim.object.value,
  24. }
  25. if claim.object.id_type:
  26. obj["id_type"] = _id_type_resource(claim.object.id_type)
  27. return {
  28. "claim_id": claim.claim_id,
  29. "layer": claim.layer,
  30. "status": claim.status,
  31. "subject": claim.subject,
  32. "predicate": claim.predicate,
  33. "object": obj,
  34. "provenance": _prov_to_dict(claim.provenance),
  35. }
  36. def build_claim_sets(entity: AtlasEntity) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
  37. raw_claims = [_claim_to_dict(c) for c in entity.claims if c.layer == "raw"]
  38. derived_claims = [_claim_to_dict(c) for c in entity.claims if c.layer == "derived"]
  39. return raw_claims, derived_claims