Class: SPARQL::Client::Query

Inherits:
RDF::Query show all
Defined in:
vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb

Overview

A SPARQL query builder.

Examples:

Iterating over all found solutions

query.each_solution { |solution| puts solution.inspect }

Defined Under Namespace

Classes: Filter

Instance Attribute Summary collapse

Attributes inherited from RDF::Query

#graph_name, #patterns

Attributes included from RDF::Enumerable

#existentials, #universals

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from RDF::Query

#+, #<<, #==, Solutions, #apply_graph_name, #bind, #default?, #dup, #empty?, #executable?, execute, #failed?, #matched?, #named?, #ndvars, #node?, #optimize, #optimize!, #pattern, #query_yields_boolean?, #query_yields_solutions?, #query_yields_statements?, #rewrite, #to_sxp_bin, #unnamed?, #valid?, #validate!, #variable?, #variable_count, #variables, #vars

Methods included from RDF::Enumerable

add_entailment, #contain?, #dump, #each_graph, #each_object, #each_predicate, #each_quad, #each_subject, #each_term, #each_triple, #entail, #enum_graph, #enum_object, #enum_predicate, #enum_quad, #enum_statement, #enum_subject, #enum_term, #enum_triple, #graph_names, #has_graph?, #has_object?, #has_predicate?, #has_quad?, #has_statement?, #has_subject?, #has_term?, #has_triple?, #invalid?, #method_missing, #objects, #predicates, #project_graph, #quads, #respond_to_missing?, #statements, #subjects, #supports?, #terms, #to_a, #to_h, #to_set, #triples, #valid?, #validate!

Methods included from RDF::Util::Aliasing::LateBound

#alias_method

Methods included from RDF::Countable

#count, #empty?

Methods included from RDF::Isomorphic

#bijection_to, #isomorphic_with?

Constructor Details

#self.construct(*variables, **options) ⇒ Query

Returns a new instance of Query.

Parameters:

Options Hash (**options):

  • :count (Hash{Symbol => Symbol})

    Contents are symbols relating a variable described within the query, to the projected variable.

Parameters:

Yields:

Yield Parameters:



104
105
106
107
108
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 104

def initialize(form = :ask, **options, &block)
  @subqueries = []
  @form = form.respond_to?(:to_sym) ? form.to_sym : form.to_s.to_sym
  super([], **options, &block)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RDF::Enumerable

Instance Attribute Details

#form:select, ... (readonly)

The form of the query.

Returns:

  • (:select, :ask, :construct, :describe)

See Also:



14
15
16
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 14

def form
  @form
end

#optionsHash{Symbol => Object} (readonly)

Returns:



18
19
20
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 18

def options
  @options
end

Class Method Details

.ask(**options) ⇒ Query

Creates a boolean ASK query.

Examples:

ASK WHERE { ?s ?p ?o . }

Query.ask.where([:s, :p, :o])

Parameters:

Returns:

See Also:



29
30
31
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 29

def self.ask(**options)
  self.new(:ask, **options)
end

.self.construct(*variables, **options) ⇒ Query

Creates a graph CONSTRUCT query.

Examples:

CONSTRUCT { ?s ?p ?o . } WHERE { ?s ?p ?o . }

Query.construct([:s, :p, :o]).where([:s, :p, :o])

Parameters:

Returns:

Parameters:

Returns:

See Also:



89
90
91
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 89

def self.construct(*patterns, **options)
  self.new(:construct, **options).construct(*patterns) # FIXME
end

.self.describe(*variables, **options) ⇒ Query

Creates a DESCRIBE query.

Examples:

DESCRIBE * WHERE { ?s ?p ?o . }

Query.describe.where([:s, :p, :o])

Parameters:

Returns:

Parameters:

Returns:

See Also:



71
72
73
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 71

def self.describe(*variables, **options)
  self.new(:describe, **options).describe(*variables)
end

.self.select(*variables, **options) ⇒ Query

Creates a tuple SELECT query.

Examples:

SELECT * WHERE { ?s ?p ?o . }

Query.select.where([:s, :p, :o])

SELECT ?s WHERE {?s ?p ?o .}

Query.select(:s).where([:s, :p, :o])

SELECT COUNT(?uri as ?c) WHERE {?uri a owl:Class}

Query.select(count: {uri: :c}).where([:uri, RDF.type, RDF::OWL.Class])

Parameters:

Returns:

Parameters:

Returns:

See Also:



53
54
55
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 53

def self.select(*variables, **options)
  self.new(:select, **options).select(*variables)
end

Instance Method Details

#asc(var) ⇒ Query

Examples:

SELECT * WHERE { ?s ?p ?o . } ORDER BY ASC(?o)

query.select.where([:s, :p, :o]).order.asc(:o)
query.select.where([:s, :p, :o]).asc(:o)

Parameters:

Returns:

See Also:



264
265
266
267
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 264

def asc(var)
  (options[:order_by] ||= []) << {var => :asc}
  self
end

#askQuery

Examples:

ASK WHERE { ?s ?p ?o . }

query.ask.where([:s, :p, :o])

Returns:

See Also:



116
117
118
119
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 116

def ask
  @form = :ask
  self
end

#construct(*patterns) ⇒ Query

Examples:

CONSTRUCT { ?s ?p ?o . } WHERE { ?s ?p ?o . }

query.construct([:s, :p, :o]).where([:s, :p, :o])

Parameters:

Returns:

See Also:



164
165
166
167
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 164

def construct(*patterns)
  options[:template] = build_patterns(patterns)
  self
end

#desc(var) ⇒ Query

Examples:

SELECT * WHERE { ?s ?p ?o . } ORDER BY DESC(?o)

query.select.where([:s, :p, :o]).order.desc(:o)
query.select.where([:s, :p, :o]).desc(:o)

Parameters:

Returns:

See Also:



277
278
279
280
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 277

def desc(var)
  (options[:order_by] ||= []) << {var => :desc}
  self
end

#describe(*variables) ⇒ Query

Examples:

DESCRIBE * WHERE { ?s ?p ?o . }

query.describe.where([:s, :p, :o])

Parameters:

Returns:

See Also:



150
151
152
153
154
155
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 150

def describe(*variables)
  @values = variables.map { |var|
    [var, var.is_a?(RDF::URI) ? var : RDF::Query::Variable.new(var)]
  }
  self
end

#distinct(state = true) ⇒ Query

Examples:

SELECT DISTINCT ?s WHERE { ?s ?p ?o . }

query.select(:s).distinct.where([:s, :p, :o])

Returns:

See Also:



302
303
304
305
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 302

def distinct(state = true)
  options[:distinct] = state
  self
end

#each_solution {|solution| ... } ⇒ Enumerator

Enumerates over each matching query solution.

Yields:

  • (solution)

Yield Parameters:

Returns:



670
671
672
673
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 670

def each_solution(&block)
  @solutions = result
  super
end

#each_statement {|statement| ... } ⇒ Enumerator

Yields:

  • (statement)

Yield Parameters:

Returns:



661
662
663
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 661

def each_statement(&block)
  result.each_statement(&block)
end

#executeObject

Returns:

Raises:

  • (NotImplementedError)


683
684
685
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 683

def execute
  raise NotImplementedError
end

#expects_statements?Boolean

Returns expects_statements?.

Returns:

  • (Boolean)

    expects_statements?



615
616
617
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 615

def expects_statements?
  [:construct, :describe].include?(form)
end

#false?Boolean

Returns:

  • (Boolean)


647
648
649
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 647

def false?
  !true?
end

#filter(string) ⇒ Query

Examples:

ASK WHERE { ?s ?p ?o . FILTER(regex(?s, 'Abiline, Texas')) }

query.ask.where([:s, :p, :o]).filter("regex(?s, 'Abiline, Texas')")

Returns:



629
630
631
632
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 629

def filter(string)
  ((options[:filters] ||= []) << Filter.new(string)) if string and not string.empty?
  self
end

#from(uri) ⇒ Query

Examples:

query.select.from(RDF::URI.new(a)).where([:s, :p, :o])

Parameters:

Returns:

See Also:



176
177
178
179
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 176

def from(uri)
  options[:from] = uri
  self
end

#graph(graph_uri_or_var) ⇒ Query

Examples:

SELECT * WHERE { GRAPH ?g { ?s ?p ?o . } }

query.select.graph(:g).where([:s, :p, :o])

Parameters:

Returns:

See Also:



324
325
326
327
328
329
330
331
332
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 324

def graph(graph_uri_or_var)
  options[:graph] = case graph_uri_or_var
    when Symbol then RDF::Query::Variable.new(graph_uri_or_var)
    when String then RDF::URI(graph_uri_or_var)
    when RDF::Value then graph_uri_or_var
    else raise ArgumentError
  end
  self
end

#group(*variables) ⇒ Query Also known as: group_by

Examples:

SELECT ?s WHERE { ?s ?p ?o . } GROUP BY ?s

query.select(:s).where([:s, :p, :o]).group_by(:s)

Parameters:

Returns:

See Also:



289
290
291
292
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 289

def group(*variables)
  options[:group_by] = variables
  self
end

#inspectString

Returns a developer-friendly representation of this query.

Returns:



834
835
836
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 834

def inspect
  sprintf("#<%s:%#0x(%s)>", self.class.name, __id__, to_s)
end

#inspect!

This method returns an undefined value.

Outputs a developer-friendly representation of this query to stderr.



825
826
827
828
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 825

def inspect!
  warn(inspect)
  self
end

#limit(length) ⇒ Query

Examples:

SELECT * WHERE { ?s ?p ?o . } LIMIT 10

query.select.where([:s, :p, :o]).limit(10)

Parameters:

Returns:

See Also:



352
353
354
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 352

def limit(length)
  slice(nil, length)
end

#minus(*patterns) {|query| ... } ⇒ Query

The block form can be used for more complicated queries, using the select form (note, use either block or argument forms, not both):

Examples:

SELECT * WHERE { ?book dc:title ?title . MINUS { ?book dc11:title ?title } }

query.select.where([:book, RDF::Vocab::DC.title, :title]).
  minus([:book, RDF::Vocab::DC11.title, :title])

SELECT * WHERE { ?book dc:title ?title MINUS { ?book dc11:title ?title . FILTER(langmatches(lang(?title), 'EN')) } }

query1 = SPARQL::Client::Query.select.
  where([:book, RDF::Vocab::DC11.title, :title]).
  filter("langmatches(?title, 'en')")
query.select.where([:book, RDF::Vocab::DC.title, :title]).minus(query1)

SELECT * WHERE { ?book dc:title ?title MINUS { ?book dc11:title ?title . FILTER(langmatches(lang(?title), 'EN'))} }

query1 = SPARQL::Client::Query.select.where([:book, RDF::Vocab::DC11.title, :title]).filter("langmatches(?title, 'en')")
query.select.where([:book, RDF::Vocab::DC.title, :title]).minus do |q|
  q.select.
    where([:book, RDF::Vocab::DC11.title, :title]).
    filter("langmatches(?title, 'en')")
end

Parameters:

Yields:

  • (query)

    Yield form with or without argument; without an argument, evaluates within the query.

Yield Parameters:

Returns:

See Also:



523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 523

def minus(*patterns, &block)
  options[:minuses] ||= []

  if block_given?
    raise ArgumentError, "#minus requires either arguments or a block, not both." unless patterns.empty?
    # Evaluate calls in a new query instance
    query = self.class.select
    case block.arity
      when 1 then block.call(query)
      else query.instance_eval(&block)
    end
    options[:minuses] << query
  elsif patterns.all? {|p| p.is_a?(SPARQL::Client::Query)}
    # With argument form, all must be patterns or queries
    options[:minuses] += patterns
  elsif patterns.all? {|p| p.is_a?(Array)}
    # With argument form, all must be patterns, or queries
    options[:minuses] << self.class.select.where(*patterns)
  else
    raise ArgumentError, "#minus arguments are triple patters or queries, not both."
  end

  self
end

#offset(start) ⇒ Query

Examples:

SELECT * WHERE { ?s ?p ?o . } OFFSET 100

query.select.where([:s, :p, :o]).offset(100)

Parameters:

Returns:

See Also:



341
342
343
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 341

def offset(start)
  slice(start, nil)
end

#optional(*patterns) {|query| ... } ⇒ Query

The block form can be used for adding filters:

Examples:

SELECT * WHERE { ?s ?p ?o . OPTIONAL { ?s a ?o . ?s <http://purl.org/dc/terms/abstract\> ?o . } }

query.select.where([:s, :p, :o]).
  optional([:s, RDF.type, :o], [:s, RDF::Vocab::DC.abstract, :o])

ASK WHERE { ?s ?p ?o . OPTIONAL { ?s ?p ?o . FILTER(regex(?s, 'Abiline, Texas'))} }

query.ask.where([:s, :p, :o]).optional([:s, :p, :o]) do
  filter("regex(?s, 'Abiline, Texas')")
end

Parameters:

Yields:

  • (query)

    Yield form with or without argument; without an argument, evaluates within the query.

Yield Parameters:

Returns:

See Also:



424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 424

def optional(*patterns, &block)
  (options[:optionals] ||= []) << build_patterns(patterns)

  if block_given?
    # Steal options[:filters]
    query_filters = options[:filters]
    options[:filters] = []
    case block.arity
      when 1 then block.call(self)
      else instance_eval(&block)
    end
    options[:optionals].last.concat(options[:filters])
    options[:filters] = query_filters
  end

  self
end

#order(*variables) ⇒ Query Also known as: order_by

Examples:

SELECT * WHERE { ?s ?p ?o . } ORDER BY ?o

query.select.where([:s, :p, :o]).order(:o)
query.select.where([:s, :p, :o]).order_by(:o)

SELECT * WHERE { ?s ?p ?o . } ORDER BY ?o ?p

query.select.where([:s, :p, :o]).order_by(:o, :p)

SELECT * WHERE { ?s ?p ?o . } ORDER BY ASC(?o) DESC(?p)

query.select.where([:s, :p, :o]).order_by(o: :asc, p: :desc)

Parameters:

Returns:

See Also:



249
250
251
252
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 249

def order(*variables)
  options[:order_by] = variables
  self
end

#prefix(prefix: uri) ⇒ Query #prefix(string) ⇒ Query

Overloads:

See Also:



391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 391

def prefix(val)
  options[:prefixes] ||= []
  if val.kind_of? String
    options[:prefixes] << val
  elsif val.kind_of? Hash
    val.each do |k, v|
      options[:prefixes] << "#{k}: <#{v}>"
    end
  else
    raise ArgumentError, "prefix must be a kind of String or a Hash"
  end
  self
end

#reduced(state = true) ⇒ Query

Examples:

SELECT REDUCED ?s WHERE { ?s ?p ?o . }

query.select(:s).reduced.where([:s, :p, :o])

Returns:

See Also:



313
314
315
316
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 313

def reduced(state = true)
  options[:reduced] = state
  self
end

#resultObject

Returns:



677
678
679
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 677

def result
  @result ||= execute
end

#select(*variables) ⇒ Query

Examples:

SELECT * WHERE { ?s ?p ?o . }

query.select.where([:s, :p, :o])

SELECT ?s WHERE {?s ?p ?o .}

query.select(:s).where([:s, :p, :o])

SELECT COUNT(?uri as ?c) WHERE {?uri a owl:Class}

query.select(count: {uri: :c}).where([:uri, RDF.type, RDF::OWL.Class])

Parameters:

Returns:

See Also:



134
135
136
137
138
139
140
141
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 134

def select(*variables)
  @values = if variables.length == 1 && variables.first.is_a?(Hash)
    variables.to_a
  else
    variables.map { |var| [var, RDF::Query::Variable.new(var)] }
  end
  self
end

#slice(start, length) ⇒ Query

Examples:

SELECT * WHERE { ?s ?p ?o . } OFFSET 100 LIMIT 10

query.select.where([:s, :p, :o]).slice(100, 10)

Parameters:

Returns:



363
364
365
366
367
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 363

def slice(start, length)
  options[:offset] = start.to_i if start
  options[:limit] = length.to_i if length
  self
end

#solutionsEnumerable<RDF::Query::Solution>

Returns:



653
654
655
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 653

def solutions
  result
end

#to_sString

Returns the string representation of this query.

Returns:



691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 691

def to_s
  buffer = [form.to_s.upcase]

  case form
    when :select, :describe
      only_count = values.empty? && options[:count]
      buffer << 'DISTINCT' if options[:distinct] and not only_count
      buffer << 'REDUCED'  if options[:reduced]
      buffer << ((values.empty? and not options[:count]) ? '*' : values.map { |v| SPARQL::Client.serialize_value(v[1]) }.join(' '))
      if options[:count]
        options[:count].each do |var, count|
          buffer << '( COUNT(' + (options[:distinct] ? 'DISTINCT ' : '') +
            (var.is_a?(String) ? var : "?#{var}") + ') AS ' + (count.is_a?(String) ? count : "?#{count}") + ' )'
        end
      end
    when :construct
      buffer << '{'
      buffer += SPARQL::Client.serialize_patterns(options[:template])
      buffer << '}'
  end

  buffer << "FROM #{SPARQL::Client.serialize_value(options[:from])}" if options[:from]

  unless patterns.empty? && form == :describe
    buffer += self.to_s_ggp.unshift('WHERE')
  end

  options.fetch(:unions, []).each do |query|
    buffer += query.to_s_ggp.unshift('UNION')
  end

  if options[:group_by]
    buffer << 'GROUP BY'
    buffer += options[:group_by].map { |var| var.is_a?(String) ? var : "?#{var}" }
  end

  if options[:order_by]
    buffer << 'ORDER BY'
    options[:order_by].map { |elem|
      case elem
        # .order_by({ var1: :asc, var2: :desc})
        when Hash
          elem.each { |key, val|
            # check provided values
            if !key.is_a?(Symbol)
              raise ArgumentError, 'keys of hash argument must be a Symbol'
            elsif !val.is_a?(Symbol) || (val != :asc && val != :desc)
              raise ArgumentError, 'values of hash argument must either be `:asc` or `:desc`'
            end
            buffer << "#{val == :asc ? 'ASC' : 'DESC'}(?#{key})"
          }
        # .order_by([:var1, :asc], [:var2, :desc])
        when Array
          # check provided values
          if elem.length != 2
            raise ArgumentError, 'array argument must specify two elements'
          elsif !elem[0].is_a?(Symbol)
            raise ArgumentError, '1st element of array argument must contain a Symbol'
          elsif !elem[1].is_a?(Symbol) || (elem[1] != :asc && elem[1] != :desc)
            raise ArgumentError, '2nd element of array argument must either be `:asc` or `:desc`'
          end
          buffer << "#{elem[1] == :asc ? 'ASC' : 'DESC'}(?#{elem[0]})"
        # .order_by(:var1, :var2)
        when Symbol
          buffer << "?#{elem}"
        # .order_by('ASC(?var1) DESC(?var2)')
        when String
          buffer << elem
        else
          raise ArgumentError, 'argument provided to `order()` must either be an Array, Symbol or String'
      end
    }
  end

  buffer << "OFFSET #{options[:offset]}" if options[:offset]
  buffer << "LIMIT #{options[:limit]}"   if options[:limit]
  options[:prefixes].reverse.each { |e| buffer.unshift("PREFIX #{e}") } if options[:prefixes]

  buffer.join(' ')
end

#true?Boolean

Returns:

  • (Boolean)


636
637
638
639
640
641
642
643
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 636

def true?
  case result
    when TrueClass, FalseClass then result
    when RDF::Literal::Boolean then result.true?
    when Enumerable then !result.empty?
    else false
  end
end

#union(*patterns) {|query| ... } ⇒ Query

The block form can be used for more complicated queries, using the select form (note, use either block or argument forms, not both):

Examples:

SELECT * WHERE { ?book dc:title ?title } UNION { ?book dc11:title ?title }

query.select.where([:book, RDF::Vocab::DC.title, :title]).
  union([:book, RDF::Vocab::DC11.title, :title])

SELECT * WHERE { ?book dc:title ?title } UNION { ?book dc11:title ?title . FILTER(langmatches(lang(?title), 'EN'))}

query1 = SPARQL::Client::Query.select.
  where([:book, RDF::Vocab::DC11.title, :title]).
  filter("langmatches(?title, 'en')")
query.select.where([:book, RDF::Vocab::DC.title, :title]).union(query1)

SELECT * WHERE { ?book dc:title ?title } UNION { ?book dc11:title ?title . FILTER(langmatches(lang(?title), 'EN'))}

query1 = SPARQL::Client::Query.select.where([:book, RDF::Vocab::DC11.title, :title]).filter("langmatches(?title, 'en')")
query.select.where([:book, RDF::Vocab::DC.title, :title]).union do |q|
  q.select.
    where([:book, RDF::Vocab::DC11.title, :title]).
    filter("langmatches(?title, 'en')")
end

Parameters:

Yields:

  • (query)

    Yield form with or without argument; without an argument, evaluates within the query.

Yield Parameters:

Returns:

See Also:



470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 470

def union(*patterns, &block)
  options[:unions] ||= []

  if block_given?
    raise ArgumentError, "#union requires either arguments or a block, not both." unless patterns.empty?
    # Evaluate calls in a new query instance
    query = self.class.select
    case block.arity
      when 1 then block.call(query)
      else query.instance_eval(&block)
    end
    options[:unions] << query
  elsif patterns.all? {|p| p.is_a?(SPARQL::Client::Query)}
    # With argument form, all must be patterns or queries
    options[:unions] += patterns
  elsif patterns.all? {|p| p.is_a?(Array)}
    # With argument form, all must be patterns, or queries
    options[:unions] << self.class.select.where(*patterns)
  else
    raise ArgumentError, "#union arguments are triple patters or queries, not both."
  end

  self
end

#valuesArray<Array(key, RDF::Value)> #values(vars, *data) ⇒ Query

Specify inline data for a query

Overloads:

  • #valuesArray<Array(key, RDF::Value)>

    Values returned from previous query.

    Returns:

  • #values(vars, *data) ⇒ Query

    Examples:

    single variable with multiple values

    query.select
     .where([:s, RDF::URI('http://purl.org/dc/terms/title'), :title])
     .values(:title, "This title", "Another title")

    multiple variables with multiple values

    query.select
     .where([:s, RDF::URI('http://purl.org/dc/terms/title'), :title],
            [:s, RDF.type, :type])
     .values([:type, :title],
             [RDF::URI('http://pcdm.org/models#Object'), "This title"],
             [RDF::URI('http://pcdm.org/models#Collection', 'Another title'])

    multiple variables with UNDEF

    query.select
     .where([:s, RDF::URI('http://purl.org/dc/terms/title'), :title],
            [:s, RDF.type, :type])
     .values([:type, :title],
             [nil "This title"],
             [RDF::URI('http://pcdm.org/models#Collection', nil])

    Parameters:

    Returns:



581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 581

def values(*args)
  return @values if args.empty?
  vars, *data = *args
  vars = Array(vars).map {|var| RDF::Query::Variable.new(var)}
  if vars.length == 1
    # data may be a in array form or simple form
    if data.any? {|d| d.is_a?(Array)} && !data.all? {|d| d.is_a?(Array)}
      raise ArgumentError, "values data must all be in array form or all simple"
    end
    data = data.map {|d| Array(d)}
  end

  # Each data value must be an array with the same number of entries as vars
  unless data.all? {|d| d.is_a?(Array) && d.all? {|dd| dd.is_a?(RDF::Value) || dd.is_a?(String) || dd.nil?}}
    raise ArgumentError, "values data must each be an array of terms, strings, or nil"
  end

  # Turn strings into Literals
  data = data.map do |d|
    d.map do |nil_literal_or_term|
      case nil_literal_or_term
      when nil then nil
      when String then RDF::Literal(nil_literal_or_term)
      when RDF::Value then graph_uri_or_var
      else raise ArgumentError
      end
    end
  end
  options[:values] = [vars, *data]
  self
end

#where(*patterns_queries) {|query| ... } ⇒ Query Also known as: whether

Block form can be used for chaining calls in addition to creating sub-select queries.

Examples:

SELECT * WHERE { ?s ?p ?o . }

query.select.where([:s, :p, :o])
query.select.whether([:s, :p, :o])

SELECT * WHERE { { SELECT * WHERE { ?s ?p ?o . } } . ?s ?p ?o . }

subquery = query.select.where([:s, :p, :o])
query.select.where([:s, :p, :o], subquery)

SELECT * WHERE { { SELECT * WHERE { ?s ?p ?o . } } . ?s ?p ?o . }

query.select.where([:s, :p, :o]) do |q|
  q.select.where([:s, :p, :o])
end

SELECT * WHERE { ?s ?p ?o . } ORDER BY ?o

query.select.where([:s, :p, :o]) do
  order(:o)
end

Parameters:

Yields:

  • (query)

    Yield form with or without argument; without an argument, evaluates within the query.

Yield Parameters:

  • query (SPARQL::Client::Query)

    Actually a delegator to query. Methods other than #select are evaluated against self. For #select, a new Query is created, and the result added as a subquery.

Returns:

See Also:



209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/sparql-client-622ad17a89b4/lib/sparql/client/query.rb', line 209

def where(*patterns_queries, &block)
  subqueries, patterns = patterns_queries.partition {|pq| pq.is_a? SPARQL::Client::Query}
  @patterns += build_patterns(patterns)
  @subqueries += subqueries

  if block_given?
    decorated_query = WhereDecorator.new(self)
    case block.arity
      when 1 then block.call(decorated_query)
      else decorated_query.instance_eval(&block)
    end
  end
  self
end