pub fn normalize_edge_type(raw: &str) -> Result<String, String>Expand description
Canonical form for edge types: Unicode-lowercased, with runs of
whitespace, hyphens, and underscores collapsed to a single underscore
(leading/trailing separators dropped). "Works At", "works-at", and
"works_at" all normalize to "works_at" — one relation, one vocabulary
entry, instead of three parallel edge types that silently fragment
traversal filters. Every front-end write path (link tool, batch link
command, CLI) passes edge types through here; read-side type filters
should probe both the raw and normalized forms so edges written before
normalization stay reachable. Err on a type that normalizes to empty.