diff --git a/dataset2rdf/utils.py b/dataset2rdf/utils.py index 681561285ea65435ee01f1c11f0f5861f2442fda..74850da5e830de63bf513365f19d1a4549beb3e0 100644 --- a/dataset2rdf/utils.py +++ b/dataset2rdf/utils.py @@ -2027,7 +2027,8 @@ def apply_type_restrictions(concepts: Dict[str, Concept], properties: Dict[str, print(f"prop {prop.identifier} has MULTIPLE RANGES: {prop_ranges}") print(f"Adding restriction to class {concept.identifier} on prop {prop.identifier} someValuesFrom: {res.some_values_from}") if r_key in concept.restrictions: - concept.restrictions[r_key] = merge_restriction(concept.restrictions[r_key], res) + merged = merge_restriction(concept.restrictions[r_key], res) + concept.restrictions[r_key] = merged else: concept.restrictions[r_key] = res @@ -2045,14 +2046,14 @@ def merge_restriction(r1: Restriction, r2: Restriction) -> Restriction: A merged instance of Restriction """ - if r1.min_cardinality: + if r1.min_cardinality is not None: if r2.min_cardinality: print(f"[merge_restriction] Merging min cardinality from {r1.min_cardinality} to {r2.min_cardinality}") r1.min_cardinality = r2.min_cardinality else: r1.min_cardinality = r2.min_cardinality - if r1.max_cardinality and r2.max_cardinality: - if r2.min_cardinality: + if r1.max_cardinality is not None: + if r2.max_cardinality: print(f"[merge_restriction] Merging max cardinality from {r1.max_cardinality} to {r2.max_cardinality}") r1.max_cardinality = r2.max_cardinality else: diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index b79874b0ec55ff1d08e5861e1dd5417daa8b156e..b7ed6fef9650980d62e98a003f4d3b7e6c402c27 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -9,6 +9,7 @@ from dataset2rdf.utils import ( get_reference, infer_domain, is_curie, + merge_restriction, parse_active_composed_ofs, parse_active_concept, parse_active_concepts, @@ -1750,3 +1751,39 @@ def test_parse_active_composed_ofs(record, expected_properties, expected_individ def test_regex(input_string, regex, expected_string): extracted_string = extract_code(input_string, regex) assert extracted_string == expected_string + + + +@pytest.mark.parametrize( + "r1,r2,expected", + [ + ( + Restriction(class_identifier="ConceptA", property_identifier="prop1"), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1) + ), + ( + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=None), + Restriction(class_identifier="ConceptA", property_identifier="prop1", max_cardinality=1), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1) + ), + ( + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=None, some_values_from=['snomed:123134', 'snomed:42543']), + Restriction(class_identifier="ConceptA", property_identifier="prop1", max_cardinality=1, some_values_from=['snomed:798606', 'snomed:096553']), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1, some_values_from=['snomed:123134', 'snomed:42543', 'snomed:798606', 'snomed:096553']) + ), + ( + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1, some_values_from=['snomed:123134', 'snomed:42543']), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1, some_values_from=['snomed:123134', 'snomed:42543']), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1, some_values_from=['snomed:123134', 'snomed:42543']) + ), + ( + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1, some_values_from=['snomed:123134', 'snomed:42543']), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1, some_values_from=[]), + Restriction(class_identifier="ConceptA", property_identifier="prop1", min_cardinality=1, max_cardinality=1, some_values_from=['snomed:123134', 'snomed:42543']) + ), + ], +) +def test_merge_restriction(r1,r2,expected): + r = merge_restriction(r1,r2) + assert r == expected