code: public List<List<IBond>> getMatchingPharmacophoreBonds() {
          if (mappings == null) return null;
  
          // XXX: re-subsearching the query
          List<List<IBond>> bonds = new ArrayList<>();
          for (Map<IBond,IBond> map : mappings.toBondMap()) {
              bonds.add(new ArrayList<>(map.values()));
          }
          
          return bonds;
      }
docs: Get the matching pharmacophore constraints.
  
  The method should be called after performing the match, otherwise the return value is null.
  The method returns a List of List's. Each List represents the pharmacophore constraints in the
  target molecule that matched the query. Since constraints are conceptually modeled on bonds
  the result is a list of list of IBond. You should coerce these to the appropriate pharmacophore
  bond to get at the underlying grops.
  
  @return a List of a List of pharmacophore constraints in the target molecule that match the query
  @see org.openscience.cdk.pharmacophore.PharmacophoreBond
  @see org.openscience.cdk.pharmacophore.PharmacophoreAngleBond