From a405c92e0e779cda5b6918a619e2a000de8ebca2 Mon Sep 17 00:00:00 2001 From: Trish Whetzel Date: Mon, 3 Jun 2024 15:51:12 -0700 Subject: [PATCH 1/9] rename edge to mapping --- src/oaklib/interfaces/differ_interface.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/oaklib/interfaces/differ_interface.py b/src/oaklib/interfaces/differ_interface.py index 36e939922..ffde29ccf 100644 --- a/src/oaklib/interfaces/differ_interface.py +++ b/src/oaklib/interfaces/differ_interface.py @@ -11,9 +11,11 @@ Change, ClassCreation, Edge, - EdgeChange, - EdgeCreation, EdgeDeletion, + Mapping, + MappingChange, + MappingCreation, + MappingDeletion, NewSynonym, NewTextDefinition, NodeCreation, @@ -275,34 +277,34 @@ def diff( if mappings_added_set: for mapping in mappings_added_set: predicate, xref = mapping - edge_created = EdgeCreation( + mapping_created = MappingCreation( id=_gen_id(), subject=entity, predicate=predicate, object=xref, ) - yield edge_created + yield mapping_created if mappings_removed_set: for mapping in mappings_removed_set: predicate, xref = mapping - deleted_edge = EdgeDeletion( + deleted_mapping = MappingDeletion( id=_gen_id(), subject=entity, predicate=predicate, object=xref, ) - yield deleted_edge + yield deleted_mapping if mapping_changed_set: for changes in mapping_changed_set: object, new_predicate, old_predicate = changes - edge_change = EdgeChange( + mapping_change = MappingChange( id=_gen_id(), - about_edge=Edge(subject=entity, predicate=old_predicate, object=object), + about_mapping=Mapping(subject=entity, predicate=old_predicate, object=object), old_value=old_predicate, new_value=new_predicate, ) - yield edge_change + yield mapping_change # ! Subset changes self_subsets = set(self.terms_subsets([entity])) From cd55742f5c0567e5ffd16b88cfc62cb50957f04e Mon Sep 17 00:00:00 2001 From: Chris Mungall Date: Tue, 4 Jun 2024 08:49:18 -0700 Subject: [PATCH 2/9] Update differ_interface.py --- src/oaklib/interfaces/differ_interface.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/oaklib/interfaces/differ_interface.py b/src/oaklib/interfaces/differ_interface.py index ffde29ccf..d64824a38 100644 --- a/src/oaklib/interfaces/differ_interface.py +++ b/src/oaklib/interfaces/differ_interface.py @@ -12,7 +12,6 @@ ClassCreation, Edge, EdgeDeletion, - Mapping, MappingChange, MappingCreation, MappingDeletion, From e6c326aed21a5e4324e9f9c9bff41c39b6312f1b Mon Sep 17 00:00:00 2001 From: Harshad Hegde Date: Mon, 17 Jun 2024 10:36:53 -0500 Subject: [PATCH 3/9] Added MappingReplacement and RemoveMapping --- src/oaklib/interfaces/differ_interface.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/oaklib/interfaces/differ_interface.py b/src/oaklib/interfaces/differ_interface.py index d64824a38..5fd796080 100644 --- a/src/oaklib/interfaces/differ_interface.py +++ b/src/oaklib/interfaces/differ_interface.py @@ -12,9 +12,8 @@ ClassCreation, Edge, EdgeDeletion, - MappingChange, MappingCreation, - MappingDeletion, + MappingReplacement, NewSynonym, NewTextDefinition, NodeCreation, @@ -27,6 +26,7 @@ NodeTextDefinitionChange, NodeUnobsoletion, PredicateChange, + RemoveMapping, RemoveNodeFromSubset, RemoveSynonym, RemoveTextDefinition, @@ -286,7 +286,7 @@ def diff( if mappings_removed_set: for mapping in mappings_removed_set: predicate, xref = mapping - deleted_mapping = MappingDeletion( + deleted_mapping = RemoveMapping( id=_gen_id(), subject=entity, predicate=predicate, @@ -296,9 +296,9 @@ def diff( if mapping_changed_set: for changes in mapping_changed_set: object, new_predicate, old_predicate = changes - mapping_change = MappingChange( + mapping_change = MappingReplacement( id=_gen_id(), - about_mapping=Mapping(subject=entity, predicate=old_predicate, object=object), + about_mapping=Edge(subject=entity, predicate=old_predicate, object=object), old_value=old_predicate, new_value=new_predicate, ) From 7f8d81fbb6c2b720e3349597f8762598b8ae8f37 Mon Sep 17 00:00:00 2001 From: Harshad Hegde Date: Tue, 18 Jun 2024 15:30:18 -0500 Subject: [PATCH 4/9] MappingPredicateChange --- src/oaklib/interfaces/differ_interface.py | 10 +- .../utilities/writers/change_handler.py | 109 ++++++++++++------ 2 files changed, 78 insertions(+), 41 deletions(-) diff --git a/src/oaklib/interfaces/differ_interface.py b/src/oaklib/interfaces/differ_interface.py index 5fd796080..27ce52a3e 100644 --- a/src/oaklib/interfaces/differ_interface.py +++ b/src/oaklib/interfaces/differ_interface.py @@ -13,7 +13,8 @@ Edge, EdgeDeletion, MappingCreation, - MappingReplacement, + # MappingReplacement, + MappingPredicateChange, NewSynonym, NewTextDefinition, NodeCreation, @@ -288,7 +289,7 @@ def diff( predicate, xref = mapping deleted_mapping = RemoveMapping( id=_gen_id(), - subject=entity, + about_node=entity, predicate=predicate, object=xref, ) @@ -296,9 +297,10 @@ def diff( if mapping_changed_set: for changes in mapping_changed_set: object, new_predicate, old_predicate = changes - mapping_change = MappingReplacement( + mapping_change = MappingPredicateChange( id=_gen_id(), - about_mapping=Edge(subject=entity, predicate=old_predicate, object=object), + about_node = entity, + object=object, old_value=old_predicate, new_value=new_predicate, ) diff --git a/src/oaklib/utilities/writers/change_handler.py b/src/oaklib/utilities/writers/change_handler.py index e959c2867..0e11aa4ac 100644 --- a/src/oaklib/utilities/writers/change_handler.py +++ b/src/oaklib/utilities/writers/change_handler.py @@ -25,15 +25,15 @@ def write_markdown_table(self, title: str, header: str, rows: List[str]) -> None def handle_generic_change( self, value: List[object], title: str, header: str, row_format: str ) -> None: - rows = [row_format.format(change=change) for change in value] + rows = list({row_format.format(change=change) for change in value}) self.write_markdown_table(f"{title}: {len(rows)}", header, rows) def handle_new_synonym(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(obj.about_node)} | {obj.new_value} | {obj.predicate} |" for obj in value - ] + }) # Define the header for the table header = "| Term | New Synonym | Predicate |" @@ -43,11 +43,11 @@ def handle_new_synonym(self, value): def handle_edge_deletion(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.subject)} | {self._format_entity_labels(change.predicate)} |\ {self._format_entity_labels(change.object)} |" for change in value - ] + }) # Define the header for the table header = "| Subject| Predicate| Object|" @@ -57,11 +57,11 @@ def handle_edge_deletion(self, value): def handle_edge_creation(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.subject)} | {self._format_entity_labels(change.predicate)} |\ {self._format_entity_labels(change.object)} |" for change in value - ] + }) # Define the header for the table header = "| Subject | Predicate | Object|" @@ -71,12 +71,12 @@ def handle_edge_creation(self, value): def handle_edge_change(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_edge.subject)} | \ {self._format_entity_labels(change.about_edge.predicate)} | \ {self._format_entity_labels(change.old_value)} | {self._format_entity_labels(change.new_value)} |" for change in value - ] + }) # Define the header for the table header = "| Subject | Predicate | Old Object | New Object |" @@ -86,12 +86,12 @@ def handle_edge_change(self, value): def handle_node_move(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_edge.subject)} | \ {self._format_entity_labels(change.about_edge.predicate)} |\ {self._format_entity_labels(change.about_edge.object)} |" for change in value - ] + }) # Define the header for the table header = "| Subject | Predicate | Object |" @@ -101,13 +101,13 @@ def handle_node_move(self, value): def handle_predicate_change(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_edge.subject)} | \ {self._format_entity_labels(change.old_value)} |\ {self._format_entity_labels(change.new_value)} | \ {self._format_entity_labels(change.about_edge.object)} |" for change in value - ] + }) # Define the header for the table header = "| Subject | Old Predicate | New Predicate | Object |" @@ -117,9 +117,9 @@ def handle_predicate_change(self, value): def handle_node_rename(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {change.about_node} | {change.old_value} | {change.new_value} |" for change in value - ] + }) # Define the header for the table header = "| ID | Old Label | New Label |" @@ -129,10 +129,10 @@ def handle_node_rename(self, value): def handle_remove_synonym(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |" for change in value - ] + }) # Define the header for the table header = "| Term | Removed Synonym |" @@ -142,11 +142,11 @@ def handle_remove_synonym(self, value): def hand_synonym_predicate_change(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ {change.new_value} | {change.target} |" for change in value - ] + }) # Define the header for the table header = "| Term | Old Predicate | New Predicate | Synonym |" @@ -156,11 +156,11 @@ def hand_synonym_predicate_change(self, value): def handle_node_text_definition_change(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ {change.new_value} |" for change in value - ] + }) # Define the header for the table header = "| Term | Old Text Definition | New Text Definition |" @@ -170,11 +170,11 @@ def handle_node_text_definition_change(self, value): def handle_node_text_definition(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ {change.new_value} |" for change in value - ] + }) # Define the header for the table header = "| Term | Old Text Definition | New Text Definition |" @@ -184,7 +184,7 @@ def handle_node_text_definition(self, value): def handle_node_unobsoletion(self, value): # Create rows for the table - rows = [f"| {self._format_entity_labels(change.about_node)} |" for change in value] + rows = list({f"| {self._format_entity_labels(change.about_node)} |" for change in value}) # Define the header for the table header = "| Term |" @@ -194,7 +194,7 @@ def handle_node_unobsoletion(self, value): def handle_node_creation(self, value): # Create rows for the table - rows = [f"| {self._format_entity_labels(change.about_node)} |" for change in value] + rows = list({f"| {self._format_entity_labels(change.about_node)} |" for change in value}) # Define the header for the table header = "| Term |" @@ -204,7 +204,7 @@ def handle_node_creation(self, value): def handle_class_creation(self, value): # Create rows for the table - rows = [f"| {self._format_entity_labels(change.about_node)} |" for change in value] + rows = list({f"| {self._format_entity_labels(change.about_node)} |" for change in value}) # Define the header for the table header = "| Term |" @@ -214,7 +214,7 @@ def handle_class_creation(self, value): def handle_node_deletion(self, value): # Create rows for the table - rows = [f"| {self._format_entity_labels(change.about_node)} |" for change in value] + rows = list({f"| {self._format_entity_labels(change.about_node)} |" for change in value}) # Define the header for the table header = "| Term |" @@ -224,28 +224,28 @@ def handle_node_deletion(self, value): def handle_new_text_definition(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} | {change.new_value} |" for change in value - ] + }) header = "| Term | New Text Definition |" self.write_markdown_table(f"Text definitions added: {len(rows)}", header, rows) def handle_remove_text_definition(self, value): # Create rows for the table - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |" for change in value - ] + }) header = "| Term | Removed Text Definition |" self.write_markdown_table(f"Text definitions removed: {len(rows)}", header, rows) def handle_node_obsoletion_with_direct_replacement(self, value): - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} |\ {self._format_entity_labels(change.has_direct_replacement)} |" for change in value - ] + }) header = "| Term | Replacement |" self.write_markdown_table(f"Nodes obsoleted with replacement: {len(rows)}", header, rows) @@ -255,22 +255,54 @@ def handle_node_obsoletion(self, value): self.write_markdown_table(f"Nodes obsoleted without replacement: {len(rows)}", header, rows) def handle_node_direct_merge(self, value): - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} |\ {self._format_entity_labels(change.has_direct_replacement)} |" for change in value - ] + }) header = "| Term | Replacement |" self.write_markdown_table(f"Nodes merged: {len(rows)}", header, rows) def handle_add_node_to_subset(self, value): - rows = [ + rows = list({ f"| {self._format_entity_labels(change.about_node)} | {change.in_subset} |" for change in value - ] + }) header = "| Term | Subset |" self.write_markdown_table(f"Nodes added to subset: {len(rows)}", header, rows) + def handle_mapping_creation(self, value): + rows = list({ + f"| {self._format_entity_labels(change.subject)} | {change.predicate} | {self._format_entity_labels(change.object)} |" + for change in value + }) + header = "| Subject | Predicate | Object |" + self.write_markdown_table(f"Mappings added: {len(rows)}", header, rows) + + def handle_mapping_predicate_change(self, value): + # Create rows for the table + rows = list({ + f"| {self._format_entity_labels(change.about_node)} | \ + {self._format_entity_labels(change.old_value)} |\ + {self._format_entity_labels(change.new_value)} | \ + {self._format_entity_labels(change.object)} |" + for change in value + }) + + # Define the header for the table + header = "| Subject | Old Mapping Predicate | New Mapping Predicate | Object |" + + # Write the "Predicate Changed" section as a collapsible markdown table + self.write_markdown_table(f"Mappings changed: {len(rows)}", header, rows) + + def handle_remove_mapping(self, value): + rows = list({ + f"| {self._format_entity_labels(change.about_node)} | {change.predicate} | {self._format_entity_labels(change.object)} |" + for change in value + }) + header = "| Subject | Predicate | Object |" + self.write_markdown_table(f"Mappings removed: {len(rows)}", header, rows) + # def handle_datatype_or_language_tag_change(self, value): # # Implement datatype or language tag change handling logic here # logging.info("Datatype or language tag change handling not yet implemented.") @@ -340,6 +372,9 @@ def process_changes(self, curie_or_change: Dict[str, Change]): "EdgeCreation": self.handle_edge_creation, "EdgeChange": self.handle_edge_change, "AddNodeToSubset": self.handle_add_node_to_subset, + "MappingPredicateChange": self.handle_mapping_predicate_change, + "MappingCreation": self.handle_mapping_creation, + "RemoveMapping": self.handle_remove_mapping, # "DatatypeOrLanguageTagChange": self.handle_datatype_or_language_tag_change, # "LanguageTagChange": self.handle_language_tag_change, # "DatatypeChange": self.handle_datatype_change, From e76839dd83eda1c3fe973c1e662d958c7a9cbb52 Mon Sep 17 00:00:00 2001 From: Harshad Hegde Date: Tue, 18 Jun 2024 15:38:18 -0500 Subject: [PATCH 5/9] formatted --- src/oaklib/interfaces/differ_interface.py | 2 +- .../utilities/writers/change_handler.py | 193 +++++++++++------- 2 files changed, 118 insertions(+), 77 deletions(-) diff --git a/src/oaklib/interfaces/differ_interface.py b/src/oaklib/interfaces/differ_interface.py index 27ce52a3e..31665f02b 100644 --- a/src/oaklib/interfaces/differ_interface.py +++ b/src/oaklib/interfaces/differ_interface.py @@ -299,7 +299,7 @@ def diff( object, new_predicate, old_predicate = changes mapping_change = MappingPredicateChange( id=_gen_id(), - about_node = entity, + about_node=entity, object=object, old_value=old_predicate, new_value=new_predicate, diff --git a/src/oaklib/utilities/writers/change_handler.py b/src/oaklib/utilities/writers/change_handler.py index 0e11aa4ac..3d49ecc38 100644 --- a/src/oaklib/utilities/writers/change_handler.py +++ b/src/oaklib/utilities/writers/change_handler.py @@ -30,10 +30,12 @@ def handle_generic_change( def handle_new_synonym(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(obj.about_node)} | {obj.new_value} | {obj.predicate} |" - for obj in value - }) + rows = list( + { + f"| {self._format_entity_labels(obj.about_node)} | {obj.new_value} | {obj.predicate} |" + for obj in value + } + ) # Define the header for the table header = "| Term | New Synonym | Predicate |" @@ -43,11 +45,13 @@ def handle_new_synonym(self, value): def handle_edge_deletion(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.subject)} | {self._format_entity_labels(change.predicate)} |\ + rows = list( + { + f"| {self._format_entity_labels(change.subject)} | {self._format_entity_labels(change.predicate)} |\ {self._format_entity_labels(change.object)} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Subject| Predicate| Object|" @@ -57,11 +61,13 @@ def handle_edge_deletion(self, value): def handle_edge_creation(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.subject)} | {self._format_entity_labels(change.predicate)} |\ + rows = list( + { + f"| {self._format_entity_labels(change.subject)} | {self._format_entity_labels(change.predicate)} |\ {self._format_entity_labels(change.object)} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Subject | Predicate | Object|" @@ -71,12 +77,14 @@ def handle_edge_creation(self, value): def handle_edge_change(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_edge.subject)} | \ + rows = list( + { + f"| {self._format_entity_labels(change.about_edge.subject)} | \ {self._format_entity_labels(change.about_edge.predicate)} | \ {self._format_entity_labels(change.old_value)} | {self._format_entity_labels(change.new_value)} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Subject | Predicate | Old Object | New Object |" @@ -86,12 +94,14 @@ def handle_edge_change(self, value): def handle_node_move(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_edge.subject)} | \ + rows = list( + { + f"| {self._format_entity_labels(change.about_edge.subject)} | \ {self._format_entity_labels(change.about_edge.predicate)} |\ {self._format_entity_labels(change.about_edge.object)} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Subject | Predicate | Object |" @@ -101,13 +111,15 @@ def handle_node_move(self, value): def handle_predicate_change(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_edge.subject)} | \ + rows = list( + { + f"| {self._format_entity_labels(change.about_edge.subject)} | \ {self._format_entity_labels(change.old_value)} |\ {self._format_entity_labels(change.new_value)} | \ {self._format_entity_labels(change.about_edge.object)} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Subject | Old Predicate | New Predicate | Object |" @@ -117,9 +129,12 @@ def handle_predicate_change(self, value): def handle_node_rename(self, value): # Create rows for the table - rows = list({ - f"| {change.about_node} | {change.old_value} | {change.new_value} |" for change in value - }) + rows = list( + { + f"| {change.about_node} | {change.old_value} | {change.new_value} |" + for change in value + } + ) # Define the header for the table header = "| ID | Old Label | New Label |" @@ -129,10 +144,12 @@ def handle_node_rename(self, value): def handle_remove_synonym(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |" - for change in value - }) + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |" + for change in value + } + ) # Define the header for the table header = "| Term | Removed Synonym |" @@ -142,11 +159,13 @@ def handle_remove_synonym(self, value): def hand_synonym_predicate_change(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ {change.new_value} | {change.target} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Term | Old Predicate | New Predicate | Synonym |" @@ -156,11 +175,13 @@ def hand_synonym_predicate_change(self, value): def handle_node_text_definition_change(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ {change.new_value} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Term | Old Text Definition | New Text Definition |" @@ -170,11 +191,13 @@ def handle_node_text_definition_change(self, value): def handle_node_text_definition(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |\ {change.new_value} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Term | Old Text Definition | New Text Definition |" @@ -224,28 +247,34 @@ def handle_node_deletion(self, value): def handle_new_text_definition(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.new_value} |" - for change in value - }) + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | {change.new_value} |" + for change in value + } + ) header = "| Term | New Text Definition |" self.write_markdown_table(f"Text definitions added: {len(rows)}", header, rows) def handle_remove_text_definition(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |" - for change in value - }) + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | {change.old_value} |" + for change in value + } + ) header = "| Term | Removed Text Definition |" self.write_markdown_table(f"Text definitions removed: {len(rows)}", header, rows) def handle_node_obsoletion_with_direct_replacement(self, value): - rows = list({ - f"| {self._format_entity_labels(change.about_node)} |\ + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} |\ {self._format_entity_labels(change.has_direct_replacement)} |" - for change in value - }) + for change in value + } + ) header = "| Term | Replacement |" self.write_markdown_table(f"Nodes obsoleted with replacement: {len(rows)}", header, rows) @@ -255,39 +284,48 @@ def handle_node_obsoletion(self, value): self.write_markdown_table(f"Nodes obsoleted without replacement: {len(rows)}", header, rows) def handle_node_direct_merge(self, value): - rows = list({ - f"| {self._format_entity_labels(change.about_node)} |\ + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} |\ {self._format_entity_labels(change.has_direct_replacement)} |" - for change in value - }) + for change in value + } + ) header = "| Term | Replacement |" self.write_markdown_table(f"Nodes merged: {len(rows)}", header, rows) def handle_add_node_to_subset(self, value): - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.in_subset} |" - for change in value - }) + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | {change.in_subset} |" + for change in value + } + ) header = "| Term | Subset |" self.write_markdown_table(f"Nodes added to subset: {len(rows)}", header, rows) def handle_mapping_creation(self, value): - rows = list({ - f"| {self._format_entity_labels(change.subject)} | {change.predicate} | {self._format_entity_labels(change.object)} |" - for change in value - }) + rows = list( + { + f"""| {self._format_entity_labels(change.subject)} + | {change.predicate} | {self._format_entity_labels(change.object)} |""" + for change in value + } + ) header = "| Subject | Predicate | Object |" self.write_markdown_table(f"Mappings added: {len(rows)}", header, rows) - + def handle_mapping_predicate_change(self, value): # Create rows for the table - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | \ + rows = list( + { + f"| {self._format_entity_labels(change.about_node)} | \ {self._format_entity_labels(change.old_value)} |\ {self._format_entity_labels(change.new_value)} | \ {self._format_entity_labels(change.object)} |" - for change in value - }) + for change in value + } + ) # Define the header for the table header = "| Subject | Old Mapping Predicate | New Mapping Predicate | Object |" @@ -296,10 +334,13 @@ def handle_mapping_predicate_change(self, value): self.write_markdown_table(f"Mappings changed: {len(rows)}", header, rows) def handle_remove_mapping(self, value): - rows = list({ - f"| {self._format_entity_labels(change.about_node)} | {change.predicate} | {self._format_entity_labels(change.object)} |" - for change in value - }) + rows = list( + { + f"""| {self._format_entity_labels(change.about_node)} + | {change.predicate} | {self._format_entity_labels(change.object)} |""" + for change in value + } + ) header = "| Subject | Predicate | Object |" self.write_markdown_table(f"Mappings removed: {len(rows)}", header, rows) From 26da7777c91a3d73709986ef6a231a57365d42f1 Mon Sep 17 00:00:00 2001 From: Harshad Hegde Date: Tue, 18 Jun 2024 16:39:50 -0500 Subject: [PATCH 6/9] Added mapping change --- .../simpleobo/simple_obo_implementation.py | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/oaklib/implementations/simpleobo/simple_obo_implementation.py b/src/oaklib/implementations/simpleobo/simple_obo_implementation.py index 3e0d05d1f..4720c4d7f 100644 --- a/src/oaklib/implementations/simpleobo/simple_obo_implementation.py +++ b/src/oaklib/implementations/simpleobo/simple_obo_implementation.py @@ -907,14 +907,14 @@ def _tv_dict(stanza: Stanza) -> Dict[str, List[str]]: elif tag == TAG_SUBSET: if node_is_deleted: continue - subsets1 = stanza1.simple_values(TAG_SUBSET) - subsets2 = stanza2.simple_values(TAG_SUBSET) - for subset in subsets1: - if subset not in subsets2: - yield kgcl.RemoveNodeFromSubset(id=_id(), about_node=t1id, in_subset=subset) - for subset in subsets2: - if subset not in subsets1: - yield kgcl.AddNodeToSubset(id=_id(), about_node=t2id, in_subset=subset) + xrefs1 = stanza1.simple_values(TAG_SUBSET) + xrefs2 = stanza2.simple_values(TAG_SUBSET) + for xref in xrefs1: + if xref not in xrefs2: + yield kgcl.RemoveNodeFromSubset(id=_id(), about_node=t1id, in_subset=xref) + for xref in xrefs2: + if xref not in xrefs1: + yield kgcl.AddNodeToSubset(id=_id(), about_node=t2id, in_subset=xref) elif tag == TAG_IS_A: isas1 = stanza1.simple_values(TAG_IS_A) isas2 = stanza2.simple_values(TAG_IS_A) @@ -950,6 +950,17 @@ def _tv_dict(stanza: Stanza) -> Dict[str, List[str]]: yield kgcl.NewSynonym( id=_id(), about_node=t2id, new_value=syn[0], predicate=pred ) + elif tag == TAG_XREF: + if node_is_deleted: + continue + xrefs1 = stanza1.simple_values(TAG_XREF) + xrefs2 = stanza2.simple_values(TAG_XREF) + for xref in xrefs1: + if xref not in xrefs2: + yield kgcl.RemoveMapping(id=_id(), about_node=t1id, object=xref, predicate=HAS_DBXREF) + for xref in xrefs2: + if xref not in xrefs1: + yield kgcl.MappingCreation(id=_id(), subject=t2id, object=xref, predicate=HAS_DBXREF) def different_from(self, entity: CURIE, other_ontology: DifferInterface) -> bool: t1 = self._stanza(entity, strict=False) From 57fff8cfca6f2d4b38dd4a0c8f8a3664c05da9ac Mon Sep 17 00:00:00 2001 From: Harshad Hegde Date: Tue, 18 Jun 2024 16:53:05 -0500 Subject: [PATCH 7/9] simpleobo + mapping change implemented --- .../simpleobo/simple_obo_implementation.py | 8 ++++++-- tests/input/go-nucleus-modified.obo | 2 +- tests/test_cli.py | 12 +++++++++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/oaklib/implementations/simpleobo/simple_obo_implementation.py b/src/oaklib/implementations/simpleobo/simple_obo_implementation.py index 4720c4d7f..bcee7b2be 100644 --- a/src/oaklib/implementations/simpleobo/simple_obo_implementation.py +++ b/src/oaklib/implementations/simpleobo/simple_obo_implementation.py @@ -957,10 +957,14 @@ def _tv_dict(stanza: Stanza) -> Dict[str, List[str]]: xrefs2 = stanza2.simple_values(TAG_XREF) for xref in xrefs1: if xref not in xrefs2: - yield kgcl.RemoveMapping(id=_id(), about_node=t1id, object=xref, predicate=HAS_DBXREF) + yield kgcl.RemoveMapping( + id=_id(), about_node=t1id, object=xref, predicate=HAS_DBXREF + ) for xref in xrefs2: if xref not in xrefs1: - yield kgcl.MappingCreation(id=_id(), subject=t2id, object=xref, predicate=HAS_DBXREF) + yield kgcl.MappingCreation( + id=_id(), subject=t2id, object=xref, predicate=HAS_DBXREF + ) def different_from(self, entity: CURIE, other_ontology: DifferInterface) -> bool: t1 = self._stanza(entity, strict=False) diff --git a/tests/input/go-nucleus-modified.obo b/tests/input/go-nucleus-modified.obo index 7df9d994d..155604b12 100644 --- a/tests/input/go-nucleus-modified.obo +++ b/tests/input/go-nucleus-modified.obo @@ -377,7 +377,6 @@ subset: goslim_yeast synonym: "cell or subcellular entity" EXACT [] synonym: "cellular component" EXACT [] synonym: "subcellular entity" RELATED [NIF_Subcellular:nlx_subcell_100315] -xref: NIF_Subcellular:sao1337158144 is_a: BFO:0000040 ! material entity disjoint_from: GO:0008150 ! biological_process @@ -422,6 +421,7 @@ synonym: "cell nucleus" EXACT [] synonym: "horsetail nucleus" NARROW [GOC:al, GOC:mah, GOC:vw, PMID:15030757] xref: NIF_Subcellular:sao1702920020 xref: Wikipedia:Cell_nucleus +xref: foo:test is_a: GO:0043231 ! intracellular membrane-bounded organelle disjoint_from: GO:0005737 ! cytoplasm relationship: in_taxon NCBITaxon:2759 ! Eukaryota diff --git a/tests/test_cli.py b/tests/test_cli.py index fc55d3914..399424c10 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -10,7 +10,7 @@ import rdflib import yaml from click.testing import CliRunner -from kgcl_schema.datamodel.kgcl import NodeChange +from kgcl_schema.datamodel.kgcl import MappingCreation, NodeChange, RemoveMapping from linkml_runtime.loaders import json_loader, yaml_loader from oaklib import get_adapter from oaklib.cli import clear_cli_settings, main @@ -1266,6 +1266,16 @@ def test_diffs(self): self.assertTrue( any(c.about_node == "GO:0033673" for c in changes if isinstance(c, NodeChange)) ) + self.assertTrue( + any(c.subject == NUCLEUS for c in changes if isinstance(c, MappingCreation)) + ) + self.assertTrue( + any( + c.about_node == CELLULAR_COMPONENT + for c in changes + if isinstance(c, RemoveMapping) + ) + ) catalytic_activity_changed = any( c.about_node == CATALYTIC_ACTIVITY for c in changes if isinstance(c, NodeChange) ) From cf3bb007388135e3ba8326489990e2e02d2d21bd Mon Sep 17 00:00:00 2001 From: Harshad Hegde Date: Thu, 20 Jun 2024 10:41:14 -0500 Subject: [PATCH 8/9] Edited expected changes --- tests/test_implementations/__init__.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_implementations/__init__.py b/tests/test_implementations/__init__.py index 3446c914b..60beb99a2 100644 --- a/tests/test_implementations/__init__.py +++ b/tests/test_implementations/__init__.py @@ -1035,6 +1035,18 @@ def test_diff(self, oi: DifferInterface, oi_modified: DifferInterface): predicate="RO:0002212", object="GO:0016301", ), + kgcl.RemoveMapping( + id=FIXED_ID, + about_node="GO:0005575", + predicate="oio:hasDbXref", + object="NIF_Subcellular:sao1337158144", + ), + kgcl.MappingCreation( + id=FIXED_ID, + subject="GO:0005634", + predicate="oio:hasDbXref", + object="foo:test", + ), ] for ch in diff: if isinstance(ch, list): @@ -1070,6 +1082,18 @@ def test_diff(self, oi: DifferInterface, oi_modified: DifferInterface): new_value="catalytic activity", ), kgcl.ClassCreation(id=FIXED_ID, about_node="GO:0033673"), + kgcl.MappingCreation( + id=FIXED_ID, + subject="GO:0005575", + predicate="oio:hasDbXref", + object="NIF_Subcellular:sao1337158144", + ), + kgcl.RemoveMapping( + id=FIXED_ID, + about_node="GO:0005634", + predicate="oio:hasDbXref", + object="foo:test", + ), ] rdiff = list(oi_modified.diff(oi)) for ch in rdiff: From 31020761a582708b48856dc014b975f2a419fb52 Mon Sep 17 00:00:00 2001 From: Harshad Hegde Date: Thu, 20 Jun 2024 10:42:42 -0500 Subject: [PATCH 9/9] replace hard-coding to vars --- tests/test_implementations/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_implementations/__init__.py b/tests/test_implementations/__init__.py index 60beb99a2..96dadce99 100644 --- a/tests/test_implementations/__init__.py +++ b/tests/test_implementations/__init__.py @@ -1037,13 +1037,13 @@ def test_diff(self, oi: DifferInterface, oi_modified: DifferInterface): ), kgcl.RemoveMapping( id=FIXED_ID, - about_node="GO:0005575", + about_node=CELLULAR_COMPONENT, predicate="oio:hasDbXref", object="NIF_Subcellular:sao1337158144", ), kgcl.MappingCreation( id=FIXED_ID, - subject="GO:0005634", + subject=NUCLEUS, predicate="oio:hasDbXref", object="foo:test", ), @@ -1084,13 +1084,13 @@ def test_diff(self, oi: DifferInterface, oi_modified: DifferInterface): kgcl.ClassCreation(id=FIXED_ID, about_node="GO:0033673"), kgcl.MappingCreation( id=FIXED_ID, - subject="GO:0005575", + subject=CELLULAR_COMPONENT, predicate="oio:hasDbXref", object="NIF_Subcellular:sao1337158144", ), kgcl.RemoveMapping( id=FIXED_ID, - about_node="GO:0005634", + about_node=NUCLEUS, predicate="oio:hasDbXref", object="foo:test", ),