36 lines
1.2 KiB
Python
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())
|