sparql 3.0.2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -1
  4. data/bin/sparql +8 -8
  5. data/lib/rack/sparql.rb +1 -1
  6. data/lib/rack/sparql/conneg.rb +1 -1
  7. data/lib/sinatra/sparql.rb +1 -1
  8. data/lib/sparql.rb +4 -4
  9. data/lib/sparql/algebra.rb +4 -4
  10. data/lib/sparql/algebra/aggregate.rb +2 -2
  11. data/lib/sparql/algebra/evaluatable.rb +2 -2
  12. data/lib/sparql/algebra/expression.rb +7 -7
  13. data/lib/sparql/algebra/extensions.rb +9 -14
  14. data/lib/sparql/algebra/operator.rb +1 -1
  15. data/lib/sparql/algebra/operator/add.rb +1 -1
  16. data/lib/sparql/algebra/operator/alt.rb +2 -2
  17. data/lib/sparql/algebra/operator/and.rb +4 -4
  18. data/lib/sparql/algebra/operator/asc.rb +2 -2
  19. data/lib/sparql/algebra/operator/ask.rb +2 -2
  20. data/lib/sparql/algebra/operator/avg.rb +5 -3
  21. data/lib/sparql/algebra/operator/base.rb +2 -2
  22. data/lib/sparql/algebra/operator/bnode.rb +3 -3
  23. data/lib/sparql/algebra/operator/bound.rb +2 -2
  24. data/lib/sparql/algebra/operator/clear.rb +1 -1
  25. data/lib/sparql/algebra/operator/coalesce.rb +2 -2
  26. data/lib/sparql/algebra/operator/concat.rb +2 -2
  27. data/lib/sparql/algebra/operator/construct.rb +2 -2
  28. data/lib/sparql/algebra/operator/copy.rb +1 -1
  29. data/lib/sparql/algebra/operator/count.rb +2 -2
  30. data/lib/sparql/algebra/operator/create.rb +1 -1
  31. data/lib/sparql/algebra/operator/dataset.rb +3 -3
  32. data/lib/sparql/algebra/operator/delete.rb +4 -2
  33. data/lib/sparql/algebra/operator/delete_data.rb +1 -1
  34. data/lib/sparql/algebra/operator/delete_where.rb +3 -3
  35. data/lib/sparql/algebra/operator/describe.rb +1 -1
  36. data/lib/sparql/algebra/operator/distinct.rb +2 -2
  37. data/lib/sparql/algebra/operator/drop.rb +1 -1
  38. data/lib/sparql/algebra/operator/encode_for_uri.rb +1 -1
  39. data/lib/sparql/algebra/operator/exists.rb +4 -4
  40. data/lib/sparql/algebra/operator/exprlist.rb +2 -2
  41. data/lib/sparql/algebra/operator/extend.rb +5 -5
  42. data/lib/sparql/algebra/operator/filter.rb +3 -3
  43. data/lib/sparql/algebra/operator/graph.rb +2 -2
  44. data/lib/sparql/algebra/operator/group.rb +11 -11
  45. data/lib/sparql/algebra/operator/group_concat.rb +5 -5
  46. data/lib/sparql/algebra/operator/if.rb +4 -4
  47. data/lib/sparql/algebra/operator/in.rb +3 -3
  48. data/lib/sparql/algebra/operator/insert.rb +4 -2
  49. data/lib/sparql/algebra/operator/insert_data.rb +1 -1
  50. data/lib/sparql/algebra/operator/join.rb +3 -3
  51. data/lib/sparql/algebra/operator/left_join.rb +3 -3
  52. data/lib/sparql/algebra/operator/load.rb +1 -1
  53. data/lib/sparql/algebra/operator/max.rb +5 -3
  54. data/lib/sparql/algebra/operator/min.rb +5 -3
  55. data/lib/sparql/algebra/operator/minus.rb +3 -3
  56. data/lib/sparql/algebra/operator/modify.rb +3 -3
  57. data/lib/sparql/algebra/operator/move.rb +1 -1
  58. data/lib/sparql/algebra/operator/notexists.rb +2 -2
  59. data/lib/sparql/algebra/operator/notin.rb +3 -3
  60. data/lib/sparql/algebra/operator/notoneof.rb +3 -4
  61. data/lib/sparql/algebra/operator/or.rb +4 -4
  62. data/lib/sparql/algebra/operator/order.rb +4 -4
  63. data/lib/sparql/algebra/operator/path.rb +4 -3
  64. data/lib/sparql/algebra/operator/path_opt.rb +14 -14
  65. data/lib/sparql/algebra/operator/path_plus.rb +6 -6
  66. data/lib/sparql/algebra/operator/path_star.rb +2 -2
  67. data/lib/sparql/algebra/operator/plus.rb +1 -1
  68. data/lib/sparql/algebra/operator/prefix.rb +2 -2
  69. data/lib/sparql/algebra/operator/project.rb +2 -2
  70. data/lib/sparql/algebra/operator/reduced.rb +2 -2
  71. data/lib/sparql/algebra/operator/regex.rb +1 -1
  72. data/lib/sparql/algebra/operator/replace.rb +1 -1
  73. data/lib/sparql/algebra/operator/reverse.rb +2 -2
  74. data/lib/sparql/algebra/operator/sample.rb +2 -2
  75. data/lib/sparql/algebra/operator/seq.rb +4 -5
  76. data/lib/sparql/algebra/operator/sequence.rb +3 -3
  77. data/lib/sparql/algebra/operator/slice.rb +2 -2
  78. data/lib/sparql/algebra/operator/substr.rb +1 -1
  79. data/lib/sparql/algebra/operator/sum.rb +5 -3
  80. data/lib/sparql/algebra/operator/table.rb +1 -1
  81. data/lib/sparql/algebra/operator/union.rb +2 -2
  82. data/lib/sparql/algebra/operator/update.rb +2 -2
  83. data/lib/sparql/algebra/operator/using.rb +2 -2
  84. data/lib/sparql/algebra/operator/with.rb +4 -4
  85. data/lib/sparql/algebra/query.rb +1 -1
  86. data/lib/sparql/algebra/update.rb +1 -1
  87. data/lib/sparql/extensions.rb +4 -4
  88. data/lib/sparql/grammar.rb +7 -7
  89. data/lib/sparql/grammar/parser11.rb +15 -17
  90. data/lib/sparql/results.rb +3 -3
  91. metadata +26 -33
@@ -29,7 +29,7 @@ module SPARQL; module Algebra
29
29
  # @raise [IOError]
30
30
  # If `from` does not exist, unless the `silent` operator is present
31
31
  # @see http://www.w3.org/TR/sparql11-update/
32
- def execute(queryable, options = {})
32
+ def execute(queryable, **options)
33
33
  operand.each do |op|
34
34
  debug(options) {"InsertData #{op.to_sxp}"}
35
35
  queryable.insert(op)
@@ -34,17 +34,17 @@ module SPARQL; module Algebra
34
34
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
35
35
  # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Query/Solution#merge-instance_method
36
36
  # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Query/Solution#compatible%3F-instance_method
37
- def execute(queryable, options = {}, &block)
37
+ def execute(queryable, **options, &block)
38
38
  # Join(Ω1, Ω2) = { merge(μ1, μ2) | μ1 in Ω1 and μ2 in Ω2, and μ1 and μ2 are compatible }
39
39
  # eval(D(G), Join(P1, P2)) = Join(eval(D(G), P1), eval(D(G), P2))
40
40
  #
41
41
  # Generate solutions independently, merge based on solution compatibility
42
42
  debug(options) {"Join #{operands.to_sse}"}
43
43
 
44
- left = queryable.query(operand(0), options.merge(depth: options[:depth].to_i + 1))
44
+ left = queryable.query(operand(0), depth: options[:depth].to_i + 1, **options)
45
45
  debug(options) {"(join)=>(left) #{left.map(&:to_h).to_sse}"}
46
46
 
47
- right = queryable.query(operand(1), options.merge(depth: options[:depth].to_i + 1))
47
+ right = queryable.query(operand(1), depth: options[:depth].to_i + 1, **options)
48
48
  debug(options) {"(join)=>(right) #{right.map(&:to_h).to_sse}"}
49
49
 
50
50
  @solutions = RDF::Query::Solutions(left.map do |s1|
@@ -34,14 +34,14 @@ module SPARQL; module Algebra
34
34
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
35
35
  # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Query/Solution#merge-instance_method
36
36
  # @see http://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Query/Solution#compatible%3F-instance_method
37
- def execute(queryable, options = {}, &block)
37
+ def execute(queryable, **options, &block)
38
38
  filter = operand(2)
39
39
 
40
40
  debug(options) {"LeftJoin"}
41
- left = queryable.query(operand(0), options.merge(depth: options[:depth].to_i + 1))
41
+ left = queryable.query(operand(0), depth: options[:depth].to_i + 1, **options)
42
42
  debug(options) {"=>(leftjoin left) #{left.inspect}"}
43
43
 
44
- right = queryable.query(operand(1), options.merge(depth: options[:depth].to_i + 1))
44
+ right = queryable.query(operand(1), depth: options[:depth].to_i + 1, **options)
45
45
  debug(options) {"=>(leftjoin right) #{right.inspect}"}
46
46
 
47
47
  # LeftJoin(Ω1, Ω2, expr) =
@@ -29,7 +29,7 @@ module SPARQL; module Algebra
29
29
  # @raise [IOError]
30
30
  # If `from` does not exist, unless the `silent` operator is present
31
31
  # @see http://www.w3.org/TR/sparql11-update/
32
- def execute(queryable, options = {})
32
+ def execute(queryable, **options)
33
33
  debug(options) {"Load"}
34
34
  silent = operands.first == :silent
35
35
  operands.shift if silent
@@ -6,12 +6,12 @@ module SPARQL; module Algebra
6
6
  # @example
7
7
  # (prefix ((: <http://www.example.org/>))
8
8
  # (project (?max)
9
- # (extend ((?max ?.0))
10
- # (group () ((?.0 (max ?o)))
9
+ # (extend ((?max ??.0))
10
+ # (group () ((??.0 (max ?o)))
11
11
  # (bgp (triple ?s ?p ?o))))))
12
12
  #
13
13
  # @see http://www.w3.org/TR/sparql11-query/#defn_aggMax
14
- class Max < Operator::Unary
14
+ class Max < Operator
15
15
  include Aggregate
16
16
 
17
17
  NAME = :max
@@ -25,6 +25,8 @@ module SPARQL; module Algebra
25
25
  # enum of evaluated operand
26
26
  # @return [RDF::Literal] The maximum value of the terms
27
27
  def apply(enum)
28
+ # FIXME: we don't actually do anything with distinct
29
+ operands.shift if distinct = (operands.first == :distinct)
28
30
  if enum.empty?
29
31
  raise TypeError, "Maximum of an empty multiset"
30
32
  elsif enum.flatten.all? {|n| n.literal?}
@@ -6,12 +6,12 @@ module SPARQL; module Algebra
6
6
  # @example
7
7
  # (prefix ((: <http://www.example.org/>))
8
8
  # (project (?max)
9
- # (extend ((?min ?.0))
10
- # (group () ((?.0 (min ?o)))
9
+ # (extend ((?min ??.0))
10
+ # (group () ((??.0 (min ?o)))
11
11
  # (bgp (triple ?s ?p ?o))))))
12
12
  #
13
13
  # @see http://www.w3.org/TR/sparql11-query/#defn_aggMin
14
- class Min < Operator::Unary
14
+ class Min < Operator
15
15
  include Aggregate
16
16
 
17
17
  NAME = :min
@@ -25,6 +25,8 @@ module SPARQL; module Algebra
25
25
  # enum of evaluated operand
26
26
  # @return [RDF::Literal] The maximum value of the terms
27
27
  def apply(enum)
28
+ # FIXME: we don't actually do anything with distinct
29
+ operands.shift if distinct = (operands.first == :distinct)
28
30
  if enum.empty?
29
31
  raise TypeError, "Minumuim of an empty multiset"
30
32
  elsif enum.flatten.all? {|n| n.literal?}
@@ -35,16 +35,16 @@ module SPARQL; module Algebra
35
35
  # the resulting solution sequence
36
36
  # @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#defn_algMinus
37
37
  # @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#negation
38
- def execute(queryable, options = {}, &block)
38
+ def execute(queryable, **options, &block)
39
39
  # Let Ω1 and Ω2 be multisets of solution mappings. We define:
40
40
  #
41
41
  # Minus(Ω1, Ω2) = { μ | μ in Ω1 . ∀ μ' in Ω2, either μ and μ' are not compatible or dom(μ) and dom(μ') are disjoint }
42
42
  #
43
43
  # card[Minus(Ω1, Ω2)](μ) = card[Ω1](μ)
44
44
  debug(options) {"Minus"}
45
- left = queryable.query(operand(0), options.merge(depth: options[:depth].to_i + 1))
45
+ left = queryable.query(operand(0), depth: options[:depth].to_i + 1, **options)
46
46
  debug(options) {"(minus left) #{left.inspect}"}
47
- right = queryable.query(operand(1), options.merge(depth: options[:depth].to_i + 1))
47
+ right = queryable.query(operand(1), depth: options[:depth].to_i + 1, **options)
48
48
  debug(options) {"(minus right) #{right.inspect}"}
49
49
  @solutions = left.minus(right)
50
50
  @solutions.each(&block) if block_given?
@@ -34,16 +34,16 @@ module SPARQL; module Algebra
34
34
  # @raise [IOError]
35
35
  # If `from` does not exist, unless the `silent` operator is present
36
36
  # @see http://www.w3.org/TR/sparql11-update/
37
- def execute(queryable, options = {})
37
+ def execute(queryable, **options)
38
38
  debug(options) {"Modify"}
39
39
  query = operands.shift
40
40
 
41
- queryable.query(query, options.merge(depth: options[:depth].to_i + 1)) do |solution|
41
+ queryable.query(query, depth: options[:depth].to_i + 1, **options) do |solution|
42
42
  debug(options) {"(solution)=>#{solution.inspect}"}
43
43
 
44
44
  # Execute each operand with queryable and solution
45
45
  operands.each do |op|
46
- op.execute(queryable, solution, options.merge(depth: options[:depth].to_i + 1))
46
+ op.execute(queryable, solutions: solution, depth: options[:depth].to_i + 1, **options)
47
47
  end
48
48
  end
49
49
  queryable
@@ -29,7 +29,7 @@ module SPARQL; module Algebra
29
29
  # @raise [IOError]
30
30
  # If `from` does not exist, unless the `silent` operator is present
31
31
  # @see http://www.w3.org/TR/sparql11-update/
32
- def execute(queryable, options = {})
32
+ def execute(queryable, **options)
33
33
  debug(options) {"Move"}
34
34
  silent = operands.first == :silent
35
35
  operands.shift if silent
@@ -29,10 +29,10 @@ module SPARQL; module Algebra
29
29
  # @option options[RDF::Queryable] queryable
30
30
  # queryable to execute, using bindings as an initial solution.
31
31
  # @return [RDF::Literal::Boolean] `true` or `false`
32
- def evaluate(bindings, options = {})
32
+ def evaluate(bindings, **options)
33
33
  solutions = RDF::Query::Solutions(bindings)
34
34
  queryable = options[:queryable]
35
- operand(0).execute(queryable, options.merge(solutions: solutions)).empty?
35
+ operand(0).execute(queryable, solutions: solutions, **options).empty?
36
36
  end
37
37
  end # NotExists
38
38
  end # Operator
@@ -42,12 +42,12 @@ module SPARQL; module Algebra
42
42
  # options passed from query
43
43
  # @return [RDF::Literal::Boolean] `true` or `false`
44
44
  # @raise [TypeError] if term is not found and any operand raises an error
45
- def evaluate(bindings, options = {})
46
- lhs = operands.first.evaluate(bindings, options.merge(depth: options[:depth].to_i + 1))
45
+ def evaluate(bindings, **options)
46
+ lhs = operands.first.evaluate(bindings, depth: options[:depth].to_i + 1, **options)
47
47
  error_found = false
48
48
  found = operands[1..-1].any? do |op|
49
49
  begin
50
- lhs == op.evaluate(bindings, options.merge(depth: options[:depth].to_i + 1))
50
+ lhs == op.evaluate(bindings, depth: options[:depth].to_i + 1, **options)
51
51
  rescue TypeError
52
52
  error_found = true
53
53
  end
@@ -31,17 +31,16 @@ module SPARQL; module Algebra
31
31
  # @yieldparam [RDF::Query::Solution] solution
32
32
  # @yieldreturn [void] ignored
33
33
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
34
- def execute(queryable, options = {}, &block)
34
+ def execute(queryable, **options, &block)
35
35
  debug(options) {"NotOneOf #{operands.to_sse}"}
36
36
  subject, object = options[:subject], options[:object]
37
37
 
38
- v = RDF::Query::Variable.new
39
- v.distinguished = false
38
+ v = RDF::Query::Variable.new(distinguished: false)
40
39
  bgp = RDF::Query.new do |q|
41
40
  q.pattern [subject, v, object]
42
41
  end
43
42
  query = Filter.new(NotIn.new(v, *operands), bgp)
44
- queryable.query(query, options.merge(depth: options[:depth].to_i + 1)) do |solution|
43
+ queryable.query(query, depth: options[:depth].to_i + 1, **options) do |solution|
45
44
  solution.bindings.delete(v.to_sym)
46
45
  debug(options) {"(solution)-> #{solution.to_h.to_sse}"}
47
46
  block.call(solution)
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
24
24
  # @param [Hash{Symbol => Object}] options
25
25
  # any additional options (see {Operator#initialize})
26
26
  # @raise [TypeError] if any operand is invalid
27
- def initialize(left, right, options = {})
27
+ def initialize(left, right, **options)
28
28
  super
29
29
  end
30
30
 
@@ -40,15 +40,15 @@ module SPARQL; module Algebra
40
40
  # options passed from query
41
41
  # @return [RDF::Literal::Boolean] `true` or `false`
42
42
  # @raise [TypeError] if the operands could not be coerced to a boolean literal
43
- def evaluate(bindings, options = {})
43
+ def evaluate(bindings, **options)
44
44
  begin
45
- left = boolean(operand(0).evaluate(bindings, options.merge(depth: options[:depth].to_i + 1))).true?
45
+ left = boolean(operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options)).true?
46
46
  rescue TypeError
47
47
  left = nil
48
48
  end
49
49
 
50
50
  begin
51
- right = boolean(operand(1).evaluate(bindings, options.merge(depth: options[:depth].to_i + 1))).true?
51
+ right = boolean(operand(1).evaluate(bindings, depth: options[:depth].to_i + 1, **options)).true?
52
52
  rescue TypeError
53
53
  right = nil
54
54
  end
@@ -31,15 +31,15 @@ module SPARQL; module Algebra
31
31
  # @return [RDF::Query::Solutions]
32
32
  # the resulting solution sequence
33
33
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
34
- def execute(queryable, options = {}, &block)
34
+ def execute(queryable, **options, &block)
35
35
 
36
36
  debug(options) {"Order"}
37
- @solutions = queryable.query(operands.last, options.merge(depth: options[:depth].to_i + 1)).order do |a, b|
37
+ @solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1, **options).order do |a, b|
38
38
  operand(0).inject(0) do |memo, op|
39
39
  debug(options) {"(order) #{op.inspect}"}
40
40
  memo = begin
41
- a_eval = op.evaluate(a, options.merge(queryable: queryable, depth: options[:depth].to_i + 1)) rescue nil
42
- b_eval = op.evaluate(b, options.merge(queryable: queryable, depth: options[:depth].to_i + 1)) rescue nil
41
+ a_eval = op.evaluate(a, queryable: queryable, depth: options[:depth].to_i + 1, **options) rescue nil
42
+ b_eval = op.evaluate(b, queryable: queryable, depth: options[:depth].to_i + 1, **options) rescue nil
43
43
  comp = Operator::Compare.evaluate(a_eval, b_eval).to_i
44
44
  comp = -comp if op.is_a?(Operator::Desc)
45
45
  comp
@@ -26,16 +26,17 @@ module SPARQL; module Algebra
26
26
  # @return [RDF::Query::Solutions]
27
27
  # the resulting solution sequence
28
28
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
29
- def execute(queryable, options = {}, &block)
29
+ def execute(queryable, **options, &block)
30
30
  debug(options) {"Path #{operands.to_sse}"}
31
31
  subject, path_op, object = operands
32
32
 
33
33
  @solutions = RDF::Query::Solutions.new
34
- path_op.execute(queryable, options.merge(
34
+ path_op.execute(queryable,
35
35
  subject: subject,
36
36
  object: object,
37
37
  graph_name: options.fetch(:graph_name, false),
38
- depth: options[:depth].to_i + 1)
38
+ depth: options[:depth].to_i + 1,
39
+ **options
39
40
  ) do |solution|
40
41
  @solutions << solution
41
42
  end
@@ -30,7 +30,7 @@ module SPARQL; module Algebra
30
30
  # @yieldparam [RDF::Query::Solution] solution
31
31
  # @yieldreturn [void] ignored
32
32
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
33
- def execute(queryable, options = {}, &block)
33
+ def execute(queryable, **options, &block)
34
34
  subject, object = options[:subject], options[:object]
35
35
  debug(options) {"Path? #{[subject, operands, object].to_sse}"}
36
36
 
@@ -41,48 +41,48 @@ module SPARQL; module Algebra
41
41
  # Nodes is the set of all subjects and objects in queryable
42
42
  # FIXME: should this be Queryable#enum_nodes?
43
43
  # All subjects which are `object`
44
- query = RDF::Query.new {|q| q.pattern(subject: subject)}
45
- queryable.query(query, options) do |solution|
44
+ query = RDF::Query.new {|q| q.pattern({subject: subject})}
45
+ queryable.query(query, **options) do |solution|
46
46
  solution.merge!(object.to_sym => solution[subject])
47
47
  debug(options) {"(solution-s0)-> #{solution.to_h.to_sse}"}
48
48
  solutions << solution
49
49
  end if query.valid?
50
50
 
51
51
  # All objects which are `object`
52
- query = RDF::Query.new {|q| q.pattern(object: object)}
53
- queryable.query(query, options) do |solution|
52
+ query = RDF::Query.new {|q| q.pattern({object: object})}
53
+ queryable.query(query, **options) do |solution|
54
54
  solution.merge!(subject.to_sym => solution[object])
55
55
  debug(options) {"(solution-o0)-> #{solution.to_h.to_sse}"}
56
56
  solutions << solution
57
57
  end if query.valid?
58
58
  when subject.variable?
59
59
  # All subjects which are `object`
60
- query = RDF::Query.new {|q| q.pattern(subject: object)}
61
- queryable.query(query, options) do |solution|
60
+ query = RDF::Query.new {|q| q.pattern({subject: object})}
61
+ queryable.query(query, **options) do |solution|
62
62
  solution.merge!(subject.to_sym => object)
63
63
  debug(options) {"(solution-s0)-> #{solution.to_h.to_sse}"}
64
64
  solutions << solution
65
65
  end if query.valid?
66
66
 
67
67
  # All objects which are `object`
68
- query = RDF::Query.new {|q| q.pattern(object: object)}
69
- queryable.query(query, options) do |solution|
68
+ query = RDF::Query.new {|q| q.pattern({object: object})}
69
+ queryable.query(query, **options) do |solution|
70
70
  solution.merge!(subject.to_sym => object)
71
71
  debug(options) {"(solution-o0)-> #{solution.to_h.to_sse}"}
72
72
  solutions << solution
73
73
  end if query.valid?
74
74
  when object.variable?
75
75
  # All subjects which are `subject`
76
- query = RDF::Query.new {|q| q.pattern(subject: subject)}
77
- queryable.query(query, options) do |solution|
76
+ query = RDF::Query.new {|q| q.pattern({subject: subject})}
77
+ queryable.query(query, **options) do |solution|
78
78
  solution.merge!(object.to_sym => subject)
79
79
  debug(options) {"(solution-s0)-> #{solution.to_h.to_sse}"}
80
80
  solutions << solution
81
81
  end if query.valid?
82
82
 
83
83
  # All objects which are `subject
84
- query = RDF::Query.new {|q| q.pattern(object: subject)}
85
- queryable.query(query, options) do |solution|
84
+ query = RDF::Query.new {|q| q.pattern({object: subject})}
85
+ queryable.query(query, **options) do |solution|
86
86
  solution.merge!(object.to_sym => subject)
87
87
  debug(options) {"(solution-o0)-> #{solution.to_h.to_sse}"}
88
88
  solutions << solution
@@ -103,7 +103,7 @@ module SPARQL; module Algebra
103
103
 
104
104
  # Recurse into query
105
105
  solutions +=
106
- queryable.query(query, options.merge(depth: options[:depth].to_i + 1))
106
+ queryable.query(query, depth: options[:depth].to_i + 1, **options)
107
107
  solutions.each(&block) if block_given?
108
108
  solutions
109
109
  end
@@ -26,7 +26,7 @@ module SPARQL; module Algebra
26
26
  # @yieldparam [RDF::Query::Solution] solution
27
27
  # @yieldreturn [void] ignored
28
28
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
29
- def execute(queryable, options = {}, &block)
29
+ def execute(queryable, **options, &block)
30
30
  subject, object = options[:subject], options[:object]
31
31
  debug(options) {"Path+ #{[subject, operands, object].to_sse}"}
32
32
 
@@ -53,7 +53,7 @@ module SPARQL; module Algebra
53
53
  # Keep track of solutions
54
54
  # Recurse into query
55
55
  immediate_solutions = []
56
- queryable.query(query, options.merge(depth: options[:depth].to_i + 1)) do |solution|
56
+ queryable.query(query, depth: options[:depth].to_i + 1, **options) do |solution|
57
57
  immediate_solutions << solution
58
58
  end
59
59
 
@@ -66,23 +66,23 @@ module SPARQL; module Algebra
66
66
  case
67
67
  when subject.variable? && object.variable?
68
68
  # Query starting with bound object as subject, but replace result with subject
69
- rs = queryable.query(self, options.merge(
69
+ rs = queryable.query(self, **options.merge(
70
70
  subject: solution[object],
71
71
  accumulator: (cumulative_solutions + immediate_solutions),
72
72
  depth: options[:depth].to_i + 1)).map {|s| s.merge(subject.to_sym => solution[subject])}
73
73
  # Query starting with bound subject as object, but replace result with subject
74
- ro = queryable.query(self, options.merge(
74
+ ro = queryable.query(self, **options.merge(
75
75
  object: solution[subject],
76
76
  accumulator: (cumulative_solutions + immediate_solutions),
77
77
  depth: options[:depth].to_i + 1)).map {|s| s.merge(object.to_sym => solution[object])}
78
78
  recursive_solutions += (rs + ro).uniq
79
79
  when subject.variable?
80
- recursive_solutions += queryable.query(self, options.merge(
80
+ recursive_solutions += queryable.query(self, **options.merge(
81
81
  object: solution[subject],
82
82
  accumulator: (cumulative_solutions + immediate_solutions),
83
83
  depth: options[:depth].to_i + 1)).uniq
84
84
  when object.variable?
85
- recursive_solutions += queryable.query(self, options.merge(
85
+ recursive_solutions += queryable.query(self, **options.merge(
86
86
  subject: solution[object],
87
87
  accumulator: (cumulative_solutions + immediate_solutions),
88
88
  depth: options[:depth].to_i + 1)).uniq
@@ -29,13 +29,13 @@ module SPARQL; module Algebra
29
29
  # @yieldparam [RDF::Query::Solution] solution
30
30
  # @yieldreturn [void] ignored
31
31
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
32
- def execute(queryable, options = {}, &block)
32
+ def execute(queryable, **options, &block)
33
33
  subject, object = options[:subject], options[:object]
34
34
  debug(options) {"Path* #{[subject, operands, object].to_sse}"}
35
35
 
36
36
  # (:x :p* :y) => (:x (:p+)? :y)
37
37
  query = PathOpt.new(PathPlus.new(*operands))
38
- query.execute(queryable, options.merge(depth: options[:depth].to_i + 1), &block)
38
+ query.execute(queryable, depth: options[:depth].to_i + 1, **options, &block)
39
39
  end
40
40
  end # PathStar
41
41
  end # Operator
@@ -9,7 +9,7 @@ module SPARQL; module Algebra
9
9
  #
10
10
  # @see http://www.w3.org/TR/xpath-functions/#func-numeric-unary-plus
11
11
  # @see http://www.w3.org/TR/xpath-functions/#func-numeric-add
12
- class Plus < Operator::Unary
12
+ class Plus < Operator
13
13
  include Evaluatable
14
14
 
15
15
  NAME = [:+, :plus]
@@ -30,9 +30,9 @@ module SPARQL; module Algebra
30
30
  # @return [RDF::Query::Solutions]
31
31
  # the resulting solution sequence
32
32
  # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
33
- def execute(queryable, options = {}, &block)
33
+ def execute(queryable, **options, &block)
34
34
  debug(options) {"Prefix"}
35
- @solutions = queryable.query(operands.last, options.merge(depth: options[:depth].to_i + 1), &block)
35
+ @solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1, **options, &block)
36
36
  end
37
37
 
38
38
  ##