From d963b4b9dbc47c015f816826d19a0e94cc60b95b Mon Sep 17 00:00:00 2001 From: Sujay Patil Date: Tue, 2 Apr 2024 15:05:07 -0700 Subject: [PATCH 1/2] account for any_of/exactly_one_of in get_classes_by_slot() --- linkml_runtime/utils/schemaview.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/linkml_runtime/utils/schemaview.py b/linkml_runtime/utils/schemaview.py index 3dfb2a4f..7aeb7597 100644 --- a/linkml_runtime/utils/schemaview.py +++ b/linkml_runtime/utils/schemaview.py @@ -1585,17 +1585,29 @@ 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: + slot_name = slot.name + 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 == c_name and slot not in classes_set: + classes_set.append(slot_name) + # add indirect slots if include_induced: for c_name in all_classes: induced_slot_names = [ ind_slot.name for ind_slot in self.class_induced_slots(c_name) ] - if slot.name in induced_slot_names: + slot_name = slot.name + 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 == c_name and slot not in classes_set: + classes_set.append(slot_name) return list(classes_set) @@ -1610,6 +1622,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(): From 773da98de5cfd688b32a54c07b6aa448d5088cb1 Mon Sep 17 00:00:00 2001 From: Sujay Patil Date: Tue, 2 Apr 2024 15:56:12 -0700 Subject: [PATCH 2/2] corrections to handle any_of/exactly_one_of in get_classes_by_slot() --- linkml_runtime/utils/schemaview.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/linkml_runtime/utils/schemaview.py b/linkml_runtime/utils/schemaview.py index 7aeb7597..0acb047d 100644 --- a/linkml_runtime/utils/schemaview.py +++ b/linkml_runtime/utils/schemaview.py @@ -1587,13 +1587,12 @@ def get_classes_by_slot( # direct slots for c_name, c in all_classes.items(): - slot_name = slot.name - if slot_name in c.slots: + 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 == c_name and slot not in classes_set: - classes_set.append(slot_name) + if x.range: + classes_set.append(c_name) # add indirect slots if include_induced: @@ -1601,13 +1600,12 @@ def get_classes_by_slot( induced_slot_names = [ ind_slot.name for ind_slot in self.class_induced_slots(c_name) ] - slot_name = slot.name - if slot_name in induced_slot_names: + 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 == c_name and slot not in classes_set: - classes_set.append(slot_name) + if x.range: + classes_set.append(c_name) return list(classes_set)