code: @Override
      public Table<URI, URI, MatchResult> match(Set<URI> origins, Set<URI> destinations) {
  
          StringBuffer queryBuffer = new StringBuffer()
                  .append(generateQueryHeader());
  
          List<String> whereClauses = new ArrayList<String>();
          for (URI origin : origins) {
              for (URI destination : destinations) {
                  whereClauses.add(generateMatchWhereClause(origin, destination, true));
              }
          }
  
          String queryStr = queryBuffer.append(Util.generateUnionStatement(whereClauses))
                  .append(generateQueryFooter())
                  .toString();
  
          log.debug("SPARQL Query generated: \n {}", queryStr);
  
          // This only returns positive matches. Fill up the rest with Fails
          Table<URI, URI, MatchResult> positiveMatches = queryForMatchResults(queryStr);
          ImmutableTable.Builder<URI, URI, MatchResult> results = ImmutableTable.builder();
          results.putAll(positiveMatches);
  
          // Fill up those not present with Fails
          for (URI origin : origins) {
              for (URI destination : destinations) {
                  if (!positiveMatches.contains(origin, destination)) {
                      results.put(origin, destination, new AtomicMatchResult(origin, destination, LogicConceptMatchType.Fail, this));
                  }
              }
          }
  
          return results.build();
      }
docs: Perform a match between two Sets of URIs (from {@code origin} to {@code destination})
  and returns the result.
  
  @param origins      Set of URIs of the elements to match
  @param destinations Set of URIs of the elements to match against
  @return a {@link com.google.common.collect.Table} with the result of the matching indexed by origin URI and then destination URI.