Files
AI/ontology_platform/crawler_platform/app/adapters/base.py
2026-05-20 13:21:08 +09:00

36 lines
1.2 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
@dataclass(frozen=True, slots=True)
class DomainAdapter:
"""Domain-specific semantics plugged into the generic ontology engine."""
domain: str
relation_rules: dict[str, Any] = field(default_factory=dict)
entity_type_aliases: dict[str, str] = field(default_factory=dict)
entity_name_aliases: dict[str, dict[str, str]] = field(default_factory=dict)
def relation_rule(self, predicate: str) -> Any | None:
return self.relation_rules.get(predicate)
def normalize_entity_type(self, raw_type: str) -> str | None:
key = compact_key(raw_type)
return self.entity_type_aliases.get(key)
def normalize_entity_name(self, raw_name: str, entity_type: str | None = None) -> str | None:
if not entity_type:
return None
aliases = self.entity_name_aliases.get(entity_type, {})
return aliases.get(canonical_key(raw_name))
def compact_key(value: Any) -> str:
return "".join(ch for ch in str(value or "").strip().lower() if ch.isalnum())
def canonical_key(value: Any) -> str:
return " ".join(str(value or "").strip().lower().split())