diff --git a/src/rdf-mappings/map-tblBranch.py b/src/rdf-mappings/map-tblBranch.py index 143cdc06b8c7c63dd95f5c39f6968b350475d981..e91065c658d34794a05b3fa81bdd7d2e8ab1653c 100644 --- a/src/rdf-mappings/map-tblBranch.py +++ b/src/rdf-mappings/map-tblBranch.py @@ -211,6 +211,39 @@ def create_visual_link(source_node, target_node=None, direction='current_to_next else: return None +def create_seme_charge(charge_number, layer_node, pattern_seme, tinct=None): + """ + If seme is set, create a new charge as part of the current layer. This new charge has the dhoh:Arrangement dhoh:Seme and + also has the dhoh:hasChargeNumber dhoh:Multiple. + + :param charge: The charge string used to construct the pattern and property names. + :param charge_number: The charge number used for constructing property names. + :param layer_node: The layer node to link the seme charge. + :param pattern_seme: The specific seme column in OMA from which the new charge is to be created + :return: The number of semes added. + """ + + seme_charge_node = URIRef(dho_blazon_n + str(uuid.uuid4())) + + seme_charge_type = create_owl_class_from_string(pattern_seme, sub_class_of=dho_n.Charge) + g.add((seme_charge_node, RDF.type, seme_charge_type)) + g.add((seme_charge_node, RDF.type, OWL.NamedIndividual)) + + # Add seme properties + g.add((seme_charge_node, dho_n.hasArrangement, dho_n.Seme)) + g.add((seme_charge_node, dho_n.hasChargeNumber, dho_n.Multiple)) + + # Add tincture if set + if tinct is not None: + add_tincture(seme_charge_node, tinct) + + # Link new seme charge to layer + charge_property = URIRef(dho_n + 'hasCharge' + str(charge_number + 1)) + g.add((charge_property, RDFS.subPropertyOf, dho_n.hasCharge)) + g.add((layer_node, charge_property, seme_charge_node)) + + return 1 # Number of semes added + def add_layer(layer_number, layer_content, field_node, previous_layer_node=None, last_charge_from_previous_layer=None, next_layer_node=None): """ Adds a new layer as well as all charges that are stored in this layer, if this layer @@ -219,6 +252,27 @@ def add_layer(layer_number, layer_content, field_node, previous_layer_node=None, Returns the URI of the newly created layer. """ + charge_number = 1 + next_charge_node = None + # Indicates if additional charges are being added to the layer -> number is to be added to charge_number at the end + semes_added = 0 + + # Add seme from field; in case the layer is empty, but field_seme is not empty, we need to create a new layer node + if not pd.isnull(row['field_seme']) and pd.isnull(layer_content): + if next_layer_node is None: + layer_node = URIRef(dho_blazon_n + str(uuid.uuid4())) + else: + layer_node = next_layer_node + + next_layer_node = None + + g.add((layer_node, RDF.type, dho_n.Layer)) + g.add((layer_node, RDF.type, OWL.NamedIndividual)) + + semes_added += create_seme_charge(charge_number, layer_node, pattern_seme=row['field_seme'], tinct=row['field_seme_Tinct']) + + return layer_node, None, next_layer_node + if not pd.isnull(layer_content): if next_layer_node is None: layer_node = URIRef(dho_blazon_n + str(uuid.uuid4())) @@ -231,8 +285,8 @@ def add_layer(layer_number, layer_content, field_node, previous_layer_node=None, g.add((layer_node, RDF.type, OWL.NamedIndividual)) layer_charge_list = layer_content.split(', ') - charge_number = 1 - next_charge_node = None + if not pd.isnull(row['field_seme']): + semes_added += create_seme_charge(charge_number, layer_node, pattern_seme=row['field_seme'], tinct=row['field_seme_Tinct']) for charge in layer_charge_list: if next_charge_node is None: @@ -316,12 +370,10 @@ def add_layer(layer_number, layer_content, field_node, previous_layer_node=None, # Add seme if charge + '_pattern_seme' in df_tblBranch.columns and not pd.isnull(row[charge + '_pattern_seme']): - seme_type = create_owl_class_from_string(row[charge + '_pattern_seme'], sub_class_of=dho_n.Seme) - g.add((charge_node, dho_n.hasSeme, seme_type)) + semes_added += create_seme_charge(charge_number, layer_node, pattern_seme=row[charge + '_pattern_seme']) if charge + '_pattern_seme2' in df_tblBranch.columns and not pd.isnull(row[charge + '_pattern_seme2']): - seme_type = create_owl_class_from_string(row[charge + '_pattern_seme2'], sub_class_of=dho_n.Seme) - g.add((charge_node, dho_n.hasSeme, seme_type)) + semes_added += create_seme_charge(charge_number, layer_node, pattern_seme=row[charge + '_pattern_seme2']) # Add modifiers and arrangements to charge if charge + '_line' in df_tblBranch.columns and not pd.isnull(row[charge + '_line']): @@ -376,6 +428,7 @@ def add_layer(layer_number, layer_content, field_node, previous_layer_node=None, g.add((charge_property, RDFS.subPropertyOf, dho_n.hasCharge)) g.add((layer_node, charge_property, charge_node)) + charge_number = charge_number + semes_added charge_number += 1 previous_charge_node = charge_node @@ -511,21 +564,6 @@ for index, row in df_tblBranch.iterrows(): add_tincture(field_node, row['field_Tinct1'], tinct_order_place='1') add_tincture(field_node, row['field_Tinct2'], tinct_order_place='2') add_tincture(field_node, row['field_Tinct3'], tinct_order_place='3') - - # Create seme for field - if not pd.isnull(row['field_seme']): - field_seme_node = URIRef(dho_blazon_n + str(uuid.uuid4())) - seme_pattern = create_owl_class_from_string(row['field_seme'], sub_class_of=dho_n.Seme) - - g.add((field_seme_node, RDF.type, dho_n.Seme)) - g.add((field_seme_node, RDF.type, OWL.NamedIndividual)) - g.add((field_seme_node, dho_n.hasSeme, seme_pattern)) - add_tincture(field_seme_node, row['field_seme_Tinct']) - # seme_tincture = create_owl_class_from_string(row['field_seme_Tinct'], sub_class_of=dho_n.Tincture) - # g.add((field_seme_node, dho_n.hasTincture, seme_tincture)) - - # Link seme to field - g.add((field_node, dho_n.hasSeme, field_seme_node)) # Link to marshalled Arms if not pd.isnull(row['Qtrs']) and row['Qtrs'] != 1: