def __init__(self, csvf, ontof):

        self.onto_filename = ontof
        self.data = self.LeerDatos(csvf)
        self.num_filas = self.data.shape[0] #total de filas
        self.Popu = Populate() #Populate Tools
        self.row = 0 #current processing row
    def __init__(self, logf, ontof, csvf, periodf, invalid=[], sender=None):

        self.onto_filename = ontof

        self.log = open(logf, "w")  #log file
        self.data = self.LeerDatos(csvf)  #data from csv
        self.num_filas = self.data.shape[0]  #total rows from csv

        self.Popu = Populate()  #Populate tools
        self.period_graph = Graph()  #Periods instantiation
        self.period_graph.parse(periodf, format="turtle")
        self.curiocity_file = "../Curiocity_Time.ttl"
        self.curiocity_graph = Populate()
        self.curiocity_graph.g.parse(self.curiocity_file, format="turtle")
        self.sender = sender

        # self.graph_temp = Populate()
        ### Get Invalid Data
        if (invalid == []):
            self.invalid = [
                'No asignado', 'nan', 'No aplicable', 'Desconocida',
                'Desconocido', 'Sin información', 'No definido'
            ]
        else:
            self.invalid = invalid

        self.row = 0  #current processing row
 def MergeOntos(self, format: str = 'turtle'):
     #Merge output rdf triples Base + Period + Instantiations
     self.graph_temp = Populate()
     self.graph_temp.g = self.curiocity_graph.g + self.period_graph + self.Popu.g
     # Save individuals
     try:
         self.graph_temp.SaveTriples(self.onto_filename, format=format)
         return True
     except:
         print("Error")
         return False
class DataProcess:
    def __init__(self, logf, ontof, csvf, periodf, invalid=[], sender=None):

        self.onto_filename = ontof

        self.log = open(logf, "w")  #log file
        self.data = self.LeerDatos(csvf)  #data from csv
        self.num_filas = self.data.shape[0]  #total rows from csv

        self.Popu = Populate()  #Populate tools
        self.period_graph = Graph()  #Periods instantiation
        self.period_graph.parse(periodf, format="turtle")
        self.sender = sender

        if (invalid == []):
            self.invalid = [
                'No asignado', 'nan', 'No aplicable', 'Desconocida',
                'Desconocido', 'Sin información', 'No definido'
            ]
        else:
            self.invalid = invalid

        self.row = 0  #current processing row

    def __del__(self):
        self.log.close()

    def __ScreenLog(self, message):
        if (self.sender == None):
            print(message)
        else:
            self.sender.Logger(message)

    def LeerDatos(self, filename: str, header=True):
        #Return pandas dataframe with csv data
        return pd.read_csv(filename, sep='\t', encoding='utf8', header=0)

    def __ReadColumnIndex(self):
        #Column index from csv
        with open("name_columns.json", 'r') as name_columns_file:
            name_columns = json.load(name_columns_file)

        self.__col_codigo = self.data.columns.get_loc(name_columns['ID'])
        self.__col_alt_code = self.data.columns.get_loc(
            name_columns['Alternative ID'])
        self.__col_titulo = self.data.columns.get_loc(name_columns['Title'])
        self.__col_descripcion = self.data.columns.get_loc(
            name_columns['Description'])
        self.__col_creador = self.data.columns.get_loc(name_columns['Author'])

        self.__col_uso = self.data.columns.get_loc(name_columns['Utility'])
        self.__col_duenio = self.data.columns.get_loc(name_columns['Owner'])
        self.__col_estado = self.data.columns.get_loc(
            name_columns['Condition State'])
        self.__col_material = self.data.columns.get_loc(
            name_columns['Material'])

        self.__col_id_periodo = self.data.columns.get_loc(
            name_columns['Period ID'])
        self.__col_periodo = self.data.columns.get_loc(name_columns['Period'])

        self.__col_date_creation = self.data.columns.get_loc(
            name_columns['Creation date'])

        self.__col_adquisicion = self.data.columns.get_loc(
            name_columns['Acquisition'])
        self.__col_donor = self.data.columns.get_loc(name_columns['Donor'])
        self.__col_desc_donor = self.data.columns.get_loc(
            name_columns['Donor description'])
        #TODO probable organizacion de descripciones

        self.__col_localizacion = self.data.columns.get_loc(
            name_columns['Location in Museum'])
        self.__col_department = self.data.columns.get_loc(
            name_columns['Museum Department'])

        self.__col_alto = self.data.columns.get_loc(
            name_columns['Artifact height'])
        self.__col_ancho = self.data.columns.get_loc(
            name_columns['Artifact width'])
        self.__col_largo = self.data.columns.get_loc(
            name_columns['Artifact length'])
        self.__col_diametro = self.data.columns.get_loc(
            name_columns['Artifact diameter'])
        self.__col_profundidad = self.data.columns.get_loc(
            name_columns['Artifact depth'])
        self.__col_peso = self.data.columns.get_loc(
            name_columns['Artifact weight'])

    def __InitUnknownConcepts(self):
        ########################
        # Unknown Concepts
        ########################
        self.__alt_id_unknown = self.Popu.AddSubject(
            "ID_alternativo_desconocido", "E42_Identifier", ins_label=False)
        self.__utility_unknown = self.Popu.AddSubject("Utilidad_desconocida",
                                                      "E55_Type",
                                                      ins_label=False)
        self.__creator_unknown = self.Popu.AddSubject("Creador_desconocido",
                                                      "E39_Actor",
                                                      ins_label=False)
        self.__donor_unknown = self.Popu.AddSubject("Donador_desconocido",
                                                    "E39_Actor",
                                                    ins_label=False)
        self.__owner_unknown = self.Popu.AddSubject("Propietario_desconocido",
                                                    "E39_Actor",
                                                    ins_label=False)
        self.__condition_unknown = self.Popu.AddSubject(
            "Condicion_desconocida", "E55_Type", ins_label=False)
        self.__material_unknown = self.Popu.AddSubject("Material_desconocido",
                                                       "E57_Material",
                                                       ins_label=False)
        self.__place_unknown = self.Popu.AddSubject("Lugar_desconocido",
                                                    "E53_Place",
                                                    ins_label=False)
        self.__periodo_unknown = self.Popu.AddSubject("Periodo_desconocido",
                                                      "E4_Period",
                                                      ins_label=False)
        self.__periodo_span_unknown = self.Popu.AddSubject(
            "Lapso_de_Tiempo_desconocido",
            "SP10_Declarative_Time-Span",
            name_space="cit",
            ins_label=False)

    def __Verificar(self, cadena: str):
        #Verify legal field
        if (str(cadena) in self.invalid):
            return False
        else:
            return True

    def VerificarActorv2(self, actor: str):
        #Verificar si actor existe y devolver URI
        actor = URIRef(self.Popu.cit + self.Popu.Formato(actor))
        qactor = prepareQuery("""SELECT ?s
                            WHERE {
                                VALUES ?type { ecrm:E21_Person ecrm:E74_Group }
                                ?s a ?type .                                
                                }""",
                              initNs={
                                  "ecrm": self.Popu.ecrm,
                                  "cit": self.Popu.cit,
                                  "owl": OWL
                              })

        actor_q = self.Popu.g.query(qactor, initBindings={'s': actor})
        return actor_q

    def __VerifyActor(self, actor: str, tipo: str):
        if (self.__Verificar(actor)):
            actor = actor.strip()
            actor_uri = URIRef(self.Popu.cit + self.Popu.Formato(actor))

            if ((actor_uri, RDF.type, self.Popu.ecrm.E21_Person)
                    in self.Popu.g):  #existe como persona
                self.__ScreenLog("Person existente ... omitiendo")
                return actor_uri
            elif ((actor_uri, RDF.type, self.Popu.ecrm.E74_Group)
                  in self.Popu.g):  #existe como grupo
                self.__ScreenLog("Group existente ... omitiendo")
                return actor_uri
            else:  #Pedir confirmacion
                while (True):
                    if (self.sender != None):
                        actor_type = self.sender.Choose(actor)
                    else:
                        actor_type = input(
                            f"¿{actor} is [p]erson\n or [g]roup?")
                    if (actor_type == 'p'):
                        return self.Popu.AddSubject(actor, "E21_Person")
                    elif (actor_type == 'g'):
                        return self.Popu.AddSubject(actor, "E74_Group")
                    else:
                        continue
        else:  #No Actor info
            if (tipo == "creator"):
                self.log.write(
                    f"WARNING:Fila {self.row+2} -> Creador No identificado\n")
                return self.__creator_unknown
            elif (tipo == "donor"):
                self.log.write(
                    f"WARNING:Fila {self.row+2} -> Donador No identificado\n")
                return self.__donor_unknown
            elif (tipo == "owner"):
                self.log.write(
                    f"WARNING:Fila {self.row+2} -> Propietario No identificado\n"
                )
                return self.__owner_unknown

    def __VerifyMainID(self, id_text: str):
        id_text = id_text.strip()
        subject = URIRef(self.Popu.cit + id_text)
        if ((subject, RDF.type, self.Popu.ecrm.E42_Identifier) in self.Popu.g):
            self.log.write(
                f"ERROR:Fila {self.row+2} -> Codigo existente: {id_text}, Fila ignorada\n"
            )
            return "ERROR -> Codigo existente", True
        else:
            self.__conc_id = self.Popu.AddSubject(id_text, "E42_Identifier")
            self.Popu.AddLiteralFromURI(self.__conc_id,
                                        "P190_has_symbolic_content", id_text,
                                        "string")
            return False

    def __VerifyAltId(self, alt_id_text: str):
        if (self.__Verificar(alt_id_text)):
            alt_id_text = alt_id_text.strip()
            alt_id = self.Popu.AddSubjectFromURI(self.__conc_id,
                                                 "/IDalternativo",
                                                 "E42_Identifier")
            self.Popu.AddLiteralFromURI(alt_id, "P190_has_symbolic_content",
                                        alt_id_text, "string")
            return alt_id
        else:
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Codigo alternativo No Asignado\n"
            )
            return self.__alt_id_unknown

    def __VerifyMainTitle(self, title: str):
        if (self.__Verificar(title)):
            title = title.strip()
            return title  #TODO Crear Title Concept
        else:
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Titulo no asignado\n")
            return "Sin título"

    def VerificarManMadeOrNatural(self, object: str):
        while (True):
            object_type = input(f"¿{object} es [h]uman made o [n]atural?")
            if (object_type == 'h'):
                return self.Popu.AddSubjectFromURI(self.__conc_id, "/Object",
                                                   "E22_Man-Made_Object")
            elif (object_type == 'n'):
                return self.Popu.AddSubjectFromURI(self.__conc_id, "/Object",
                                                   "E19_Physical_Object")
            else:
                continue

    def __VerifyUtility(self, utility_text: str):
        if (self.__Verificar(utility_text)):
            utility_text = utility_text.strip()
            utility = self.Popu.AddSubjectFromURI(self.__conc_id, "/Utility",
                                                  "E55_Type")
            self.Popu.AddLabel(utility, utility_text)
            return utility
        else:
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Utilidad desconocidad\n")
            return self.__utility_unknown

    def __VerifyObjectCondition(self, condition: str):
        if (self.__Verificar(condition)):
            condition = condition.strip()
            condition_uri = URIRef(self.Popu.cit +
                                   self.Popu.Formato(condition))
            if ((condition_uri, RDF.type, self.Popu.ecrm.E55_Type)
                    in self.Popu.g):  #tipo condicion existente
                self.__ScreenLog("Tipo Condición existente ... omitiendo")
                return condition_uri
            else:  #add condition
                return self.Popu.AddSubject(condition, "E55_Type")
        else:  #No condition info
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Condición No identificada\n")
            return self.__condition_unknown

    def __VerifyMaterial(self, material: str):
        if (self.__Verificar(material)):
            material = material.strip()
            material_uri = URIRef(self.Popu.cit + self.Popu.Formato(material))
            if ((material_uri, RDF.type, self.Popu.ecrm.E55_Type)
                    in self.Popu.g):  #material existente
                self.__ScreenLog("Material existente ... omitiendo")
                return material_uri
            else:  #add material
                return self.Popu.AddSubject(material, "E57_Material")
        else:  #No material info
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Material No identificado\n")
            return self.__material_unknown

    def __VerifyPlace(self, place: str):
        if (self.__Verificar(place)):
            place = place.strip()
            place_uri = URIRef(self.Popu.cit + self.Popu.Formato(place))
            if ((place_uri, RDF.type, self.Popu.ecrm.E55_Type)
                    in self.Popu.g):  #place existente
                self.__ScreenLog("Lugar(place) existente ... omitiendo")
                return place_uri
            else:  #add place
                return self.Popu.AddSubject(place, "E53_Place")
        else:  #No place info
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Lugar No identificado\n")
            return self.__place_unknown

    def __ExtractNumber(self, dim: str):
        #Eliminar unidades de dim cm por defecto
        dim = str(dim).replace("cm", "")
        dim = dim.strip()
        return dim

    def __VerifyDimensions(self):
        dimen = self.Popu.AddSubjectFromURI(self.__conc_id, "/Measurements",
                                            "E54_Dimension")

        height = self.__ExtractNumber(self.data.iloc[self.row,
                                                     self.__col_alto])
        width = self.__ExtractNumber(self.data.iloc[self.row,
                                                    self.__col_ancho])
        length = self.__ExtractNumber(self.data.iloc[self.row,
                                                     self.__col_largo])
        diameter = self.__ExtractNumber(
            self.data.iloc[self.row, self.__col_diametro])  #Museo Municipal
        depth = self.__ExtractNumber(self.data.iloc[self.row,
                                                    self.__col_profundidad])
        weigth = self.__ExtractNumber(self.data.iloc[self.row,
                                                     self.__col_peso])

        temp_log = ""

        if (height.isnumeric()):
            self.Popu.AddLiteralFromURI(dimen, "T3_has_height", height,
                                        "decimal")
        else:
            temp_log += "altura "

        if (width.isnumeric()):
            self.Popu.AddLiteralFromURI(dimen, "T4_has_width", width,
                                        "decimal")
        else:
            temp_log += "ancho "

        if (length.isnumeric()):
            self.Popu.AddLiteralFromURI(dimen, "T5_has_length", length,
                                        "decimal")
        else:
            temp_log += "largo "

        if (diameter.isnumeric()):
            self.Popu.AddLiteralFromURI(dimen, "T6_has_diameter", diameter,
                                        "decimal")
        else:
            temp_log += "diametro "

        if (depth.isnumeric()):
            self.Popu.AddLiteralFromURI(dimen, "T7_has_depth", depth,
                                        "decimal")
        else:
            temp_log += "profundidad "

        if (weigth.isnumeric()):
            self.Popu.AddLiteralFromURI(dimen, "T8_has_weigth", weigth,
                                        "decimal")
        else:
            temp_log += "peso"

        if (temp_log != ""):
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Dimensiones no identificadas: {temp_log}.\n"
            )

        return dimen

    def __VerifyPeriods(self, period: str):
        def warning():
            self.log.write(
                f"WARNING:Fila {self.row+2} -> Periodo desconocido.\n")
            return self.__periodo_unknown, self.__periodo_span_unknown

        if (self.__Verificar(period)):
            period = period.strip()
            period_uri = URIRef(self.Popu.cit + self.Popu.Formato(period))

            if ((period_uri, RDF.type, self.Popu.ecrm.E4_Period)
                    in self.period_graph):
                prop_uri = URIRef(self.Popu.ecrm + "P4_has_time-span")
                period_span = self.period_graph.value(period_uri, prop_uri)
                return period_uri, period_span
            else:
                return warning()
        else:
            return warning()

    def __InitGeneralConcepts(self):
        # General Concepts
        #ID Type
        self.__type_id = self.Popu.AddSubject("ID-RUTAS", "E55_Type")
        #Measurement Unit
        self.__meas_cm = self.Popu.AddSubject("cm", "E58_Measurement_Unit")

    def __InvalidRow(self):
        #Verify current row is valid: MainID and Title non empty
        if (str(self.data.iloc[self.row, self.__col_codigo]) == 'nan'
                or str(self.data.iloc[self.row, self.__col_titulo]) == 'nan'):
            self.log.write(
                f"WARNING:Fila {self.row+2} -> no válida, no existe id/title\n"
            )
            return True
        else:
            return False

    def __ProcessConcepts(self):
        #Main ID
        exist = self.__VerifyMainID(self.data.iloc[self.row,
                                                   self.__col_codigo])
        self.__ScreenLog(self.__conc_id)
        if (exist):  #Dont process row
            return
        #Alternative ID
        self.__alt_id = self.__VerifyAltId(self.data.iloc[self.row,
                                                          self.__col_alt_code])
        #Main Tile
        self.__title_text = self.__VerifyMainTitle(
            self.data.iloc[self.row, self.__col_titulo])
        #Object are classified E22 by default, verify for problems
        self.__obj = self.Popu.AddSubjectFromURI(self.__conc_id, "/Object",
                                                 "E22_Man-Made_Object")
        self.Popu.AddLabel(self.__obj, self.__title_text)
        #Type Utility
        self.__utility = self.__VerifyUtility(self.data.iloc[self.row,
                                                             self.__col_uso])
        #Object Creator, Donor, Owner
        self.__creator = self.__VerifyActor(
            self.data.iloc[self.row, self.__col_creador], "creator")
        self.__donor = self.__VerifyActor(
            self.data.iloc[self.row, self.__col_donor], "donor")
        self.__owner = self.__VerifyActor(
            self.data.iloc[self.row, self.__col_duenio], "owner")
        #Artifact measurements
        self.__dimen = self.__VerifyDimensions()
        #artifact condition type, material
        self.__type_condition = self.__VerifyObjectCondition(
            self.data.iloc[self.row, self.__col_estado])
        self.__condition = self.Popu.AddSubjectFromURI(self.__conc_id,
                                                       "/Current_Condition",
                                                       "E3_Condition_State")
        self.__material = self.__VerifyMaterial(
            self.data.iloc[self.row, self.__col_material])
        #Period
        self.__period, self.__period_span = self.__VerifyPeriods(
            self.data.iloc[self.row, self.__col_id_periodo])
        #Localization
        self.__localization = self.__VerifyPlace(
            self.data.iloc[self.row, self.__col_localizacion])
        self.__department = self.__VerifyPlace(
            self.data.iloc[self.row, self.__col_department])
        #Default concepts, check for problems
        #Production/Creation Event E12 by default
        self.__production = self.Popu.AddSubjectFromURI(
            self.__conc_id, "/Production", "E12_Production")
        #Adquisition event E10 by default
        self.__adquisition = self.Popu.AddSubjectFromURI(
            self.__conc_id, "/Adquisition", "E10_Transfer_of_Custody")

    def __ProcessProperties(self):
        #of the Artifact
        self.Popu.AddRelationFromURI(self.__obj,
                                     'P48_has_preferred_identifier',
                                     self.__conc_id)
        self.Popu.AddRelationFromURI(self.__obj, 'P2_has_type', self.__utility)
        self.Popu.AddRelationFromURI(self.__obj, 'P50_has_current_keeper',
                                     self.__owner)
        self.Popu.AddRelationFromURI(self.__obj, 'P50_has_current_owner',
                                     self.__owner)
        self.Popu.AddRelationFromURI(self.__obj, 'P44_has_condition',
                                     self.__condition)
        self.Popu.AddRelationFromURI(self.__obj, 'P45_consists_of',
                                     self.__material)
        self.Popu.AddLiteralFromURI(self.__obj,
                                    'P3_has_note',
                                    self.data.iloc[self.row,
                                                   self.__col_descripcion],
                                    dtype="string",
                                    name_space="ecrm")
        self.Popu.AddRelationFromURI(self.__obj, 'P55_has_current_location',
                                     self.__localization)

        #of the Condition
        self.Popu.AddRelationFromURI(self.__condition, 'P44_has_type',
                                     self.__type_condition)

        #of the ID
        self.Popu.AddRelationFromURI(self.__conc_id, "P2_has_type",
                                     self.__type_id)
        if (self.__alt_id):
            self.Popu.AddRelationFromURI(self.__conc_id,
                                         "P139_has_alternative_form",
                                         self.__alt_id)

        # Dimension
        self.Popu.AddRelationFromURI(self.__dimen, "P91_has_unit",
                                     self.__meas_cm)

        # Production
        self.Popu.AddRelationFromURI(self.__production, "P108_has_produced",
                                     self.__obj)
        self.Popu.AddRelationFromURI(self.__production, "P14_carried_out_by",
                                     self.__creator)
        #self.Popu.AddLiteralFromURI(production, "P4_has_time-span", data.iloc[row, col_date_creation],
        #                        dtype="string", name_space="ecrm")
        #TODO Se esta considerando fecha de produccion igual a periodo ACTUALIZAR
        self.Popu.AddRelationFromURI(self.__production, "P4_has_time-span",
                                     self.__period_span)

        #Adquisition
        self.Popu.AddLiteralFromURI(self.__adquisition,
                                    'P3_has_note',
                                    self.data.iloc[self.row,
                                                   self.__col_desc_donor],
                                    dtype="string",
                                    name_space="ecrm")
        self.Popu.AddRelationFromURI(self.__adquisition,
                                     'P30_transferred_custody_of', self.__obj)
        self.Popu.AddRelationFromURI(self.__adquisition,
                                     "P29_custody_received_by", self.__owner)
        self.Popu.AddRelationFromURI(self.__adquisition,
                                     "P28_custody_surrendered_by",
                                     self.__donor)

        #Localization
        self.Popu.AddRelationFromURI(self.__localization, 'P89_falls_within',
                                     self.__department)

    def Execute(self):
        try:
            self.__ReadColumnIndex()
        except KeyError as key:
            self.__ScreenLog(f"CSV column not found: {key}")
            return

        self.__InitUnknownConcepts()
        self.__InitGeneralConcepts()

        for self.row in range(0, self.num_filas):
            self.__ScreenLog("Procesando línea: " + str(self.row + 2))
            if (self.__InvalidRow()):
                continue
            else:
                self.__ProcessConcepts()
                self.__ProcessProperties()

        # Save individuals
        self.Popu.SaveTriples(self.onto_filename)
class PeriodProcess():
    def __init__(self, csvf, ontof):

        self.onto_filename = ontof
        self.data = self.LeerDatos(csvf)
        self.num_filas = self.data.shape[0] #total de filas
        self.Popu = Populate() #Populate Tools
        self.row = 0 #current processing row

    def LeerDatos(self, filename : str, header = True):
        #Return pandas dataframe with csv data
        return pd.read_csv(filename, sep ='\t', encoding='utf8', header = 0)
        
    def __ReadColumnIndex(self):
        #Column index from csv
        with open("name_period_columns.json", 'r') as name_columns_file :
            name_columns = json.load(name_columns_file)

        self.__col_codigo = self.data.columns.get_loc(name_columns['ID'])
        self.__col_descripcion = self.data.columns.get_loc(name_columns['Description'])
        self.__col_inicio = self.data.columns.get_loc(name_columns['Period begin'])
        self.__col_fin = self.data.columns.get_loc(name_columns['Period end'])

    def __Verificar(self, cadena: str):
        #Verify legal field
        if (str(cadena) != "No asignado" and 
            str(cadena) != 'nan' and 
            str(cadena) != 'No aplicable' and 
            str(cadena) != 'Desconocida' and
            str(cadena) != 'Desconocido' and
            str(cadena) != 'Sin información' and
            str(cadena) != 'No definido'):
            return True
        else:
            return False

    def FormatDate(self, date_text:str):
        #Verificar tipo de fecha
        if (date_text.count("-") == 2): #date
            #Suponiendo fecha bien formada
            return date_text, "in_XSD_date", "date"
        else: #gYear
            if (len(date_text) < 4 and date_text.count("-") == 0): #pad zeros
                for i in range(len(date_text), 4):
                    date_text = "0" + date_text
                return date_text, "in_XSD_g-Year", "year"
            else:
                return date_text, "in_XSD_g-Year", "year"

    def __InvalidRow(self):
        #Verify current row is valid: MainID and Title non empty
        if ( str(self.data.iloc[self.row, self.__col_codigo]) == 'nan' or
            str(self.data.iloc[self.row, self.__col_descripcion]) == 'nan'):
            #self.log.write(f"WARNING:Fila {self.row+2} -> no válida, no existe id/title\n") #TODO
            return True
        else:
            return False

    def __ProcessConcepts(self):
        self.__period = self.Popu.AddSubject(self.data.iloc[self.row, self.__col_codigo].strip(), "E4_Period", ins_label=False)
        self.Popu.AddLabel(self.__period, self.data.iloc[self.row,self.__col_descripcion].strip())

        self.__period_interval = self.Popu.AddSubjectFromURI(self.__period, "-Interval", "Interval", name_space="time")

        begin_date, xsd_tipo, tipo = self.FormatDate(self.data.iloc[self.row,self.__col_inicio])
        self.__begin = self.Popu.AddSubjectFromURI(self.__period_interval, "-Beginning", "Instant", name_space="time")
        self.Popu.AddLiteralFromURI(self.__begin, xsd_tipo, begin_date ,dtype=tipo, name_space="time")

        end_date, xsd_tipo, tipo = self.FormatDate(self.data.iloc[self.row,self.__col_fin])
        self.__end = self.Popu.AddSubjectFromURI(self.__period_interval, "-End", "Instant", name_space="time")
        self.Popu.AddLiteralFromURI(self.__end, xsd_tipo, end_date ,dtype=tipo, name_space="time")

        self.__period_span = self.Popu.AddSubjectFromURI(self.__period, "-Span", "SP10_Declarative_Time-Span", name_space="cit")

    def __ProcessProperties(self):
        self.Popu.AddRelationFromURI(self.__period, "P4_has_time-span", self.__period_span)

        self.Popu.AddRelationFromURI(self.__period_interval, "Q14_defines_time", self.__period_span, name_space="cit")
        self.Popu.AddRelationFromURI(self.__period_interval, 'hasBeginning', self.__begin, name_space="time")
        self.Popu.AddRelationFromURI(self.__period_interval, 'hasEnd', self.__end, name_space="time")


    def Execute(self):
        self.__ReadColumnIndex()

        for self.row in range(0, self.num_filas):
            #Verificar que es una fila con un objeto valido
            #MainID and Title non empty
            print ("Procesando: ", self.row + 2)
            if ( self.__InvalidRow()):
                continue
            else:
                self.__ProcessConcepts()    
                self.__ProcessProperties()        
                
        # Save individuals
        self.Popu.SaveTriples(self.onto_filename)
col_localizacion = data.columns.get_loc('Localización del objeto dentro del museo')
col_department = data.columns.get_loc('Departamento dentro del museo responsable por el objeto')

col_alto = data.columns.get_loc('Dimensión: Alto') #Museo Municipal
#col_alto = data.columns.get_loc('Dimensión: Alto en centímetros')
col_ancho = data.columns.get_loc('Dimensión: Ancho') #Museo Municipal
#col_ancho = data.columns.get_loc('Dimensión: Ancho en centímetros')
col_largo = data.columns.get_loc('Dimensión: Largo') #Museo Municipal
#col_largo = data.columns.get_loc('Dimensión: Largo en centímetros') 
col_diametro = data.columns.get_loc('Dimensión: Diámetro') #Museo Municipal
col_profundidad = data.columns.get_loc('Profundidad') #Museo Municipal
#col_profundidad = data.columns.get_loc('Dimensión: Profundidad en centímetros') 
col_peso = data.columns.get_loc('Peso')

#Load Ontology
Popu = Populate()
#Load Period Graph
period_graph = Graph()
period_graph.parse("periodos.ttl", format="turtle")

#Verificar si campo es legal TODO agregar otras condiciones
def Verificar(cadena: str):
    if (str(cadena) != "No asignado" and 
        str(cadena) != 'nan' and 
        str(cadena) != 'No aplicable' and 
        str(cadena) != 'Desconocida' and
        str(cadena) != 'Desconocido' and
        str(cadena) != 'Sin información' and
        str(cadena) != 'No definido'):
        return True
    else:
示例#7
0
col_file = data.columns.get_loc('Filename')

# col_clasifica = data.columns.get_loc('Clasificacion')

# col_R = data.columns.get_loc('R')
# col_G = data.columns.get_loc('G')
# col_B = data.columns.get_loc('B')
###############

#g = Graph()
#g.parse("../Curiocity_Turtle.owl", format="turtle")
#ecrm = Namespace("http://erlangen-crm.org/170309/")
#cit = Namespace("http://curiocity.org/")

#Load Ontology
Popu = Populate()
#Load Instances
instances = Graph()
instances.parse("reasoner_municipal.xml", format="xml")

#########
# General Concepts
#########

#Add RGB Ranges TODO Confirmar si es necesario sino eliminar de ontologia
#a1 = Popu.AddSubject("A1_Range", "Range_RGB", "cit", False)
#Popu.AddLiteralFromURI(a1, "P3_has_note", "A1 Range: values of histogram from 0,0,0 to 20,20,20",
#                     "string", "ecrm")

#Add Concept Type (for Recognition purposes) TODO Llevarlo a todos los objetos
# rec_type = Popu.AddSubject("Recognition_Concept", "E55_Type", ins_label=False)
示例#8
0
col_file = data.columns.get_loc('Filename')

col_clasifica = data.columns.get_loc('Clasificacion')

col_R = data.columns.get_loc('R')
col_G = data.columns.get_loc('G')
col_B = data.columns.get_loc('B')
###############

#g = Graph()
#g.parse("../Curiocity_Turtle.owl", format="turtle")
#ecrm = Namespace("http://erlangen-crm.org/170309/")
#cit = Namespace("http://curiocity.org/")

#Load Ontology
Popu = Populate()
#Load Instances
instances = Graph()
instances.parse("museo.ttl", format="turtle")

#########
# General Concepts
#########

#Add RGB Ranges TODO Confirmar si es necesario sino eliminar de ontologia
#a1 = Popu.AddSubject("A1_Range", "Range_RGB", "cit", False)
#Popu.AddLiteralFromURI(a1, "P3_has_note", "A1 Range: values of histogram from 0,0,0 to 20,20,20",
#                     "string", "ecrm")

#Add Concept Type (for Recognition purposes) TODO Llevarlo a todos los objetos
rec_type = Popu.AddSubject("Recognition_Concept", "E55_Type", ins_label=False)
示例#9
0
        data = pd.read_csv(filename + ".csv", sep ='\t', encoding='utf8', header = 0)
    else:
        data = pd.read_csv(filename+ ".csv", sep ='\t', header = None)
    return data

data = LeerDatos("CODIFICACION_PERIODOS")
num_filas = data.shape[0] #total de filas

#Column index from csv
col_codigo = data.columns.get_loc('CODIGO')
col_descripcion = data.columns.get_loc('DESCRIP2')
col_inicio = data.columns.get_loc('INICIO')
col_fin = data.columns.get_loc('FIN')

#Load Ontology
Popu = Populate()

#Verificar si campo es legal TODO agregar otras condiciones
def Verificar(cadena: str):
    if (str(cadena) != "No asignado" and 
        str(cadena) != 'nan' and 
        str(cadena) != 'No aplicable' and 
        str(cadena) != 'No definido'):
        return True
    else:
        return False

#row = 13
def FormatDate(date_text:str):
    #Verificar tipo de fecha
    if (date_text.count("-") == 2): #date