code: @Override
      public MatchResult match(URI origin, URI destination) {
  
          Set<URI> originOutputs = this.serviceManager.listOutputs(origin);
          Set<URI> destinationInputs = this.serviceManager.listInputs(destination);
  
          // Obtain all combinations of matches
          Table<URI, URI, MatchResult> matches = this.conceptMatcher.match(originOutputs, destinationInputs);
          // Collect the best match results for each of the destination's inputs
          // We should try and maximise the fulfillment of destination's inputs rather than be guided by the origin outputs
          ImmutableSet.Builder<MatchResult> builder = ImmutableSet.builder();
  
          for (Map.Entry<URI, Map<URI, MatchResult>> entry : matches.columnMap().entrySet()) {
              Map<URI, MatchResult> matchesMap = entry.getValue();
              Ordering<URI> valueComparator = Ordering.from(MatchResultComparators.BY_TYPE)
                      .onResultOf(Functions.forMap(matchesMap))  // Order by value
                      .compound(Ordering.natural());  // Order by URI eventually
  
              URI bestMatchUri = valueComparator.max(matchesMap.keySet());
              log.info("The best match for {} is {}, with a Match Result of {}",
                      entry.getKey(), bestMatchUri, matchesMap.get(bestMatchUri).getMatchType());
  
              builder.add(matchesMap.get(bestMatchUri));
          }
  
          MatchResult result = INTERSECTION.apply(builder.build());
          log.info("Combined match result - {}", result);
          return result;
      }
docs: Perform a match between two URIs (from {@code origin} to {@code destination})
  and returns the result.
  
  @param origin      URI of the element to match
  @param destination URI of the element to match against
  @return {@link uk.ac.open.kmi.iserve.discovery.api.MatchResult} with the result of the matching.