sparql 3.1.8 → 3.2.3
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 +88 -60
- data/VERSION +1 -1
- data/bin/sparql +15 -35
- data/lib/rack/sparql/conneg.rb +22 -1
- data/lib/sinatra/sparql/extensions.rb +1 -1
- data/lib/sinatra/sparql.rb +57 -12
- data/lib/sparql/algebra/expression.rb +63 -10
- data/lib/sparql/algebra/extensions.rb +110 -46
- data/lib/sparql/algebra/operator/abs.rb +22 -2
- data/lib/sparql/algebra/operator/add.rb +21 -2
- data/lib/sparql/algebra/operator/adjust.rb +69 -0
- data/lib/sparql/algebra/operator/alt.rb +26 -2
- data/lib/sparql/algebra/operator/and.rb +25 -3
- data/lib/sparql/algebra/operator/asc.rb +20 -1
- data/lib/sparql/algebra/operator/ask.rb +17 -1
- data/lib/sparql/algebra/operator/avg.rb +19 -1
- data/lib/sparql/algebra/operator/base.rb +18 -1
- data/lib/sparql/algebra/operator/bgp.rb +13 -1
- data/lib/sparql/algebra/operator/bnode.rb +33 -10
- data/lib/sparql/algebra/operator/bound.rb +22 -1
- data/lib/sparql/algebra/operator/ceil.rb +25 -2
- data/lib/sparql/algebra/operator/clear.rb +26 -2
- data/lib/sparql/algebra/operator/coalesce.rb +33 -11
- data/lib/sparql/algebra/operator/compare.rb +9 -0
- data/lib/sparql/algebra/operator/concat.rb +26 -2
- data/lib/sparql/algebra/operator/construct.rb +29 -6
- data/lib/sparql/algebra/operator/contains.rb +24 -2
- data/lib/sparql/algebra/operator/copy.rb +19 -2
- data/lib/sparql/algebra/operator/count.rb +52 -6
- data/lib/sparql/algebra/operator/create.rb +20 -2
- data/lib/sparql/algebra/operator/dataset.rb +37 -2
- data/lib/sparql/algebra/operator/datatype.rb +25 -6
- data/lib/sparql/algebra/operator/day.rb +25 -7
- data/lib/sparql/algebra/operator/delete.rb +29 -2
- data/lib/sparql/algebra/operator/delete_data.rb +23 -2
- data/lib/sparql/algebra/operator/delete_where.rb +24 -2
- data/lib/sparql/algebra/operator/desc.rb +20 -1
- data/lib/sparql/algebra/operator/describe.rb +27 -4
- data/lib/sparql/algebra/operator/distinct.rb +20 -3
- data/lib/sparql/algebra/operator/divide.rb +26 -2
- data/lib/sparql/algebra/operator/drop.rb +27 -3
- data/lib/sparql/algebra/operator/encode_for_uri.rb +22 -2
- data/lib/sparql/algebra/operator/equal.rb +12 -2
- data/lib/sparql/algebra/operator/exists.rb +28 -4
- data/lib/sparql/algebra/operator/exprlist.rb +15 -2
- data/lib/sparql/algebra/operator/extend.rb +95 -7
- data/lib/sparql/algebra/operator/filter.rb +27 -5
- data/lib/sparql/algebra/operator/floor.rb +25 -2
- data/lib/sparql/algebra/operator/function_call.rb +64 -0
- data/lib/sparql/algebra/operator/graph.rb +69 -6
- data/lib/sparql/algebra/operator/greater_than.rb +12 -3
- data/lib/sparql/algebra/operator/greater_than_or_equal.rb +12 -2
- data/lib/sparql/algebra/operator/group.rb +133 -8
- data/lib/sparql/algebra/operator/group_concat.rb +43 -7
- data/lib/sparql/algebra/operator/hours.rb +25 -7
- data/lib/sparql/algebra/operator/if.rb +20 -3
- data/lib/sparql/algebra/operator/in.rb +18 -1
- data/lib/sparql/algebra/operator/insert.rb +24 -2
- data/lib/sparql/algebra/operator/insert_data.rb +23 -2
- data/lib/sparql/algebra/operator/iri.rb +21 -4
- data/lib/sparql/algebra/operator/is_blank.rb +20 -3
- data/lib/sparql/algebra/operator/is_iri.rb +20 -3
- data/lib/sparql/algebra/operator/is_literal.rb +20 -3
- data/lib/sparql/algebra/operator/is_numeric.rb +22 -5
- data/lib/sparql/algebra/operator/is_triple.rb +32 -0
- data/lib/sparql/algebra/operator/join.rb +58 -3
- data/lib/sparql/algebra/operator/lang.rb +25 -0
- data/lib/sparql/algebra/operator/lang_matches.rb +22 -1
- data/lib/sparql/algebra/operator/lcase.rb +22 -2
- data/lib/sparql/algebra/operator/left_join.rb +44 -3
- data/lib/sparql/algebra/operator/less_than.rb +12 -3
- data/lib/sparql/algebra/operator/less_than_or_equal.rb +12 -2
- data/lib/sparql/algebra/operator/load.rb +25 -2
- data/lib/sparql/algebra/operator/max.rb +19 -1
- data/lib/sparql/algebra/operator/md5.rb +22 -5
- data/lib/sparql/algebra/operator/min.rb +21 -3
- data/lib/sparql/algebra/operator/minus.rb +65 -7
- data/lib/sparql/algebra/operator/minutes.rb +25 -7
- data/lib/sparql/algebra/operator/modify.rb +62 -5
- data/lib/sparql/algebra/operator/month.rb +25 -7
- data/lib/sparql/algebra/operator/move.rb +20 -2
- data/lib/sparql/algebra/operator/multiply.rb +26 -3
- data/lib/sparql/algebra/operator/negate.rb +23 -3
- data/lib/sparql/algebra/operator/not.rb +24 -3
- data/lib/sparql/algebra/operator/not_equal.rb +13 -0
- data/lib/sparql/algebra/operator/notexists.rb +30 -6
- data/lib/sparql/algebra/operator/notin.rb +20 -3
- data/lib/sparql/algebra/operator/notoneof.rb +21 -2
- data/lib/sparql/algebra/operator/now.rb +24 -5
- data/lib/sparql/algebra/operator/object.rb +32 -0
- data/lib/sparql/algebra/operator/or.rb +26 -3
- data/lib/sparql/algebra/operator/order.rb +64 -1
- data/lib/sparql/algebra/operator/path.rb +29 -2
- data/lib/sparql/algebra/operator/path_opt.rb +28 -65
- data/lib/sparql/algebra/operator/path_plus.rb +37 -10
- data/lib/sparql/algebra/operator/path_range.rb +178 -0
- data/lib/sparql/algebra/operator/path_star.rb +25 -4
- data/lib/sparql/algebra/operator/path_zero.rb +110 -0
- data/lib/sparql/algebra/operator/plus.rb +49 -8
- data/lib/sparql/algebra/operator/predicate.rb +32 -0
- data/lib/sparql/algebra/operator/prefix.rb +24 -3
- data/lib/sparql/algebra/operator/project.rb +111 -6
- data/lib/sparql/algebra/operator/rand.rb +30 -2
- data/lib/sparql/algebra/operator/reduced.rb +20 -3
- data/lib/sparql/algebra/operator/regex.rb +26 -18
- data/lib/sparql/algebra/operator/replace.rb +26 -6
- data/lib/sparql/algebra/operator/reverse.rb +31 -2
- data/lib/sparql/algebra/operator/round.rb +25 -2
- data/lib/sparql/algebra/operator/same_term.rb +24 -6
- data/lib/sparql/algebra/operator/sample.rb +32 -8
- data/lib/sparql/algebra/operator/seconds.rb +25 -7
- data/lib/sparql/algebra/operator/seq.rb +23 -5
- data/lib/sparql/algebra/operator/sequence.rb +14 -11
- data/lib/sparql/algebra/operator/sha1.rb +18 -1
- data/lib/sparql/algebra/operator/sha256.rb +18 -1
- data/lib/sparql/algebra/operator/sha384.rb +18 -1
- data/lib/sparql/algebra/operator/sha512.rb +18 -1
- data/lib/sparql/algebra/operator/slice.rb +27 -5
- data/lib/sparql/algebra/operator/str.rb +21 -1
- data/lib/sparql/algebra/operator/strafter.rb +25 -2
- data/lib/sparql/algebra/operator/strbefore.rb +25 -2
- data/lib/sparql/algebra/operator/strdt.rb +22 -1
- data/lib/sparql/algebra/operator/strends.rb +25 -3
- data/lib/sparql/algebra/operator/strlang.rb +24 -6
- data/lib/sparql/algebra/operator/strlen.rb +23 -2
- data/lib/sparql/algebra/operator/strstarts.rb +25 -2
- data/lib/sparql/algebra/operator/struuid.rb +29 -9
- data/lib/sparql/algebra/operator/subject.rb +32 -0
- data/lib/sparql/algebra/operator/substr.rb +23 -2
- data/lib/sparql/algebra/operator/subtract.rb +37 -7
- data/lib/sparql/algebra/operator/sum.rb +24 -6
- data/lib/sparql/algebra/operator/table.rb +85 -4
- data/lib/sparql/algebra/operator/timezone.rb +25 -7
- data/lib/sparql/algebra/operator/triple.rb +24 -0
- data/lib/sparql/algebra/operator/tz.rb +24 -7
- data/lib/sparql/algebra/operator/ucase.rb +23 -2
- data/lib/sparql/algebra/operator/union.rb +29 -6
- data/lib/sparql/algebra/operator/update.rb +46 -4
- data/lib/sparql/algebra/operator/using.rb +49 -2
- data/lib/sparql/algebra/operator/uuid.rb +27 -8
- data/lib/sparql/algebra/operator/with.rb +38 -4
- data/lib/sparql/algebra/operator/year.rb +25 -7
- data/lib/sparql/algebra/operator.rb +150 -12
- data/lib/sparql/algebra/query.rb +5 -3
- data/lib/sparql/algebra/sxp_extensions.rb +3 -3
- data/lib/sparql/algebra.rb +42 -6
- data/lib/sparql/grammar/meta.rb +1367 -267
- data/lib/sparql/grammar/parser11.rb +829 -331
- data/lib/sparql/grammar/terminals11.rb +2 -2
- data/lib/sparql/grammar.rb +6 -4
- data/lib/sparql/results.rb +3 -2
- data/lib/sparql/server.rb +93 -0
- data/lib/sparql.rb +8 -5
- metadata +57 -35
@@ -49,17 +49,20 @@ module SPARQL; module Algebra
|
|
49
49
|
autoload :Sum, 'sparql/algebra/operator/sum'
|
50
50
|
autoload :SHA1, 'sparql/algebra/operator/sha1'
|
51
51
|
autoload :SHA256, 'sparql/algebra/operator/sha256'
|
52
|
+
autoload :SHA384, 'sparql/algebra/operator/sha384'
|
52
53
|
autoload :SHA512, 'sparql/algebra/operator/sha512'
|
53
54
|
autoload :Str, 'sparql/algebra/operator/str'
|
54
55
|
autoload :Timezone, 'sparql/algebra/operator/timezone'
|
55
56
|
autoload :TZ, 'sparql/algebra/operator/tz'
|
56
57
|
autoload :Year, 'sparql/algebra/operator/year'
|
58
|
+
autoload :Triple, 'sparql/algebra/operator/triple'
|
57
59
|
autoload :IsTriple, 'sparql/algebra/operator/is_triple'
|
58
60
|
autoload :Subject, 'sparql/algebra/operator/subject'
|
59
61
|
autoload :Predicate, 'sparql/algebra/operator/predicate'
|
60
62
|
autoload :Object, 'sparql/algebra/operator/object'
|
61
63
|
|
62
64
|
# Binary operators
|
65
|
+
autoload :Adjust, 'sparql/algebra/operator/adjust'
|
63
66
|
autoload :And, 'sparql/algebra/operator/and'
|
64
67
|
autoload :Compare, 'sparql/algebra/operator/compare'
|
65
68
|
autoload :Concat, 'sparql/algebra/operator/concat'
|
@@ -94,7 +97,9 @@ module SPARQL; module Algebra
|
|
94
97
|
autoload :NotOneOf, 'sparql/algebra/operator/notoneof'
|
95
98
|
autoload :PathOpt, 'sparql/algebra/operator/path_opt'
|
96
99
|
autoload :PathPlus, 'sparql/algebra/operator/path_plus'
|
100
|
+
autoload :PathRange, 'sparql/algebra/operator/path_range'
|
97
101
|
autoload :PathStar, 'sparql/algebra/operator/path_star'
|
102
|
+
autoload :PathZero, 'sparql/algebra/operator/path_zero'
|
98
103
|
autoload :Path, 'sparql/algebra/operator/path'
|
99
104
|
autoload :Reverse, 'sparql/algebra/operator/reverse'
|
100
105
|
autoload :Seq, 'sparql/algebra/operator/seq'
|
@@ -105,6 +110,7 @@ module SPARQL; module Algebra
|
|
105
110
|
autoload :Coalesce, 'sparql/algebra/operator/coalesce'
|
106
111
|
autoload :Desc, 'sparql/algebra/operator/desc'
|
107
112
|
autoload :Exprlist, 'sparql/algebra/operator/exprlist'
|
113
|
+
autoload :FunctionCall, 'sparql/algebra/operator/function_call'
|
108
114
|
autoload :GroupConcat, 'sparql/algebra/operator/group_concat'
|
109
115
|
autoload :In, 'sparql/algebra/operator/in'
|
110
116
|
autoload :NotIn, 'sparql/algebra/operator/notin'
|
@@ -171,7 +177,7 @@ module SPARQL; module Algebra
|
|
171
177
|
when :> then GreaterThan
|
172
178
|
when :>= then GreaterThanOrEqual
|
173
179
|
when :abs then Abs
|
174
|
-
when :
|
180
|
+
when :adjust then Adjust
|
175
181
|
when :alt then Alt
|
176
182
|
when :and, :'&&' then And
|
177
183
|
when :avg then Avg
|
@@ -204,7 +210,6 @@ module SPARQL; module Algebra
|
|
204
210
|
when :md5 then MD5
|
205
211
|
when :max then Max
|
206
212
|
when :min then Min
|
207
|
-
when :minus then Minus
|
208
213
|
when :minutes then Minutes
|
209
214
|
when :month then Month
|
210
215
|
when :multiply then Multiply
|
@@ -215,9 +220,11 @@ module SPARQL; module Algebra
|
|
215
220
|
when :now then Now
|
216
221
|
when :or, :'||' then Or
|
217
222
|
when :path then Path
|
223
|
+
when :path0 then PathZero
|
218
224
|
when :path? then PathOpt
|
219
|
-
when :"path*" then PathStar
|
220
225
|
when :"path+" then PathPlus
|
226
|
+
when :"path*" then PathStar
|
227
|
+
when :pathrange then PathRange
|
221
228
|
when :plus then Plus
|
222
229
|
when :rand then Rand
|
223
230
|
when :regex then Regex
|
@@ -231,6 +238,7 @@ module SPARQL; module Algebra
|
|
231
238
|
when :sequence then Sequence
|
232
239
|
when :sha1 then SHA1
|
233
240
|
when :sha256 then SHA256
|
241
|
+
when :sha384 then SHA384
|
234
242
|
when :sha512 then SHA512
|
235
243
|
when :str then Str
|
236
244
|
when :strafter then StrAfter
|
@@ -254,6 +262,7 @@ module SPARQL; module Algebra
|
|
254
262
|
when :asc then Asc
|
255
263
|
when :desc then Desc
|
256
264
|
when :exprlist then Exprlist
|
265
|
+
when :function_call then FunctionCall
|
257
266
|
|
258
267
|
# Datasets
|
259
268
|
when :dataset then Dataset
|
@@ -278,7 +287,6 @@ module SPARQL; module Algebra
|
|
278
287
|
when :reduced then Reduced
|
279
288
|
when :slice then Slice
|
280
289
|
when :table then Table
|
281
|
-
when :triple then RDF::Query::Pattern
|
282
290
|
when :union then Union
|
283
291
|
|
284
292
|
# Update forms
|
@@ -302,6 +310,8 @@ module SPARQL; module Algebra
|
|
302
310
|
# RDF-star
|
303
311
|
when :istriple then IsTriple
|
304
312
|
when :triple then Triple
|
313
|
+
when :qtriple then RDF::Query::Pattern
|
314
|
+
when :quad then RDF::Query::Pattern
|
305
315
|
when :subject then Subject
|
306
316
|
when :predicate then Predicate
|
307
317
|
when :object then Object
|
@@ -333,6 +343,119 @@ module SPARQL; module Algebra
|
|
333
343
|
self.const_get(:ARITY)
|
334
344
|
end
|
335
345
|
|
346
|
+
##
|
347
|
+
# Generate a top-level Grammar, using collected options
|
348
|
+
#
|
349
|
+
# @param [String] content
|
350
|
+
# @param [Operator] datasets ([])
|
351
|
+
# @param [Operator] distinct (false)
|
352
|
+
# @param [Hash{String => Operator}] extensions
|
353
|
+
# Variable bindings
|
354
|
+
# @param [Array<Operator>] filter_ops ([])
|
355
|
+
# Filter Operations
|
356
|
+
# @param [Integer] limit (nil)
|
357
|
+
# @param [Array<Operator>] group_ops ([])
|
358
|
+
# @param [Array<Operator>] having_ops ([])
|
359
|
+
# @param [Integer] offset (nil)
|
360
|
+
# @param [Array<Operator>] order_ops ([])
|
361
|
+
# Order Operations
|
362
|
+
# @param [Array<Symbol,Operator>] project (%i(*))
|
363
|
+
# Terms to project
|
364
|
+
# @param [Operator] reduced (false)
|
365
|
+
# @param [Operator] values_clause (nil)
|
366
|
+
# Top-level Values clause
|
367
|
+
# @param [Operator] where_clause (true)
|
368
|
+
# Emit 'WHERE' before GroupGraphPattern
|
369
|
+
# @param [Hash{Symbol => Object}] options
|
370
|
+
# @return [String]
|
371
|
+
def self.to_sparql(content,
|
372
|
+
datasets: [],
|
373
|
+
distinct: false,
|
374
|
+
extensions: {},
|
375
|
+
filter_ops: [],
|
376
|
+
group_ops: [],
|
377
|
+
having_ops: [],
|
378
|
+
limit: nil,
|
379
|
+
offset: nil,
|
380
|
+
order_ops: [],
|
381
|
+
project: %i(*),
|
382
|
+
reduced: false,
|
383
|
+
values_clause: nil,
|
384
|
+
where_clause: true,
|
385
|
+
**options)
|
386
|
+
str = ""
|
387
|
+
|
388
|
+
# Projections
|
389
|
+
if project
|
390
|
+
str << "SELECT "
|
391
|
+
str << "DISTINCT " if distinct
|
392
|
+
str << "REDUCED " if reduced
|
393
|
+
|
394
|
+
str << project.map do |p|
|
395
|
+
if expr = extensions.delete(p.to_s)
|
396
|
+
v = expr.to_sparql(**options)
|
397
|
+
pp = RDF::Query::Variable.new(p).to_sparql(**options)
|
398
|
+
# Replace projected variables with their extension, if any
|
399
|
+
'(' + v + ' AS ' + pp + ')'
|
400
|
+
else
|
401
|
+
p.to_sparql(**options)
|
402
|
+
end
|
403
|
+
end.join(" ") + "\n"
|
404
|
+
end
|
405
|
+
|
406
|
+
# DatasetClause
|
407
|
+
datasets.each do |ds|
|
408
|
+
str << "FROM #{ds.to_sparql(**options)}\n"
|
409
|
+
end
|
410
|
+
|
411
|
+
# Bind
|
412
|
+
extensions.each do |as, expression|
|
413
|
+
v = expression.to_sparql(**options)
|
414
|
+
pp = RDF::Query::Variable.new(as).to_sparql(**options)
|
415
|
+
content << "\nBIND (" << v << " AS " << pp << ") ."
|
416
|
+
end
|
417
|
+
|
418
|
+
# Filter
|
419
|
+
filter_ops.each do |f|
|
420
|
+
content << "\nFILTER (#{f.to_sparql(**options)}) ."
|
421
|
+
end
|
422
|
+
|
423
|
+
# WhereClause / GroupGraphPattern
|
424
|
+
str << (where_clause ? "WHERE {\n#{content}\n}\n" : "{\n#{content}\n}\n")
|
425
|
+
|
426
|
+
##
|
427
|
+
# SolutionModifier
|
428
|
+
#
|
429
|
+
# GroupClause
|
430
|
+
unless group_ops.empty?
|
431
|
+
ops = group_ops.map do |o|
|
432
|
+
# Replace projected variables with their extension, if any
|
433
|
+
o.is_a?(Array) ?
|
434
|
+
"(" + [o.last, :AS, o.first].to_sparql(**options) + ")" :
|
435
|
+
o.to_sparql(**options)
|
436
|
+
end
|
437
|
+
str << "GROUP BY #{ops.join(' ')}\n"
|
438
|
+
end
|
439
|
+
|
440
|
+
# HavingClause
|
441
|
+
unless having_ops.empty?
|
442
|
+
str << "HAVING #{having_ops.to_sparql(**options)}"
|
443
|
+
end
|
444
|
+
|
445
|
+
# OrderClause
|
446
|
+
unless order_ops.empty?
|
447
|
+
str << "ORDER BY #{order_ops.to_sparql(**options)}\n"
|
448
|
+
end
|
449
|
+
|
450
|
+
# LimitOffsetClauses
|
451
|
+
str << "OFFSET #{offset}\n" unless offset.nil?
|
452
|
+
str << "LIMIT #{limit}\n" unless limit.nil?
|
453
|
+
|
454
|
+
# Values Clause
|
455
|
+
str << values_clause.to_sparql(top_level: false, **options) if values_clause
|
456
|
+
str
|
457
|
+
end
|
458
|
+
|
336
459
|
ARITY = -1 # variable arity
|
337
460
|
|
338
461
|
##
|
@@ -558,12 +681,8 @@ module SPARQL; module Algebra
|
|
558
681
|
# @return [SPARQL::Algebra::Expression] `self`
|
559
682
|
def rewrite(&block)
|
560
683
|
@operands = @operands.map do |op|
|
561
|
-
|
562
|
-
|
563
|
-
# Not re-written, rewrite
|
564
|
-
new_op = op.respond_to?(:rewrite) ? op.rewrite(&block) : op
|
565
|
-
end
|
566
|
-
new_op
|
684
|
+
new_op = block.call(op)
|
685
|
+
new_op.respond_to?(:rewrite) ? new_op.rewrite(&block) : new_op
|
567
686
|
end
|
568
687
|
self
|
569
688
|
end
|
@@ -581,9 +700,19 @@ module SPARQL; module Algebra
|
|
581
700
|
##
|
582
701
|
# Returns an S-Expression (SXP) representation of this operator
|
583
702
|
#
|
703
|
+
# @param [Hash{Symbol => RDF::URI}] prefixes (nil)
|
704
|
+
# @param [RDF::URI] base_uri (nil)
|
584
705
|
# @return [String]
|
585
|
-
def to_sxp
|
586
|
-
to_sxp_bin.to_sxp
|
706
|
+
def to_sxp(prefixes: nil, base_uri: nil)
|
707
|
+
to_sxp_bin.to_sxp(prefixes: prefixes, base_uri: base_uri)
|
708
|
+
end
|
709
|
+
|
710
|
+
##
|
711
|
+
# Returns a partial SPARQL grammar for the operator.
|
712
|
+
#
|
713
|
+
# @return [String]
|
714
|
+
def to_sparql(**options)
|
715
|
+
raise NotImplementedError, "#{self.class}#to_sparql(#{operands.map(&:class).join(', ')})"
|
587
716
|
end
|
588
717
|
|
589
718
|
##
|
@@ -672,6 +801,15 @@ module SPARQL; module Algebra
|
|
672
801
|
operands.each {|op| op.validate! if op.respond_to?(:validate!)}
|
673
802
|
self
|
674
803
|
end
|
804
|
+
|
805
|
+
##
|
806
|
+
# The variables used in this query.
|
807
|
+
#
|
808
|
+
# @return [Hash{Symbol => RDF::Query::Variable}]
|
809
|
+
def variables
|
810
|
+
operands.inject({}) {|hash, o| o.respond_to?(:variables) ? hash.merge(o.variables) : hash}
|
811
|
+
end
|
812
|
+
|
675
813
|
protected
|
676
814
|
|
677
815
|
##
|
data/lib/sparql/algebra/query.rb
CHANGED
@@ -16,13 +16,13 @@ module SPARQL; module Algebra
|
|
16
16
|
@operands.unshift(query)
|
17
17
|
self
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
##
|
21
21
|
# The variables used in this query.
|
22
22
|
#
|
23
23
|
# @return [Hash{Symbol => RDF::Query::Variable}]
|
24
24
|
def variables
|
25
|
-
operands.inject({}) {|hash, o| o.
|
25
|
+
operands.inject({}) {|hash, o| o.respond_to?(:variables) ? hash.merge(o.variables) : hash}
|
26
26
|
end
|
27
27
|
|
28
28
|
##
|
@@ -38,7 +38,9 @@ module SPARQL; module Algebra
|
|
38
38
|
# the graph or repository to query
|
39
39
|
# @param [Hash{Symbol => Object}] options
|
40
40
|
# any additional keyword options
|
41
|
-
# @option options
|
41
|
+
# @option options [RDF::Query::Solution] :bindings
|
42
|
+
# a query solution containing zero or more variable bindings
|
43
|
+
# @option options [Boolean] :debug
|
42
44
|
# Query execution debugging
|
43
45
|
# @option options [RDF::Term, RDF::Query::Variable] :graph_name
|
44
46
|
# @yield [solution]
|
@@ -5,7 +5,7 @@ class NilClass
|
|
5
5
|
# Returns the SXP representation of this object.
|
6
6
|
#
|
7
7
|
# @return [String]
|
8
|
-
def to_sxp
|
8
|
+
def to_sxp(**options)
|
9
9
|
RDF.nil.to_s
|
10
10
|
end
|
11
11
|
end
|
@@ -17,7 +17,7 @@ class FalseClass
|
|
17
17
|
# Returns the SXP representation of this object.
|
18
18
|
#
|
19
19
|
# @return [String]
|
20
|
-
def to_sxp
|
20
|
+
def to_sxp(**options)
|
21
21
|
'false'
|
22
22
|
end
|
23
23
|
end
|
@@ -29,7 +29,7 @@ class TrueClass
|
|
29
29
|
# Returns the SXP representation of this object.
|
30
30
|
#
|
31
31
|
# @return [String]
|
32
|
-
def to_sxp
|
32
|
+
def to_sxp(**options)
|
33
33
|
'true'
|
34
34
|
end
|
35
35
|
end
|
data/lib/sparql/algebra.rb
CHANGED
@@ -19,6 +19,24 @@ module SPARQL
|
|
19
19
|
#
|
20
20
|
# {RDF::Query} and {RDF::Query::Pattern} are used as primitives for `bgp` and `triple` expressions.
|
21
21
|
#
|
22
|
+
# # Background
|
23
|
+
#
|
24
|
+
# The SPARQL Algebra, and the S-Expressions used to represent it, are based on those of [Jena](https://jena.apache.org/documentation/notes/sse.html). Generally, an S-Expression generated by this Gem can be used as an SSE input to Jena, or an SSE output from Jena can also be used as input to this Gem.
|
25
|
+
#
|
26
|
+
# S-Expressions generally follow a standardized nesting resulting from parsing the original SPARQL Grammar. The individual operators map to SPARQL Grammar productions, and in most cases, the SPARQL Grammar can be reproduced by turning the S-Expression back into SPARQL (see {SPARQL::Algebra::Operator#to_sparql}). The order of operations will typically be as follows:
|
27
|
+
#
|
28
|
+
# * {SPARQL::Algebra::Operator::Base}
|
29
|
+
# * {SPARQL::Algebra::Operator::Prefix}
|
30
|
+
# * {SPARQL::Algebra::Operator::Slice}
|
31
|
+
# * {SPARQL::Algebra::Operator::Distinct}
|
32
|
+
# * {SPARQL::Algebra::Operator::Reduced}
|
33
|
+
# * {SPARQL::Algebra::Operator::Project}
|
34
|
+
# * {SPARQL::Algebra::Operator::Order}
|
35
|
+
# * {SPARQL::Algebra::Operator::Filter}
|
36
|
+
# * {SPARQL::Algebra::Operator::Extend}
|
37
|
+
# * {SPARQL::Algebra::Operator::Group}
|
38
|
+
# * {SPARQL::Algebra::Query} (many classes implement Query)
|
39
|
+
#
|
22
40
|
# # Queries
|
23
41
|
#
|
24
42
|
# require 'sparql/algebra'
|
@@ -215,7 +233,7 @@ module SPARQL
|
|
215
233
|
# scarcity.
|
216
234
|
#
|
217
235
|
# [memoization]: http://en.wikipedia.org/wiki/Memoization
|
218
|
-
# [RDF::Util::Cache]:
|
236
|
+
# [RDF::Util::Cache]: https://ruby-rdf.github.io/rdf/RDF/Util/Cache
|
219
237
|
#
|
220
238
|
# ## Documentation
|
221
239
|
#
|
@@ -228,12 +246,15 @@ module SPARQL
|
|
228
246
|
# * {SPARQL::Algebra::Operator}
|
229
247
|
# * {SPARQL::Algebra::Operator::Abs}
|
230
248
|
# * {SPARQL::Algebra::Operator::Add}
|
249
|
+
# * {SPARQL::Algebra::Operator::Adjust}
|
250
|
+
# * {SPARQL::Algebra::Operator::Alt}
|
231
251
|
# * {SPARQL::Algebra::Operator::And}
|
232
252
|
# * {SPARQL::Algebra::Operator::Asc}
|
233
253
|
# * {SPARQL::Algebra::Operator::Ask}
|
234
254
|
# * {SPARQL::Algebra::Operator::Avg}
|
235
255
|
# * {SPARQL::Algebra::Operator::Base}
|
236
256
|
# * {SPARQL::Algebra::Operator::BGP}
|
257
|
+
# * {SPARQL::Algebra::Operator::Bnode}
|
237
258
|
# * {SPARQL::Algebra::Operator::Bound}
|
238
259
|
# * {SPARQL::Algebra::Operator::Ceil}
|
239
260
|
# * {SPARQL::Algebra::Operator::Clear}
|
@@ -248,9 +269,9 @@ module SPARQL
|
|
248
269
|
# * {SPARQL::Algebra::Operator::Dataset}
|
249
270
|
# * {SPARQL::Algebra::Operator::Datatype}
|
250
271
|
# * {SPARQL::Algebra::Operator::Day}
|
251
|
-
# * {SPARQL::Algebra::Operator::Delete}
|
252
272
|
# * {SPARQL::Algebra::Operator::DeleteData}
|
253
273
|
# * {SPARQL::Algebra::Operator::DeleteWhere}
|
274
|
+
# * {SPARQL::Algebra::Operator::Delete}
|
254
275
|
# * {SPARQL::Algebra::Operator::Desc}
|
255
276
|
# * {SPARQL::Algebra::Operator::Describe}
|
256
277
|
# * {SPARQL::Algebra::Operator::Distinct}
|
@@ -258,10 +279,12 @@ module SPARQL
|
|
258
279
|
# * {SPARQL::Algebra::Operator::Drop}
|
259
280
|
# * {SPARQL::Algebra::Operator::EncodeForURI}
|
260
281
|
# * {SPARQL::Algebra::Operator::Equal}
|
282
|
+
# * {SPARQL::Algebra::Operator::Exists}
|
261
283
|
# * {SPARQL::Algebra::Operator::Exprlist}
|
262
284
|
# * {SPARQL::Algebra::Operator::Extend}
|
263
285
|
# * {SPARQL::Algebra::Operator::Filter}
|
264
286
|
# * {SPARQL::Algebra::Operator::Floor}
|
287
|
+
# * {SPARQL::Algebra::Operator::FunctionCall}
|
265
288
|
# * {SPARQL::Algebra::Operator::Graph}
|
266
289
|
# * {SPARQL::Algebra::Operator::GreaterThan}
|
267
290
|
# * {SPARQL::Algebra::Operator::GreaterThanOrEqual}
|
@@ -277,9 +300,11 @@ module SPARQL
|
|
277
300
|
# * {SPARQL::Algebra::Operator::IsIRI}
|
278
301
|
# * {SPARQL::Algebra::Operator::IsLiteral}
|
279
302
|
# * {SPARQL::Algebra::Operator::IsNumeric}
|
303
|
+
# * {SPARQL::Algebra::Operator::IsTriple}
|
280
304
|
# * {SPARQL::Algebra::Operator::Join}
|
281
305
|
# * {SPARQL::Algebra::Operator::Lang}
|
282
306
|
# * {SPARQL::Algebra::Operator::LangMatches}
|
307
|
+
# * {SPARQL::Algebra::Operator::LCase}
|
283
308
|
# * {SPARQL::Algebra::Operator::LeftJoin}
|
284
309
|
# * {SPARQL::Algebra::Operator::LessThan}
|
285
310
|
# * {SPARQL::Algebra::Operator::LessThanOrEqual}
|
@@ -297,20 +322,32 @@ module SPARQL
|
|
297
322
|
# * {SPARQL::Algebra::Operator::NotEqual}
|
298
323
|
# * {SPARQL::Algebra::Operator::NotExists}
|
299
324
|
# * {SPARQL::Algebra::Operator::NotIn}
|
325
|
+
# * {SPARQL::Algebra::Operator::NotOneOf}
|
300
326
|
# * {SPARQL::Algebra::Operator::Now}
|
327
|
+
# * {SPARQL::Algebra::Operator::Object}
|
301
328
|
# * {SPARQL::Algebra::Operator::Or}
|
302
329
|
# * {SPARQL::Algebra::Operator::Order}
|
330
|
+
# * {SPARQL::Algebra::Operator::Path}
|
331
|
+
# * {SPARQL::Algebra::Operator::PathOpt}
|
332
|
+
# * {SPARQL::Algebra::Operator::PathPlus}
|
333
|
+
# * {SPARQL::Algebra::Operator::PathRange}
|
334
|
+
# * {SPARQL::Algebra::Operator::PathStar}
|
335
|
+
# * {SPARQL::Algebra::Operator::PathZero}
|
303
336
|
# * {SPARQL::Algebra::Operator::Plus}
|
337
|
+
# * {SPARQL::Algebra::Operator::Predicate}
|
304
338
|
# * {SPARQL::Algebra::Operator::Prefix}
|
305
339
|
# * {SPARQL::Algebra::Operator::Project}
|
306
340
|
# * {SPARQL::Algebra::Operator::Rand}
|
307
341
|
# * {SPARQL::Algebra::Operator::Reduced}
|
308
342
|
# * {SPARQL::Algebra::Operator::Regex}
|
309
343
|
# * {SPARQL::Algebra::Operator::Replace}
|
344
|
+
# * {SPARQL::Algebra::Operator::Reverse}
|
310
345
|
# * {SPARQL::Algebra::Operator::Round}
|
311
346
|
# * {SPARQL::Algebra::Operator::SameTerm}
|
312
347
|
# * {SPARQL::Algebra::Operator::Sample}
|
313
348
|
# * {SPARQL::Algebra::Operator::Seconds}
|
349
|
+
# * {SPARQL::Algebra::Operator::Seq}
|
350
|
+
# * {SPARQL::Algebra::Operator::Sequence}
|
314
351
|
# * {SPARQL::Algebra::Operator::SHA1}
|
315
352
|
# * {SPARQL::Algebra::Operator::SHA256}
|
316
353
|
# * {SPARQL::Algebra::Operator::SHA384}
|
@@ -330,6 +367,7 @@ module SPARQL
|
|
330
367
|
# * {SPARQL::Algebra::Operator::Sum}
|
331
368
|
# * {SPARQL::Algebra::Operator::Table}
|
332
369
|
# * {SPARQL::Algebra::Operator::Timezone}
|
370
|
+
# * {SPARQL::Algebra::Operator::Triple}
|
333
371
|
# * {SPARQL::Algebra::Operator::TZ}
|
334
372
|
# * {SPARQL::Algebra::Operator::Ucase}
|
335
373
|
# * {SPARQL::Algebra::Operator::Union}
|
@@ -339,11 +377,9 @@ module SPARQL
|
|
339
377
|
# * {SPARQL::Algebra::Operator::With}
|
340
378
|
# * {SPARQL::Algebra::Operator::Year}
|
341
379
|
#
|
342
|
-
# TODO
|
343
|
-
# ====
|
344
|
-
# * Operator#optimize needs to be completed and tested.
|
345
380
|
#
|
346
381
|
# @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
382
|
+
# @see https://jena.apache.org/documentation/notes/sse.html
|
347
383
|
module Algebra
|
348
384
|
include RDF
|
349
385
|
|
@@ -419,7 +455,7 @@ module SPARQL
|
|
419
455
|
#
|
420
456
|
# @param [Symbol, #to_sym] name
|
421
457
|
# @return [Variable]
|
422
|
-
# @see
|
458
|
+
# @see https://ruby-rdf.github.io/rdf/RDF/Query/Variable
|
423
459
|
def Variable(name)
|
424
460
|
Variable.new(name)
|
425
461
|
end
|