code: public static GeoName parseFromGeoNamesRecord(final String inputLine, final String preferredName) {
          String[] ancestry = inputLine.split("\n");
          GeoName geoName = parseGeoName(ancestry[0], preferredName);
          // if more records exist, assume they are the ancestory of the target GeoName
          if (ancestry.length > 1) {
              GeoName current = geoName;
              for (int idx = 1; idx < ancestry.length; idx++) {
                  GeoName parent = parseGeoName(ancestry[idx], null);
                  if (!current.setParent(parent)) {
                      LOG.error("Invalid ancestry path for GeoName [{}]: {}", geoName, inputLine.replaceAll("\n", " |@| "));
                      break;
                  }
                  current = parent;
              }
          }
          return geoName;
      }
docs: Builds a {@link BasicGeoName} object based on a single gazetteer
  record in the GeoNames geographical database.
  
  @param inputLine     single line of tab-delimited text representing one record from the GeoNames gazetteer
  @param preferredName the preferred name of this GeoName as indicated by the GeoNames alternate names table
  @return              new GeoName object