private void generateTriplesForCell(
      Node node,
      Set<String> existingTopRowTriples,
      String hNodeId,
      Set<String> predicatesCovered,
      Map<String, ReportMessage> predicatesFailed) {
    Map<String, String> columnValues = node.getColumnValues();
    List<PredicateObjectMap> pomList = this.auxInfo.getHNodeIdToPredObjLinks().get(hNodeId);
    if (pomList == null || pomList.isEmpty()) return;

    List<TriplesMap> toBeProcessedTriplesMap = new LinkedList<TriplesMap>();
    for (PredicateObjectMap pom : pomList) {
      toBeProcessedTriplesMap.add(pom.getTriplesMap());
    }

    Set<String> alreadyProcessedTriplesMapIds = new HashSet<String>();
    while (!toBeProcessedTriplesMap.isEmpty()) {
      TriplesMap trMap = toBeProcessedTriplesMap.remove(0);
      boolean dontAddNeighboringMaps = false;

      // Generate properties for the triple maps
      for (PredicateObjectMap pom : trMap.getPredicateObjectMaps()) {
        if (!predicatesCovered.contains(pom.getPredicate().getId())) {
          generatePropertyForPredObjMap(
              pom,
              columnValues,
              predicatesCovered,
              existingTopRowTriples,
              hNodeId,
              predicatesFailed);
        }
      }

      // Need to stop at the root
      if (trMap.getSubject().isSteinerTreeRootNode()) {
        dontAddNeighboringMaps = true;
      }

      List<TriplesMapLink> neighboringLinks =
          this.auxInfo.getTriplesMapGraph().getAllNeighboringTriplesMap(trMap.getId());

      for (TriplesMapLink trMapLink : neighboringLinks) {
        if (predicatesCovered.contains(
            trMapLink.getPredicateObjectMapLink().getPredicate().getId())) continue;

        // Add the other triplesMap in queue to be processed later
        if (!alreadyProcessedTriplesMapIds.contains(trMapLink.getSourceMap().getId())
            && !dontAddNeighboringMaps) {
          toBeProcessedTriplesMap.add(trMapLink.getSourceMap());
        }

        if (!alreadyProcessedTriplesMapIds.contains(trMapLink.getTargetMap().getId())
            && !dontAddNeighboringMaps) {
          toBeProcessedTriplesMap.add(trMapLink.getTargetMap());
        }
      }
      alreadyProcessedTriplesMapIds.add(trMap.getId());
    }
  }
  private void generatePropertyForPredObjMap(
      PredicateObjectMap pom,
      Map<String, String> columnValues,
      Set<String> predicatesCovered,
      Set<String> existingTopRowTriples,
      String hNodeId,
      Map<String, ReportMessage> predicatesFailed) {

    // Generate subject RDF
    SubjectMap subjMap = pom.getTriplesMap().getSubject();
    String subjUri = "";
    try {
      subjUri = generateSubjectMapRDF(subjMap, existingTopRowTriples, columnValues);
    } catch (ValueNotFoundKarmaException ve) {
      ReportMessage msg =
          createReportMessage(
              "Could not generate subject's RDF and URI for <i>predicate:"
                  + pom.getPredicate()
                      .getTemplate()
                      .toString()
                      .replaceAll("<", "{")
                      .replaceAll(">", "}")
                  + ", subject node: "
                  + subjMap.getId()
                  + "</i>",
              ve,
              this.factory.getHNode(hNodeId).getColumnName());
      predicatesFailed.put(pom.getPredicate().getId(), msg);
      return;
    } catch (NoValueFoundInNodeException e) {
      logger.debug("No value found in a node required to generate subject's RDF or URI.");
    }

    // Generate the predicate RDF
    String predicateUri = "";
    try {
      predicateUri =
          getTemplateTermSetPopulatedWithValues(columnValues, pom.getPredicate().getTemplate())
              .replaceAll(" ", "");
    } catch (ValueNotFoundKarmaException ve) {
      ReportMessage msg =
          createReportMessage(
              "Could not generate predicate's URI for <i>predicate:"
                  + pom.getPredicate()
                      .getTemplate()
                      .toString()
                      .replaceAll("<", "{")
                      .replaceAll(">", "}")
                  + ", subject node: "
                  + subjMap.getId()
                  + "</i>",
              ve,
              this.factory.getHNode(hNodeId).getColumnName());
      predicatesFailed.put(pom.getPredicate().getId(), msg);
      return;
    } catch (NoValueFoundInNodeException e) {
      logger.debug("No value found in a node required to generate predicate's URI.");
    }

    // Object property
    if (pom.getObject().hasRefObjectMap()) {
      // Generate the object URI
      TriplesMap objPropertyObjectTriplesMap =
          pom.getObject().getRefObjectMap().getParentTriplesMap();
      String objUri = "";
      try {
        objUri =
            generateSubjectMapRDF(
                objPropertyObjectTriplesMap.getSubject(), existingTopRowTriples, columnValues);
      } catch (ValueNotFoundKarmaException ve) {
        ReportMessage msg =
            createReportMessage(
                "Could not generate object's URI for <i>predicate:"
                    + pom.getPredicate()
                        .getTemplate()
                        .toString()
                        .replaceAll("<", "{")
                        .replaceAll(">", "}")
                    + ", subject node: "
                    + pom.getTriplesMap().getSubject().getId()
                    + "</i>",
                ve,
                this.factory.getHNode(hNodeId).getColumnName());
        predicatesFailed.put(pom.getPredicate().getId(), msg);
        return;
      } catch (NoValueFoundInNodeException e) {
        logger.debug("No value found in a node required to generate object's URI for a predicate.");
      }

      String triple = constructTripleWithURIObject(subjUri, predicateUri, objUri);
      if (!existingTopRowTriples.contains(triple)) {
        outWriter.println(triple);
        existingTopRowTriples.add(triple);
      }
    }
    // Data Property
    else {
      // Get the value
      String value = "";
      try {
        value = getTemplateTermSetPopulatedWithValues(columnValues, pom.getObject().getTemplate());
        if (value == null || value.trim().equals("")) return;
      } catch (ValueNotFoundKarmaException ve) {
        ReportMessage msg =
            createReportMessage(
                "Could not retrieve value for the <i>predicate:"
                    + pom.getPredicate()
                        .getTemplate()
                        .toString()
                        .replaceAll("<", "{")
                        .replaceAll(">", "}")
                    + ", subject node: "
                    + subjMap.getId()
                    + "</i>",
                ve,
                this.factory.getHNode(hNodeId).getColumnName());
        predicatesFailed.put(pom.getPredicate().getId(), msg);
        return;
      } catch (NoValueFoundInNodeException e) {
        logger.debug("No value found in a node required to generate value for a predicate.");
      }
      String triple = constructTripleWithLiteralObject(subjUri, predicateUri, value, "");
      if (!existingTopRowTriples.contains(triple)) {
        existingTopRowTriples.add(triple);
        outWriter.println(triple);
      }
    }
    predicatesCovered.add(pom.getPredicate().getId());
    if (predicatesFailed.containsKey(pom.getPredicate().getId()))
      predicatesFailed.remove(pom.getPredicate().getId());
  }