/**
   * Constant-valued term maps can be expressed more concisely using the constant shortcut
   * properties rr:subject, rr:predicate, rr:object and rr:graph. Occurrances of these properties
   * must be treated exactly as if the following triples were present in the mapping graph instead.
   *
   * @param r2rmlMappingGraph
   */
  private static void replaceShortcuts(SesameDataSet r2rmlMappingGraph) {
    Map<URI, URI> shortcutPredicates = new HashMap<URI, URI>();
    shortcutPredicates.put(
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.SUBJECT),
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.SUBJECT_MAP));
    shortcutPredicates.put(
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.PREDICATE),
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.PREDICATE_MAP));
    shortcutPredicates.put(
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.OBJECT),
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.OBJECT_MAP));
    shortcutPredicates.put(
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.GRAPH),
        vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.GRAPH_MAP));
    for (URI u : shortcutPredicates.keySet()) {
      List<Statement> shortcutTriples = r2rmlMappingGraph.tuplePattern(null, u, null);
      log.debug(
          "[RMLMappingFactory:replaceShortcuts] Number of R2RML shortcuts found "
              + "for "
              + u.getLocalName()
              + " : "
              + shortcutTriples.size());
      for (Statement shortcutTriple : shortcutTriples) {
        r2rmlMappingGraph.remove(
            shortcutTriple.getSubject(), shortcutTriple.getPredicate(), shortcutTriple.getObject());
        BNode blankMap = vf.createBNode();

        URI pMap = vf.createURI(shortcutPredicates.get(u).toString());
        URI pConstant = vf.createURI(Vocab.R2RML_NAMESPACE + R2RMLTerm.CONSTANT);
        r2rmlMappingGraph.add(shortcutTriple.getSubject(), pMap, blankMap);
        r2rmlMappingGraph.add(blankMap, pConstant, shortcutTriple.getObject());
      }
    }
  }