def counts_for_predicate(predicates, provider_uri = nil)
      raise ArgumentError, 'provider_uri must be an RDF::URI' unless
        provider_uri.respond_to? :to_uri

      optional_patterns = build_optional_patterns(predicates)

      SPARQL_CLIENT.select(VALUE, count: { '*' => :count })
        .where(*where_patterns(provider_uri))
        .optional(*optional_patterns)
        .group_by(VALUE)
        .order_by('DESC(?count)')
    end
def counts_for_predicate(predicates, provider_uri = nil)
      raise ArgumentError, 'provider_uri must be an RDF::URI' unless
        provider_uri.respond_to? :to_uri

      optional_patterns = build_optional_patterns(predicates)

      SPARQL_CLIENT.select(VALUE, count: { '*' => :count })
        .where(*where_patterns(provider_uri))
        .optional(*optional_patterns)
        .group_by(VALUE)
        .order_by('DESC(?count)')
    end
Writes a {SPARQL::Client::Query} against the Repository for counts of
 values matching at the end of a chain of predicates.

 @example
   QAQueryClient.counts_for_predicate(RDF::EDM.hasView,
     RDF::URI('http://example.org/moomin')
   => #<SPARQL::Client::Query:0x3fa596c6f068(
        SELECT ?value ( COUNT(*) AS ?count ) WHERE {
          ?aggregation <http://www.europeana.eu/schemas/edm/provider>
            <http://example.org/moomin> .
          ?aggregation a
            <http://www.openarchives.org/ore/terms/Aggregation> .
          OPTIONAL {
            ?aggregation <http://www.europeana.eu/schemas/edm/hasView>
              ?value .
          }
        } GROUP BY ?value ORDER BY DESC(?count))>

 @param predicates [#to_uri, Array<#to_uri>] a predicate or list of
   predicates to query
 @param provider_uri [#to_uri] a URI for an edm:provider value. Results
   will be filtered to Resources that have this provider.

 @return [SPARQL::Client::Query] a query object that will give solutions
   with `:value` and `:count` variables.