mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
fix(ontology): coalesce normalized property collisions Different raw property spellings can normalize to the same ontology name and IRI. works_for and worksFor, for example, both normalize to worksFor, but property inference emitted a separate definition for each spelling, so the generated ontology declared two distinct properties under what would become the same IRI once minted. The same collapse could also happen across kinds: a relationship type and an entity attribute that normalize to the same name would previously produce a data property and an object property sharing one name, with no signal that anything was wrong. infer_properties() now runs a coalescing pass after object and data properties are both inferred. Properties are grouped by (kind, name). Object properties that collide are merged in occurrence order: domains and ranges are unioned rather than overwritten, so a property seen across several source classes keeps every domain instead of losing all but the first, and occurrence_count is summed across the merged spellings so downstream confidence/frequency signals stay correct. Data properties merge domains the same way and reconcile differing ranges through the existing _get_more_general_type() widening logic already used elsewhere in this file, rather than a new implementation. A name that resolves to both an object property and a data property is not silently coalesced into either one, since the two kinds mean different things in the emitted ontology. That case raises a ValidationError up front, naming every colliding name and which kinds collided, so the conflict surfaces before an ambiguous ontology is written rather than after. Verified beyond the two cases in the new test file: a data property colliding across two different domain classes correctly unions the domain instead of keeping only the first class, and three distinct spellings of the same relationship type collapse into one property with the occurrence count correctly summed across all three. Follow-up to #1170 (relationship endpoint types) and #1171 (retained data properties for normalized class names).