@@ -248,16 +248,38 @@ def parse_linkml(path: Path) -> dict[str, Any]:
248248 slots : dict [str , dict ] = {}
249249
250250 for cls_name in sv .all_classes ():
251- cls_def = sv .get_class (cls_name )
252- induced_slots = sv .class_induced_slots (cls_name )
251+ cls_def = sv .get_class (cls_name )
252+
253+ try :
254+ induced_slots = sv .class_induced_slots (cls_name )
255+ except (ValueError , KeyError ):
256+ # is_a points to a class outside this schema (e.g. NWB's "Container")
257+ # Fall back to directly-declared slots only.
258+ induced_slots = list (cls_def .attributes .values ())
259+ for sname in (cls_def .slots or []):
260+ try :
261+ s = sv .get_slot (sname )
262+ if s :
263+ induced_slots .append (s )
264+ except Exception :
265+ pass
253266
254267 class_uri = cls_def .class_uri or ""
255268 resolved_iri = resolve_prefix (class_uri , prefixes ) if class_uri else ""
256269
270+ # Strip is_a if the parent class isn't in this schema — build_registry_entities
271+ # already handles None gracefully; leaving a dangling name would be misleading.
272+ is_a = cls_def .is_a
273+ if is_a :
274+ try :
275+ sv .get_class (is_a )
276+ except (ValueError , KeyError ):
277+ is_a = None
278+
257279 classes [cls_name ] = {
258280 "iri" : resolved_iri ,
259281 "definition" : cls_def .description or "" ,
260- "is_a" : cls_def . is_a ,
282+ "is_a" : is_a ,
261283 "is_abstract" : bool (cls_def .abstract ),
262284 "slots" : [slot .name for slot in induced_slots ],
263285 }
0 commit comments