docs: def __extract_pattern_nodes(graph):
      """
      Extract and bind the triple patterns contained in the search plan, so as to be able to identify
      to which pattern is associated each triple of the fragment.
      :return:
      """
      tp_nodes = graph.subjects(RDF.type, AGORA.TriplePattern)
      for tpn in tp_nodes:
          subject = list(graph.objects(tpn, AGORA.subject)).pop()
          predicate = list(graph.objects(tpn, AGORA.predicate)).pop()
          obj = list(graph.objects(tpn, AGORA.object)).pop()
          subject_str = list(graph.objects(subject, RDFS.label)).pop().toPython()
          predicate_str = graph.qname(predicate)
          if (obj, RDF.type, AGORA.Variable) in graph:
              object_str = list(graph.objects(obj, RDFS.label)).pop().toPython()
          else:
              object_str = list(graph.objects(obj, AGORA.value)).pop().toPython()
          __plan_patterns[tpn] = '{} {} {}'.format(subject_str, predicate_str, object_str)