sparql 1.0.8 → 1.1.0p0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +14 -6
- data/README.md +57 -25
- data/VERSION +1 -1
- data/lib/sinatra/sparql.rb +5 -3
- data/lib/sparql/algebra/aggregate.rb +67 -0
- data/lib/sparql/algebra/evaluatable.rb +49 -4
- data/lib/sparql/algebra/expression.rb +6 -4
- data/lib/sparql/algebra/extensions.rb +99 -9
- data/lib/sparql/algebra/operator/and.rb +7 -4
- data/lib/sparql/algebra/operator/asc.rb +6 -3
- data/lib/sparql/algebra/operator/avg.rb +36 -0
- data/lib/sparql/algebra/operator/bnode.rb +5 -4
- data/lib/sparql/algebra/operator/bound.rb +5 -2
- data/lib/sparql/algebra/operator/coalesce.rb +6 -3
- data/lib/sparql/algebra/operator/concat.rb +6 -3
- data/lib/sparql/algebra/operator/count.rb +30 -0
- data/lib/sparql/algebra/operator/exists.rb +39 -0
- data/lib/sparql/algebra/operator/exprlist.rb +6 -3
- data/lib/sparql/algebra/operator/extend.rb +3 -1
- data/lib/sparql/algebra/operator/filter.rb +2 -1
- data/lib/sparql/algebra/operator/group.rb +101 -0
- data/lib/sparql/algebra/operator/group_concat.rb +55 -0
- data/lib/sparql/algebra/operator/if.rb +5 -5
- data/lib/sparql/algebra/operator/in.rb +7 -4
- data/lib/sparql/algebra/operator/max.rb +38 -0
- data/lib/sparql/algebra/operator/min.rb +38 -0
- data/lib/sparql/algebra/operator/minus.rb +51 -16
- data/lib/sparql/algebra/operator/negate.rb +31 -0
- data/lib/sparql/algebra/operator/notexists.rb +37 -0
- data/lib/sparql/algebra/operator/notin.rb +7 -4
- data/lib/sparql/algebra/operator/or.rb +7 -4
- data/lib/sparql/algebra/operator/order.rb +2 -2
- data/lib/sparql/algebra/operator/sample.rb +32 -0
- data/lib/sparql/algebra/operator/strlang.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +36 -0
- data/lib/sparql/algebra/operator/table.rb +44 -0
- data/lib/sparql/algebra/operator.rb +37 -2
- data/lib/sparql/algebra.rb +1 -0
- data/lib/sparql/grammar/meta.rb +1143 -696
- data/lib/sparql/grammar/parser11.rb +178 -32
- data/lib/sparql/grammar/terminals11.rb +2 -2
- data/lib/sparql/grammar.rb +0 -2
- data/lib/sparql/results.rb +55 -0
- metadata +78 -81
@@ -21,7 +21,7 @@ module SPARQL; module Algebra
|
|
21
21
|
#
|
22
22
|
# @param [RDF::Literal] value
|
23
23
|
# a literal
|
24
|
-
# @param [RDF::Literal]
|
24
|
+
# @param [RDF::Literal] langTag
|
25
25
|
# datatype
|
26
26
|
# @return [RDF::Literal] a datatyped literal
|
27
27
|
# @see http://www.w3.org/TR/sparql11-query/#func-strlang
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module SPARQL; module Algebra
|
2
|
+
class Operator
|
3
|
+
##
|
4
|
+
# The SPARQL `sum` set function.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# (prefix ((: <http://www.example.org/>))
|
8
|
+
# (project (?sum)
|
9
|
+
# (extend ((?sum ?.0))
|
10
|
+
# (group () ((?.0 (sum ?o)))
|
11
|
+
# (bgp (triple ?s :dec ?o))))))
|
12
|
+
#
|
13
|
+
# @see http://www.w3.org/TR/sparql11-query/#defn_aggSum
|
14
|
+
class Sum < Operator::Unary
|
15
|
+
include Aggregate
|
16
|
+
|
17
|
+
NAME = :sum
|
18
|
+
|
19
|
+
##
|
20
|
+
# Sum is a SPARQL set function that will return the numeric value obtained by summing the values within the aggregate group. Type promotion happens as per the op:numeric-add function, applied transitively, (see definition below) so the value of SUM(?x), in an aggregate group where ?x has values 1 (integer), 2.0e0 (float), and 3.0 (decimal) will be 6.0 (float).
|
21
|
+
#
|
22
|
+
# @param [Enumerable<Array<RDF::Term>>] enum
|
23
|
+
# enum of evaluated operand
|
24
|
+
# @return [RDF::Literal::Numeric] The sum of the terms
|
25
|
+
def apply(enum)
|
26
|
+
if enum.empty?
|
27
|
+
RDF::Literal(0)
|
28
|
+
elsif enum.flatten.all? {|n| n.is_a?(RDF::Literal::Numeric)}
|
29
|
+
enum.flatten.reduce(:+)
|
30
|
+
else
|
31
|
+
raise TypeError, "Averaging non-numeric types: #{enum.flatten}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end # Sum
|
35
|
+
end # Operator
|
36
|
+
end; end # SPARQL::Algebra
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module SPARQL; module Algebra
|
2
|
+
class Operator
|
3
|
+
##
|
4
|
+
# The SPARQL Table operator.
|
5
|
+
#
|
6
|
+
# This is used to provide inline values. Each row becomes
|
7
|
+
# a solution.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# (table (vars ?book ?title)
|
11
|
+
# (row (?title "SPARQL Tutorial"))
|
12
|
+
# (row (?book :book2)))
|
13
|
+
#
|
14
|
+
# @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#inline-data
|
15
|
+
class Table < Operator
|
16
|
+
include Query
|
17
|
+
|
18
|
+
NAME = [:table]
|
19
|
+
|
20
|
+
##
|
21
|
+
# Returns solutions for each row
|
22
|
+
#
|
23
|
+
# @param [RDF::Queryable] queryable
|
24
|
+
# the graph or repository to query
|
25
|
+
# @param [Hash{Symbol => Object}] options
|
26
|
+
# any additional keyword options
|
27
|
+
# @return [RDF::Query::Solutions]
|
28
|
+
# the resulting solution sequence
|
29
|
+
# @see http://www.w3.org/TR/rdf-sparql-query/#sparqlAlgebra
|
30
|
+
def execute(queryable, options = {})
|
31
|
+
@solutions = RDF::Query::Solutions.new
|
32
|
+
operands[1..-1].each do |row|
|
33
|
+
next unless row.is_a?(Array)
|
34
|
+
bindings = row[1..-1].inject({}) do |memo, (var, value)|
|
35
|
+
memo[var.to_sym] = value
|
36
|
+
memo
|
37
|
+
end
|
38
|
+
@solutions << RDF::Query::Solution.new(bindings)
|
39
|
+
end
|
40
|
+
@solutions
|
41
|
+
end
|
42
|
+
end # Table
|
43
|
+
end # Operator
|
44
|
+
end; end # SPARQL::Algebra
|
@@ -14,12 +14,15 @@ module SPARQL; module Algebra
|
|
14
14
|
|
15
15
|
# Unary operators
|
16
16
|
autoload :Abs, 'sparql/algebra/operator/abs'
|
17
|
+
autoload :Avg, 'sparql/algebra/operator/avg'
|
17
18
|
autoload :BNode, 'sparql/algebra/operator/bnode'
|
18
19
|
autoload :Bound, 'sparql/algebra/operator/bound'
|
19
20
|
autoload :Ceil, 'sparql/algebra/operator/ceil'
|
21
|
+
autoload :Count, 'sparql/algebra/operator/count'
|
20
22
|
autoload :Datatype, 'sparql/algebra/operator/datatype'
|
21
23
|
autoload :Day, 'sparql/algebra/operator/day'
|
22
24
|
autoload :EncodeForURI, 'sparql/algebra/operator/encode_for_uri'
|
25
|
+
autoload :Exists, 'sparql/algebra/operator/exists'
|
23
26
|
autoload :Floor, 'sparql/algebra/operator/floor'
|
24
27
|
autoload :Hours, 'sparql/algebra/operator/hours'
|
25
28
|
autoload :IsBlank, 'sparql/algebra/operator/is_blank'
|
@@ -30,14 +33,20 @@ module SPARQL; module Algebra
|
|
30
33
|
autoload :IRI, 'sparql/algebra/operator/iri'
|
31
34
|
autoload :Lang, 'sparql/algebra/operator/lang'
|
32
35
|
autoload :LCase, 'sparql/algebra/operator/lcase'
|
36
|
+
autoload :Max, 'sparql/algebra/operator/max'
|
33
37
|
autoload :MD5, 'sparql/algebra/operator/md5'
|
38
|
+
autoload :Min, 'sparql/algebra/operator/min'
|
34
39
|
autoload :Minus, 'sparql/algebra/operator/minus'
|
35
40
|
autoload :Minutes, 'sparql/algebra/operator/minutes'
|
36
41
|
autoload :Month, 'sparql/algebra/operator/month'
|
42
|
+
autoload :Negate, 'sparql/algebra/operator/negate'
|
37
43
|
autoload :Not, 'sparql/algebra/operator/not'
|
44
|
+
autoload :NotExists, 'sparql/algebra/operator/notexists'
|
38
45
|
autoload :Plus, 'sparql/algebra/operator/plus'
|
39
46
|
autoload :Round, 'sparql/algebra/operator/round'
|
47
|
+
autoload :Sample, 'sparql/algebra/operator/sample'
|
40
48
|
autoload :Seconds, 'sparql/algebra/operator/seconds'
|
49
|
+
autoload :Sum, 'sparql/algebra/operator/sum'
|
41
50
|
autoload :SHA1, 'sparql/algebra/operator/sha1'
|
42
51
|
autoload :SHA256, 'sparql/algebra/operator/sha256'
|
43
52
|
autoload :SHA512, 'sparql/algebra/operator/sha512'
|
@@ -82,6 +91,7 @@ module SPARQL; module Algebra
|
|
82
91
|
autoload :Coalesce, 'sparql/algebra/operator/coalesce'
|
83
92
|
autoload :Desc, 'sparql/algebra/operator/desc'
|
84
93
|
autoload :Exprlist, 'sparql/algebra/operator/exprlist'
|
94
|
+
autoload :GroupConcat, 'sparql/algebra/operator/group_concat'
|
85
95
|
autoload :In, 'sparql/algebra/operator/in'
|
86
96
|
autoload :NotIn, 'sparql/algebra/operator/notin'
|
87
97
|
|
@@ -96,13 +106,16 @@ module SPARQL; module Algebra
|
|
96
106
|
autoload :Extend, 'sparql/algebra/operator/extend'
|
97
107
|
autoload :Filter, 'sparql/algebra/operator/filter'
|
98
108
|
autoload :Graph, 'sparql/algebra/operator/graph'
|
109
|
+
autoload :Group, 'sparql/algebra/operator/group'
|
99
110
|
autoload :Join, 'sparql/algebra/operator/join'
|
100
111
|
autoload :LeftJoin, 'sparql/algebra/operator/left_join'
|
112
|
+
autoload :Minus, 'sparql/algebra/operator/minus'
|
101
113
|
autoload :Order, 'sparql/algebra/operator/order'
|
102
114
|
autoload :Prefix, 'sparql/algebra/operator/prefix'
|
103
115
|
autoload :Project, 'sparql/algebra/operator/project'
|
104
116
|
autoload :Reduced, 'sparql/algebra/operator/reduced'
|
105
117
|
autoload :Slice, 'sparql/algebra/operator/slice'
|
118
|
+
autoload :Table, 'sparql/algebra/operator/table'
|
106
119
|
autoload :Union, 'sparql/algebra/operator/union'
|
107
120
|
|
108
121
|
##
|
@@ -119,7 +132,7 @@ module SPARQL; module Algebra
|
|
119
132
|
when :'=' then Equal
|
120
133
|
when :* then Multiply
|
121
134
|
when :+ then arity.eql?(1) ? Plus : Add
|
122
|
-
when :- then arity.eql?(1) ?
|
135
|
+
when :- then arity.eql?(1) ? Negate : Subtract
|
123
136
|
when :< then LessThan
|
124
137
|
when :<= then LessThanOrEqual
|
125
138
|
when :<=> then Compare # non-standard
|
@@ -128,17 +141,21 @@ module SPARQL; module Algebra
|
|
128
141
|
when :abs then Abs
|
129
142
|
when :add then Add
|
130
143
|
when :and, :'&&' then And
|
144
|
+
when :avg then Avg
|
131
145
|
when :bnode then BNode
|
132
146
|
when :bound then Bound
|
133
147
|
when :coalesce then Coalesce
|
134
148
|
when :ceil then Ceil
|
135
149
|
when :concat then Concat
|
136
150
|
when :contains then Contains
|
151
|
+
when :count then Count
|
137
152
|
when :datatype then Datatype
|
138
153
|
when :day then Day
|
139
154
|
when :encode_for_uri then EncodeForURI
|
140
155
|
when :divide then Divide
|
156
|
+
when :exists then Exists
|
141
157
|
when :floor then Floor
|
158
|
+
when :group_concat then GroupConcat
|
142
159
|
when :hours then Hours
|
143
160
|
when :if then If
|
144
161
|
when :in then In
|
@@ -152,11 +169,14 @@ module SPARQL; module Algebra
|
|
152
169
|
when :langmatches then LangMatches
|
153
170
|
when :lcase then LCase
|
154
171
|
when :md5 then MD5
|
172
|
+
when :max then Max
|
173
|
+
when :min then Min
|
155
174
|
when :minus then Minus
|
156
175
|
when :minutes then Minutes
|
157
176
|
when :month then Month
|
158
177
|
when :multiply then Multiply
|
159
178
|
when :not, :'!' then Not
|
179
|
+
when :notexists then NotExists
|
160
180
|
when :notin then NotIn
|
161
181
|
when :now then Now
|
162
182
|
when :or, :'||' then Or
|
@@ -166,6 +186,7 @@ module SPARQL; module Algebra
|
|
166
186
|
when :replace then Replace
|
167
187
|
when :round then Round
|
168
188
|
when :sameterm then SameTerm
|
189
|
+
when :sample then Sample
|
169
190
|
when :seconds then Seconds
|
170
191
|
when :sha1 then SHA1
|
171
192
|
when :sha256 then SHA256
|
@@ -181,6 +202,7 @@ module SPARQL; module Algebra
|
|
181
202
|
when :struuid then StrUUID
|
182
203
|
when :substr then SubStr
|
183
204
|
when :subtract then Subtract
|
205
|
+
when :sum then Sum
|
184
206
|
when :timezone then Timezone
|
185
207
|
when :tz then TZ
|
186
208
|
when :ucase then UCase
|
@@ -205,13 +227,16 @@ module SPARQL; module Algebra
|
|
205
227
|
when :extend then Extend
|
206
228
|
when :filter then Filter
|
207
229
|
when :graph then Graph
|
230
|
+
when :group then Group
|
208
231
|
when :join then Join
|
209
232
|
when :leftjoin then LeftJoin
|
210
233
|
when :order then Order
|
234
|
+
when :minus then Minus
|
211
235
|
when :prefix then Prefix
|
212
236
|
when :project then Project
|
213
237
|
when :reduced then Reduced
|
214
238
|
when :slice then Slice
|
239
|
+
when :table then Table
|
215
240
|
when :triple then RDF::Query::Pattern
|
216
241
|
when :union then Union
|
217
242
|
else nil # not found
|
@@ -386,6 +411,16 @@ module SPARQL; module Algebra
|
|
386
411
|
!(variable?)
|
387
412
|
end
|
388
413
|
|
414
|
+
##
|
415
|
+
# Returns `true` if this is an aggregate
|
416
|
+
#
|
417
|
+
# Overridden in evaluatables which are aggregates
|
418
|
+
#
|
419
|
+
# @return [Boolean] `true` or `false`
|
420
|
+
def aggregate?
|
421
|
+
respond_to?(:aggregate)
|
422
|
+
end
|
423
|
+
|
389
424
|
##
|
390
425
|
# Returns an optimized version of this expression.
|
391
426
|
#
|
@@ -402,7 +437,7 @@ module SPARQL; module Algebra
|
|
402
437
|
if constant?
|
403
438
|
# Note that if evaluation results in a `TypeError` or other error,
|
404
439
|
# we must return `self` so that the error is conserved at runtime:
|
405
|
-
evaluate rescue self
|
440
|
+
evaluate(RDF::Query::Solution.new) rescue self
|
406
441
|
else
|
407
442
|
super # returns `self`
|
408
443
|
end
|
data/lib/sparql/algebra.rb
CHANGED
@@ -283,6 +283,7 @@ module SPARQL
|
|
283
283
|
module Algebra
|
284
284
|
include RDF
|
285
285
|
|
286
|
+
autoload :Aggregate, 'sparql/algebra/aggregate'
|
286
287
|
autoload :Evaluatable, 'sparql/algebra/evaluatable'
|
287
288
|
autoload :Expression, 'sparql/algebra/expression'
|
288
289
|
autoload :Operator, 'sparql/algebra/operator'
|