def map_nodes()

in microservices/skill_service/src/services/skill_to_knowledge/skill_to_node.py [0:0]


  def map_nodes(self, query, learning_resource_ids):
    """Retrieves knowledge nodes semantically similar to the skill
      Args:
        req_body: query: (str) - Skill name and/or description
                  learning_resource_ids - list of learning resource ids to use
                                    for knowledge nodes
      Returns:
        response: dict - dictionary containing
                  skill_id - firestore document id for the skill
                  mapped_passages - list of dictionaries containing
                            id - passage id
                            score - similarity score with skill
                  mapped_lus - list of dictionaries containing
                            id - LU firestore document id
                            score - similarity score with skill
                  mapped_los - list of dictionaries containing
                            id - LO firestore document id
                            score - similarity score with skill
                  mapped_subconcepts - list of dictionaries containing
                            id - Subconcept firestore document id
                            score - similarity score with skill
                  mapped_concepts - list of dictionaries containing
                            id - Concept firestore document id
                            score - similarity score with skill
                  mapped_learning_resource - list containing learning resource
                                            firestore document ids
                  all_mapped_lus - list containing all mapped learning unit
                                   firestore document ids
    """
    response = {}
    for learning_resource_id in learning_resource_ids:
      skill_to_passage_nodes = []
      skill_to_lu_nodes = []
      skill_to_lo_nodes = []
      skill_to_subconcept_nodes = []
      skill_to_concept_nodes = []
      skill_to_lr_nodes = []
      learning_resource = KnowledgeServiceLearningContent.find_by_id(
        learning_resource_id)
      lr_mapped = False
      #learning_resource.load_tree()
      lr_fields = learning_resource.get_fields()
      lr_data = ParentChildNodesHandler.return_child_nodes_data(lr_fields)
      lr_specific_concepts = []
      for concept_dict in lr_data["child_nodes"]["concepts"]:
        concept = Concept.find_by_uuid(concept_dict["uuid"])
        concept_specific_subconcepts = []
        for sub_concept_dict in concept_dict["child_nodes"]["sub_concepts"]:
          sub_concept = SubConcept.find_by_uuid(sub_concept_dict["uuid"])
          subconcept_specific_los = []
          for learning_objective_dict in sub_concept_dict\
            ["child_nodes"]["learning_objectives"]:
            learning_objective = KnowledgeServiceLearningObjective.\
              find_by_uuid(learning_objective_dict["uuid"])
            lo_specific_lus = []
            for learning_unit_dict in learning_objective_dict\
              ["child_nodes"]["learning_units"]:
              learning_unit = KnowledgeServiceLearningUnit.\
                find_by_uuid(learning_unit_dict["uuid"])
              passages = learning_unit.text.split("<p>")
              lu_specific_passages = []
              for i, passage in enumerate(passages):
                metadata = {"passage_text": passage, "skill_description": query}
                passage_id = learning_unit.id + "##" + str(i)
                passage_title = learning_unit.title + "_##Passage_" + str(i)
                skill_to_passage_node = Skill_Passage(passage_id, passage_title,
                                                      metadata)
                lu_specific_passages.append(skill_to_passage_node)
                if skill_to_passage_node.mapped:
                  skill_to_passage_nodes.append(skill_to_passage_node)
                  if not lr_mapped:
                    lr_mapped = True
                    skill_to_lr_nodes.append(learning_resource_id)
              skill_to_lu_node = Skill_LU(learning_unit.id, learning_unit.title,
                                          lu_specific_passages)
              if skill_to_lu_node.mapped:
                skill_to_lu_nodes.append(skill_to_lu_node)
              lo_specific_lus.append(skill_to_lu_node)
            skill_to_lo_node = Skill_LO(learning_objective.id,
                                        learning_objective.title,
                                        lo_specific_lus)
            if skill_to_lo_node.mapped:
              skill_to_lo_nodes.append(skill_to_lo_node)
            subconcept_specific_los.append(skill_to_lo_node)
          skill_to_subconcept_node = Skill_SubConcept(sub_concept.id,
                                                      sub_concept.title,
                                                      subconcept_specific_los)
          if skill_to_subconcept_node.mapped:
            skill_to_subconcept_nodes.append(skill_to_subconcept_node)
          concept_specific_subconcepts.append(skill_to_subconcept_node)
        skill_to_concept_node = Skill_Concept(concept.id, concept.title,
                                              concept_specific_subconcepts)
        if skill_to_concept_node.mapped:
          skill_to_concept_nodes.append(skill_to_concept_node)
        lr_specific_concepts.append(skill_to_concept_node)

      response[learning_resource_id] = {}
      response[learning_resource_id]["mapped_passages"] = \
        self.filter_nodes(skill_to_passage_nodes)
      response[learning_resource_id]["mapped_lus"] = \
        self.filter_nodes(skill_to_lu_nodes)
      response[learning_resource_id]["mapped_los"] = \
        self.filter_nodes(skill_to_lo_nodes)
      response[learning_resource_id]["mapped_subconcepts"] = \
        self.filter_nodes(skill_to_subconcept_nodes)
      response[learning_resource_id]["mapped_concepts"] = \
        self.filter_nodes(skill_to_concept_nodes)
    return response