diff --git a/linkml_runtime/utils/schemaview.py b/linkml_runtime/utils/schemaview.py index 3dfb2a4f..0acb047d 100644 --- a/linkml_runtime/utils/schemaview.py +++ b/linkml_runtime/utils/schemaview.py @@ -1585,10 +1585,16 @@ def get_classes_by_slot( classes_set = set() # use set to avoid duplicates all_classes = self.all_classes() + # direct slots for c_name, c in all_classes.items(): if slot.name in c.slots: classes_set.add(c_name) + if slot.any_of or slot.exactly_one_of: + for x in slot.any_of + slot.exactly_one_of: + if x.range: + classes_set.append(c_name) + # add indirect slots if include_induced: for c_name in all_classes: induced_slot_names = [ @@ -1596,6 +1602,10 @@ def get_classes_by_slot( ] if slot.name in induced_slot_names: classes_set.add(c_name) + if slot.any_of or slot.exactly_one_of: + for x in slot.any_of + slot.exactly_one_of: + if x.range: + classes_set.append(c_name) return list(classes_set) @@ -1610,6 +1620,10 @@ def get_slots_by_enum(self, enum_name: ENUM_NAME = None) -> List[SlotDefinition] for s in self.all_slots().values(): if s.range == enum_name and s not in enum_slots: enum_slots.append(s) + if s.any_of or s.exactly_one_of: + for x in s.any_of + s.exactly_one_of: + if x.range == enum_name and s not in enum_slots: + enum_slots.append(s) for class_definition in self.all_classes().values(): if class_definition.slot_usage: for slot_definition in class_definition.slot_usage.values():