docs: def json_qry(dataset, qry_str, params={}):
      """ Takes a json query string and returns the results
  
      args:
          dataset: RdfDataset to query against
          qry_str: query string
          params: dictionary of params
      """
      # if qry_str.startswith("$.bf_itemOf[rdf_type=bf_Print].='print',\n"):
      #     pdb.set_trace()
      if not '$' in qry_str:
          qry_str = ".".join(['$', qry_str.strip()])
      dallor_val = params.get("$", dataset)
      if isinstance(dallor_val, rdflib.URIRef):
          dallor_val = Uri(dallor_val)
      if qry_str.strip() == '$':
          return [dallor_val]
      parsed_qry = parse_json_qry(qry_str)
      qry_parts = parsed_qry['qry_parts']
      post_actions = parsed_qry['params']
      # print(qry_parts)
      rtn_list = UniqueList()
      if params.get('dataset'):
          dataset = params['dataset']
      for or_part in qry_parts:
          if or_part[1] == 0:
              if isinstance(dallor_val, dict):
                  result = dallor_val
              else:
                  try:
                      result = dataset[dallor_val]
                  except KeyError:
                      try:
                          result = dataset[Uri(dallor_val)]
                      except KeyError:
                          try:
                              result = dataset[BlankNode(dallor_val)]
                          except KeyError:
                              continue
  
              forward = True
              for part in or_part[0][1:]:
                  if part == "*":
                      forward = not forward
                  else:
                      if forward:
                          result = get_json_qry_item(result, part)
                      else:
                          result = get_reverse_json_qry_item(result,
                                                             part,
                                                             False)
          else:
              result = dataset
              parts = or_part[0].copy()
              parts.reverse()
              forward = False
              for part in parts[1:]:
                  if part == "*":
                      forward = not forward
                  else:
                      if forward:
                          result = get_json_qry_item(result, part)
                      else:
                          result = get_reverse_json_qry_item(result,
                                                             part,
                                                             False,
                                                             dallor_val)
          rtn_list += result
      for action in post_actions:
          rtn_list = action(rtn_list)
      return rtn_list