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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/VERSION +1 -1
- data/bin/sparql +8 -8
- data/lib/rack/sparql.rb +1 -1
- data/lib/rack/sparql/conneg.rb +1 -1
- data/lib/sinatra/sparql.rb +1 -1
- data/lib/sparql.rb +4 -4
- data/lib/sparql/algebra.rb +4 -4
- data/lib/sparql/algebra/aggregate.rb +2 -2
- data/lib/sparql/algebra/evaluatable.rb +2 -2
- data/lib/sparql/algebra/expression.rb +7 -7
- data/lib/sparql/algebra/extensions.rb +9 -14
- data/lib/sparql/algebra/operator.rb +1 -1
- data/lib/sparql/algebra/operator/add.rb +1 -1
- data/lib/sparql/algebra/operator/alt.rb +2 -2
- data/lib/sparql/algebra/operator/and.rb +4 -4
- data/lib/sparql/algebra/operator/asc.rb +2 -2
- data/lib/sparql/algebra/operator/ask.rb +2 -2
- data/lib/sparql/algebra/operator/avg.rb +5 -3
- data/lib/sparql/algebra/operator/base.rb +2 -2
- data/lib/sparql/algebra/operator/bnode.rb +3 -3
- data/lib/sparql/algebra/operator/bound.rb +2 -2
- data/lib/sparql/algebra/operator/clear.rb +1 -1
- data/lib/sparql/algebra/operator/coalesce.rb +2 -2
- data/lib/sparql/algebra/operator/concat.rb +2 -2
- data/lib/sparql/algebra/operator/construct.rb +2 -2
- data/lib/sparql/algebra/operator/copy.rb +1 -1
- data/lib/sparql/algebra/operator/count.rb +2 -2
- data/lib/sparql/algebra/operator/create.rb +1 -1
- data/lib/sparql/algebra/operator/dataset.rb +3 -3
- data/lib/sparql/algebra/operator/delete.rb +4 -2
- data/lib/sparql/algebra/operator/delete_data.rb +1 -1
- data/lib/sparql/algebra/operator/delete_where.rb +3 -3
- data/lib/sparql/algebra/operator/describe.rb +1 -1
- data/lib/sparql/algebra/operator/distinct.rb +2 -2
- data/lib/sparql/algebra/operator/drop.rb +1 -1
- data/lib/sparql/algebra/operator/encode_for_uri.rb +1 -1
- data/lib/sparql/algebra/operator/exists.rb +4 -4
- data/lib/sparql/algebra/operator/exprlist.rb +2 -2
- data/lib/sparql/algebra/operator/extend.rb +5 -5
- data/lib/sparql/algebra/operator/filter.rb +3 -3
- data/lib/sparql/algebra/operator/graph.rb +2 -2
- data/lib/sparql/algebra/operator/group.rb +11 -11
- data/lib/sparql/algebra/operator/group_concat.rb +5 -5
- data/lib/sparql/algebra/operator/if.rb +4 -4
- data/lib/sparql/algebra/operator/in.rb +3 -3
- data/lib/sparql/algebra/operator/insert.rb +4 -2
- data/lib/sparql/algebra/operator/insert_data.rb +1 -1
- data/lib/sparql/algebra/operator/join.rb +3 -3
- data/lib/sparql/algebra/operator/left_join.rb +3 -3
- data/lib/sparql/algebra/operator/load.rb +1 -1
- data/lib/sparql/algebra/operator/max.rb +5 -3
- data/lib/sparql/algebra/operator/min.rb +5 -3
- data/lib/sparql/algebra/operator/minus.rb +3 -3
- data/lib/sparql/algebra/operator/modify.rb +3 -3
- data/lib/sparql/algebra/operator/move.rb +1 -1
- data/lib/sparql/algebra/operator/notexists.rb +2 -2
- data/lib/sparql/algebra/operator/notin.rb +3 -3
- data/lib/sparql/algebra/operator/notoneof.rb +3 -4
- data/lib/sparql/algebra/operator/or.rb +4 -4
- data/lib/sparql/algebra/operator/order.rb +4 -4
- data/lib/sparql/algebra/operator/path.rb +4 -3
- data/lib/sparql/algebra/operator/path_opt.rb +14 -14
- data/lib/sparql/algebra/operator/path_plus.rb +6 -6
- data/lib/sparql/algebra/operator/path_star.rb +2 -2
- data/lib/sparql/algebra/operator/plus.rb +1 -1
- data/lib/sparql/algebra/operator/prefix.rb +2 -2
- data/lib/sparql/algebra/operator/project.rb +2 -2
- data/lib/sparql/algebra/operator/reduced.rb +2 -2
- data/lib/sparql/algebra/operator/regex.rb +1 -1
- data/lib/sparql/algebra/operator/replace.rb +1 -1
- data/lib/sparql/algebra/operator/reverse.rb +2 -2
- data/lib/sparql/algebra/operator/sample.rb +2 -2
- data/lib/sparql/algebra/operator/seq.rb +4 -5
- data/lib/sparql/algebra/operator/sequence.rb +3 -3
- data/lib/sparql/algebra/operator/slice.rb +2 -2
- data/lib/sparql/algebra/operator/substr.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +5 -3
- data/lib/sparql/algebra/operator/table.rb +1 -1
- data/lib/sparql/algebra/operator/union.rb +2 -2
- data/lib/sparql/algebra/operator/update.rb +2 -2
- data/lib/sparql/algebra/operator/using.rb +2 -2
- data/lib/sparql/algebra/operator/with.rb +4 -4
- data/lib/sparql/algebra/query.rb +1 -1
- data/lib/sparql/algebra/update.rb +1 -1
- data/lib/sparql/extensions.rb +4 -4
- data/lib/sparql/grammar.rb +7 -7
- data/lib/sparql/grammar/parser11.rb +15 -17
- data/lib/sparql/results.rb +3 -3
- 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
|
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),
|
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),
|
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
|
37
|
+
def execute(queryable, **options, &block)
|
38
38
|
filter = operand(2)
|
39
39
|
|
40
40
|
debug(options) {"LeftJoin"}
|
41
|
-
left = queryable.query(operand(0),
|
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),
|
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
|
10
|
-
# (group () ((
|
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
|
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
|
10
|
-
# (group () ((
|
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
|
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
|
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),
|
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),
|
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,
|
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,
|
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,
|
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,
|
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,
|
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
|
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,
|
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,
|
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,
|
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
|
34
|
+
def execute(queryable, **options, &block)
|
35
35
|
|
36
36
|
debug(options) {"Order"}
|
37
|
-
@solutions = queryable.query(operands.last,
|
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,
|
42
|
-
b_eval = op.evaluate(b,
|
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
|
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,
|
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
|
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,
|
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
|
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,
|
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
|
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,
|
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
|
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
|
33
|
+
def execute(queryable, **options, &block)
|
34
34
|
debug(options) {"Prefix"}
|
35
|
-
@solutions = queryable.query(operands.last,
|
35
|
+
@solutions = queryable.query(operands.last, depth: options[:depth].to_i + 1, **options, &block)
|
36
36
|
end
|
37
37
|
|
38
38
|
##
|