Class: SPARQL::Client::Query

Inherits:
RDF::Query show all
Defined in:
vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/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

#patterns

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from RDF::Query

#+, #<<, #==, Solutions, #apply_graph_name, #default?, #dup, #empty?, #executable?, execute, #failed?, #graph_name, #graph_name=, #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, #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::Isomorphic

#bijection_to, #isomorphic_with?

Methods included from RDF::Countable

#count, #empty?

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:



107
108
109
110
111
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 107

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.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 14

def form
  @form
end

#optionsHash{Symbol => Object} (readonly)

Returns:



18
19
20
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/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.5.0/bundler/gems/sparql-client-609d9eed6a1f/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:



91
92
93
94
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 91

def self.construct(*patterns)
  options = patterns.last.is_a?(Hash) ? patterns.pop : {}
  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:



72
73
74
75
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 72

def self.describe(*variables)
  options = variables.last.is_a?(Hash) ? variables.pop : {}
  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 ?p ?o .

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

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

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

Parameters:

Returns:

Parameters:

Returns:

See Also:



53
54
55
56
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 53

def self.select(*variables)
  options = variables.last.is_a?(Hash) ? variables.pop : {}
  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:



263
264
265
266
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 263

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:



119
120
121
122
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 119

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:



163
164
165
166
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 163

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:



276
277
278
279
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 276

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:



149
150
151
152
153
154
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 149

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:



301
302
303
304
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 301

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

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

Enumerates over each matching query solution.

Yields:

  • (solution)

Yield Parameters:

Returns:



647
648
649
650
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 647

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

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

Yields:

  • (statement)

Yield Parameters:

Returns:



638
639
640
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 638

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

#executeObject

Returns:

Raises:

  • (NotImplementedError)


660
661
662
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 660

def execute
  raise NotImplementedError
end

#expects_statements?Boolean

Returns expects_statements?

Returns:

  • (Boolean)

    expects_statements?



592
593
594
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 592

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

#false?Boolean

Returns:

  • (Boolean)


624
625
626
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 624

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:



606
607
608
609
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 606

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:



175
176
177
178
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 175

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:



323
324
325
326
327
328
329
330
331
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 323

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:



288
289
290
291
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 288

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

#inspectString

Returns a developer-friendly representation of this query.

Returns:



811
812
813
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 811

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.



802
803
804
805
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 802

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:



351
352
353
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 351

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:



500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 500

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:



340
341
342
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 340

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:



401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 401

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:



248
249
250
251
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 248

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

#prefix(string) ⇒ Query

Examples:

PREFIX dc: http://purl.org/dc/elements/1.1/ PREFIX foaf: http://xmlns.com/foaf/0.1/ SELECT * WHERE { ?s ?p ?o . }

query.select.
  prefix(dc: RDF::URI("http://purl.org/dc/elements/1.1/")).
  prefix(foaf: RDF::URI("http://xmlns.com/foaf/0.1/")).
  where([:s, :p, :o])

Returns:

See Also:



377
378
379
380
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 377

def prefix(string)
  (options[:prefixes] ||= []) << string
  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:



312
313
314
315
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 312

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

#resultObject

Returns:



654
655
656
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 654

def result
  @result ||= execute
end

#select(*variables) ⇒ Query

Examples:

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

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

SELECT ?s WHERE ?p ?o .

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

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

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

Parameters:

Returns:

See Also:



137
138
139
140
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 137

def select(*variables)
  @values = variables.map { |var| [var, RDF::Query::Variable.new(var)] }
  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:



362
363
364
365
366
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 362

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:



630
631
632
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 630

def solutions
  result
end

#to_sString

Returns the string representation of this query.

Returns:



668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
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
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 668

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)


613
614
615
616
617
618
619
620
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 613

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:



447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 447

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:



558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 558

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:



208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'vendor/bundler/ruby/2.5.0/bundler/gems/sparql-client-609d9eed6a1f/lib/sparql/client/query.rb', line 208

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