/**
   * Converts the String representation of a {@link Var} back into the object version.
   *
   * @param varString - The {@link Var} represented as a String. (not null)
   * @return A {@link Var} built from the string.
   */
  public static Var toVar(final String varString) {
    checkNotNull(varString);

    if (varString.startsWith("-const-")) {
      // The variable is a constant value.
      final String[] varParts = varString.split(TYPE_DELIM);
      final String name = varParts[0];
      final String valueString = name.substring("-const-".length());

      final String dataTypeString = varParts[1];
      if (dataTypeString.equals(URI_TYPE)) {
        // Handle a URI object.
        final Var var = new Var(name, new URIImpl(valueString));
        var.setAnonymous(true);
        return var;
      } else {
        // Literal value.
        final URI dataType = new URIImpl(dataTypeString);
        final Literal value = new LiteralImpl(valueString, dataType);
        final Var var = new Var(name, value);
        var.setAnonymous(true);
        return var;
      }
    } else {
      // The variable is a named variable.
      return new Var(varString);
    }
  }
  /**
   * Create a QueryBuilder for creating a describe query
   *
   * @param theVars the variables to be described
   * @param theValues the specific bound URI values to be described
   * @return a describe query builder
   */
  public static QueryBuilder<ParsedGraphQuery> describe(String[] theVars, Resource... theValues) {
    QueryBuilder<ParsedGraphQuery> aBuilder =
        new AbstractQueryBuilder<ParsedGraphQuery>(new ParsedGraphQuery());

    aBuilder.reduced();
    aBuilder.addProjectionVar("descr_subj", "descr_pred", "descr_obj");
    GroupBuilder<?, ?> aGroup = aBuilder.group();

    if (theVars != null) {
      for (String aVar : theVars) {
        Var aVarObj = new Var(aVar);
        aVarObj.setAnonymous(true);

        aGroup
            .filter()
            .or(
                new SameTerm(aVarObj, new Var("descr_subj")),
                new SameTerm(aVarObj, new Var("descr_obj")));
      }
    }

    if (theValues != null) {
      for (Resource aVar : theValues) {
        Var aSubjVar = new Var("descr_subj");
        aSubjVar.setAnonymous(true);

        Var aObjVar = new Var("descr_obj");
        aObjVar.setAnonymous(true);

        aGroup
            .filter()
            .or(
                new SameTerm(new ValueConstant(aVar), aSubjVar),
                new SameTerm(new ValueConstant(aVar), aObjVar));
      }
    }

    aGroup.atom("descr_subj", "descr_pred", "descr_obj");

    return aBuilder;
  }