Spaces:
Running
Running
Update src/visualization.py
Browse files- src/visualization.py +40 -57
src/visualization.py
CHANGED
@@ -492,69 +492,52 @@ def display_ontology_stats(ontology_manager):
|
|
492 |
|
493 |
|
494 |
def display_class_hierarchy_tree(ontology_manager, class_hierarchy):
|
495 |
-
"""Display class hierarchy
|
496 |
-
# Find
|
497 |
all_subclasses = set()
|
498 |
for subclasses in class_hierarchy.values():
|
499 |
all_subclasses.update(subclasses)
|
500 |
-
|
|
|
501 |
root_classes = [cls for cls in ontology_manager.get_classes() if cls not in all_subclasses]
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
# Get class info
|
506 |
-
class_info = ontology_manager.ontology_data["classes"].get(class_name, {})
|
507 |
description = class_info.get("description", "")
|
508 |
-
instance_count = len(ontology_manager.get_instances_of_class(
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
st.markdown(
|
515 |
-
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
# Display subclasses
|
523 |
-
subclasses = class_hierarchy.get(class_name, [])
|
524 |
-
if subclasses:
|
525 |
-
st.markdown("**Subclasses:**")
|
526 |
-
for subclass in sorted(subclasses):
|
527 |
-
display_subclasses(subclass, indent + 1)
|
528 |
-
else:
|
529 |
-
st.markdown("*No subclasses*")
|
530 |
-
else:
|
531 |
-
# Nested classes use indentation and only show direct instances
|
532 |
-
if instance_count > 0:
|
533 |
-
class_label = f"π {class_name} ({instance_count} instances)"
|
534 |
else:
|
535 |
-
|
536 |
-
|
537 |
-
|
538 |
-
|
539 |
-
|
540 |
-
|
541 |
-
|
542 |
-
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
553 |
-
|
554 |
-
|
555 |
-
# Display each root class
|
556 |
-
for root_class in sorted(root_classes):
|
557 |
-
display_subclasses(root_class)
|
558 |
|
559 |
def get_class_depths(ontology_manager) -> Dict[str, int]:
|
560 |
"""Calculate the inheritance depth of each class."""
|
|
|
492 |
|
493 |
|
494 |
def display_class_hierarchy_tree(ontology_manager, class_hierarchy):
|
495 |
+
"""Display class hierarchy using expanders at root level, and plain list for subclasses."""
|
496 |
+
# Find all subcategory sets
|
497 |
all_subclasses = set()
|
498 |
for subclasses in class_hierarchy.values():
|
499 |
all_subclasses.update(subclasses)
|
500 |
+
|
501 |
+
# Root classes are those that are not subclassed by any class
|
502 |
root_classes = [cls for cls in ontology_manager.get_classes() if cls not in all_subclasses]
|
503 |
+
|
504 |
+
for root_class in sorted(root_classes):
|
505 |
+
class_info = ontology_manager.ontology_data["classes"].get(root_class, {})
|
|
|
|
|
506 |
description = class_info.get("description", "")
|
507 |
+
instance_count = len(ontology_manager.get_instances_of_class(root_class, include_subclasses=False))
|
508 |
+
properties = class_info.get("properties", [])
|
509 |
+
|
510 |
+
with st.expander(f"π {root_class} ({instance_count} instances)", expanded=True):
|
511 |
+
st.markdown(f"**Description:** {description}")
|
512 |
+
if properties:
|
513 |
+
st.markdown("**Properties:**")
|
514 |
+
st.markdown(", ".join(properties))
|
515 |
+
|
516 |
+
subclasses = class_hierarchy.get(root_class, [])
|
517 |
+
if subclasses:
|
518 |
+
st.markdown("**Subclasses:**")
|
519 |
+
for subclass in sorted(subclasses):
|
520 |
+
display_subclass_plain(subclass, class_hierarchy, ontology_manager, indent=1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
521 |
else:
|
522 |
+
st.markdown("*No subclasses*")
|
523 |
+
|
524 |
+
|
525 |
+
def display_subclass_plain(class_name, class_hierarchy, ontology_manager, indent=1):
|
526 |
+
"""Use indentation to render subclass info without nested expanders."""
|
527 |
+
indent_str = "β" * indent
|
528 |
+
class_info = ontology_manager.ontology_data["classes"].get(class_name, {})
|
529 |
+
description = class_info.get("description", "")
|
530 |
+
properties = class_info.get("properties", [])
|
531 |
+
instance_count = len(ontology_manager.get_instances_of_class(class_name, include_subclasses=False))
|
532 |
+
|
533 |
+
st.markdown(f"{indent_str}πΉ **{class_name}** ({instance_count} instances)")
|
534 |
+
st.markdown(f"{indent_str}> {description}")
|
535 |
+
if properties:
|
536 |
+
st.markdown(f"{indent_str}*Properties:* {', '.join(properties)}")
|
537 |
+
|
538 |
+
subclasses = class_hierarchy.get(class_name, [])
|
539 |
+
for subclass in sorted(subclasses):
|
540 |
+
display_subclass_plain(subclass, class_hierarchy, ontology_manager, indent + 1)
|
|
|
|
|
|
|
|
|
541 |
|
542 |
def get_class_depths(ontology_manager) -> Dict[str, int]:
|
543 |
"""Calculate the inheritance depth of each class."""
|