sparql 1.0.7 → 1.0.8
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 +7 -0
- data/AUTHORS +0 -1
- data/CREDITS +1 -0
- data/README.md +20 -0
- data/VERSION +1 -1
- data/lib/sparql/algebra/expression.rb +74 -7
- data/lib/sparql/algebra/extensions.rb +15 -1
- data/lib/sparql/algebra/operator/concat.rb +19 -20
- data/lib/sparql/algebra/operator/iri.rb +2 -1
- data/lib/sparql/algebra/query.rb +5 -0
- data/lib/sparql/extensions.rb +8 -0
- data/lib/sparql/grammar/parser11.rb +119 -159
- metadata +49 -90
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eabf23290e66c519d04a3903fb9c10cab87236c5
|
4
|
+
data.tar.gz: ccf93905bff11c897f0fb00b01113095c527aa9e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: de063e0c1d091dcb541f43d00942db7636c1e931f1504337cb9b0c8648085e30856bfbb332b08cfc392aece68c62595c1f6bd2924be9f715bc1fb2574b3b75a6
|
7
|
+
data.tar.gz: d03282b7ed8ae2edadbd9050d8101a9195df45844baa4cf126fefefef38c0b5089a07a67f75902e6a54d3a8404a86358ab13445a161f0b9fdc7fd0ad10aa9ac1
|
data/AUTHORS
CHANGED
data/CREDITS
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
* Pius Uzamere <pius@alum.mit.edu>
|
data/README.md
CHANGED
@@ -51,6 +51,26 @@ The SPARQL gem now implements the following [SPARQL 1.1][] operations:
|
|
51
51
|
* Support for all [functions](http://www.w3.org/TR/sparql11-query/#SparqlOps).
|
52
52
|
* Support for [BIND](http://www.w3.org/TR/sparql11-query/#bind)
|
53
53
|
|
54
|
+
### SPARQL Extension Functions
|
55
|
+
Extension functions may be defined, which will be invoked during query evaluation. For example:
|
56
|
+
|
57
|
+
# Register a function using the IRI <http://rubygems.org/gems/sparql#crypt>
|
58
|
+
crypt_iri = RDF::URI("http://rubygems.org/gems/sparql#crypt")
|
59
|
+
SPARQL::Algebra::Expression.register_extension(crypt_iri) do |literal|
|
60
|
+
raise TypeError, "argument must be a literal" unless literal.literal?
|
61
|
+
RDF::Literal(literal.to_s.crypt)
|
62
|
+
end
|
63
|
+
|
64
|
+
Then, use the function in a query:
|
65
|
+
|
66
|
+
PREFIX rsp: <http://rubygems.org/gems/sparql#>
|
67
|
+
PREFIX schema: <http://schema.org/>
|
68
|
+
SELECT ?crypted
|
69
|
+
{
|
70
|
+
[ schema:email ?email]
|
71
|
+
BIND(rsp:crypt(?email) AS ?crypted)
|
72
|
+
}
|
73
|
+
|
54
74
|
### Middleware
|
55
75
|
|
56
76
|
`Rack::SPARQL` is a superset of [Rack::LinkedData][] to allow content negotiated results
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.8
|
@@ -125,6 +125,69 @@ module SPARQL; module Algebra
|
|
125
125
|
operator.new(*operands)
|
126
126
|
end
|
127
127
|
|
128
|
+
##
|
129
|
+
# Register an extension function.
|
130
|
+
#
|
131
|
+
# Extension functions take zero or more arguments of type `RDF::Term`
|
132
|
+
# and return an argument of type `RDF::Term`, or raise `TypeError`.
|
133
|
+
#
|
134
|
+
# Functions are identified using the `uri` parameter and specified using a block.
|
135
|
+
#
|
136
|
+
# Arguments are evaluated, and the block is called with argument values (if a variable was unbound, an error will have been generated).
|
137
|
+
#
|
138
|
+
# It is possible to get unevaluated arguments but care must be taken not to violate the rules of function evaluation.
|
139
|
+
#
|
140
|
+
# Normally, block should be a pure evaluation based on it's arguments. It should not access a graph nor return different values for the same arguments (to allow expression optimization). Blocks can't bind a variables.
|
141
|
+
#
|
142
|
+
# @example registering a function definition applying the Ruby `crypt` method to its unary argument.
|
143
|
+
# SPARQL::Algebra::Expression.register_extension(RDF::URI("http://example/crypt") do |literal|
|
144
|
+
# raise TypeError, "argument must be a literal" unless literal.literal?
|
145
|
+
# RDF::Literal(literal.to_s.crypt("salt"))
|
146
|
+
# end
|
147
|
+
#
|
148
|
+
# @param [RDF::URI] uri
|
149
|
+
# @yield *args
|
150
|
+
# @yieldparam [Array<RDF::Term>] *args
|
151
|
+
# @yieldreturn [RDF::Term]
|
152
|
+
# @param [Proc] function
|
153
|
+
# @return [void]
|
154
|
+
# @raise [TypeError] if `uri` is not an RDF::URI or no block is given
|
155
|
+
def self.register_extension(uri, &block)
|
156
|
+
raise TypeError, "uri must be an IRI" unless uri.is_a?(RDF::URI)
|
157
|
+
raise TypeError, "must pass a block" unless block_given?
|
158
|
+
self.extensions[uri] = block
|
159
|
+
end
|
160
|
+
|
161
|
+
##
|
162
|
+
# Registered extensions
|
163
|
+
#
|
164
|
+
# @return [Hash{RDF::URI => Proc}]
|
165
|
+
def self.extensions
|
166
|
+
@extensions ||= {}
|
167
|
+
end
|
168
|
+
|
169
|
+
##
|
170
|
+
# Invoke an extension function.
|
171
|
+
#
|
172
|
+
# Applies a registered extension function, if registered.
|
173
|
+
# Otherwise, if it is an XSD Constructor function, apply
|
174
|
+
# that.
|
175
|
+
#
|
176
|
+
# @param [RDF::URI] function
|
177
|
+
# @param [Array<RDF::Term>] *args
|
178
|
+
# @return [RDF::Term]
|
179
|
+
# @see http://www.w3.org/TR/sparql11-query/#extensionFunctions
|
180
|
+
# @see http://www.w3.org/TR/sparql11-query/#FunctionMapping
|
181
|
+
def self.extension(function, *args)
|
182
|
+
if function.to_s.start_with?(RDF::XSD.to_s)
|
183
|
+
self.cast(function, args.first)
|
184
|
+
elsif extension_function = self.extensions[function]
|
185
|
+
extension_function.call(*args)
|
186
|
+
else
|
187
|
+
raise TypeError, "Extension function #{function} not recognized"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
128
191
|
##
|
129
192
|
# Casts operand as the specified datatype
|
130
193
|
#
|
@@ -134,8 +197,8 @@ module SPARQL; module Algebra
|
|
134
197
|
# @param [RDF::Term] value
|
135
198
|
# Value, which should be a typed literal, where the type must be that specified
|
136
199
|
# @raise [TypeError] if datatype is not a URI or value cannot be cast to datatype
|
137
|
-
# @return [
|
138
|
-
# @see http://www.w3.org/TR/
|
200
|
+
# @return [RDF::Term]
|
201
|
+
# @see http://www.w3.org/TR/sparql11-query/#FunctionMapping
|
139
202
|
def self.cast(datatype, value)
|
140
203
|
case datatype
|
141
204
|
when RDF::XSD.dateTime
|
@@ -149,8 +212,10 @@ module SPARQL; module Algebra
|
|
149
212
|
end
|
150
213
|
when RDF::XSD.float, RDF::XSD.double
|
151
214
|
case value
|
152
|
-
when RDF::Literal::
|
153
|
-
RDF::Literal.new(value, :datatype => datatype)
|
215
|
+
when RDF::Literal::Boolean
|
216
|
+
RDF::Literal.new(value.object ? 1 : 0, :datatype => datatype)
|
217
|
+
when RDF::Literal::Numeric
|
218
|
+
RDF::Literal.new(value.to_f, :datatype => datatype)
|
154
219
|
when RDF::Literal::DateTime, RDF::Literal::Date, RDF::Literal::Time, RDF::URI, RDF::Node
|
155
220
|
raise TypeError, "Value #{value.inspect} cannot be cast as #{datatype}"
|
156
221
|
else
|
@@ -161,7 +226,7 @@ module SPARQL; module Algebra
|
|
161
226
|
when RDF::Literal::Boolean
|
162
227
|
value
|
163
228
|
when RDF::Literal::Numeric
|
164
|
-
RDF::Literal::Boolean.new(value.
|
229
|
+
RDF::Literal::Boolean.new(value.object != 0)
|
165
230
|
when RDF::Literal::DateTime, RDF::Literal::Date, RDF::Literal::Time, RDF::URI, RDF::Node
|
166
231
|
raise TypeError, "Value #{value.inspect} cannot be cast as #{datatype}"
|
167
232
|
else
|
@@ -169,7 +234,9 @@ module SPARQL; module Algebra
|
|
169
234
|
end
|
170
235
|
when RDF::XSD.decimal, RDF::XSD.integer
|
171
236
|
case value
|
172
|
-
when RDF::Literal::
|
237
|
+
when RDF::Literal::Boolean
|
238
|
+
RDF::Literal.new(value.object ? 1 : 0, :datatype => datatype)
|
239
|
+
when RDF::Literal::Integer, RDF::Literal::Decimal
|
173
240
|
RDF::Literal.new(value, :datatype => datatype)
|
174
241
|
when RDF::Literal::DateTime, RDF::Literal::Date, RDF::Literal::Time, RDF::URI, RDF::Node
|
175
242
|
raise TypeError, "Value #{value.inspect} cannot be cast as #{datatype}"
|
@@ -179,7 +246,7 @@ module SPARQL; module Algebra
|
|
179
246
|
when RDF::XSD.string
|
180
247
|
RDF::Literal.new(value, :datatype => datatype)
|
181
248
|
else
|
182
|
-
raise TypeError, "Expected datatype (#{datatype}) to be
|
249
|
+
raise TypeError, "Expected datatype (#{datatype}) to be a recognized XPath function"
|
183
250
|
end
|
184
251
|
rescue
|
185
252
|
raise TypeError, $!.message
|
@@ -42,7 +42,21 @@ class Array
|
|
42
42
|
# @return [RDF::Term]
|
43
43
|
def evaluate(bindings)
|
44
44
|
dt, val = self.map {|o| o.evaluate(bindings)}
|
45
|
-
SPARQL::Algebra::Expression.
|
45
|
+
SPARQL::Algebra::Expression.extension(*self.map {|o| o.evaluate(bindings)})
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# If `#execute` is invoked, it implies that a non-implemented Algebra operator
|
50
|
+
# is being invoked
|
51
|
+
#
|
52
|
+
# @param [RDF::Queryable] queryable
|
53
|
+
# the graph or repository to query
|
54
|
+
# @param [Hash{Symbol => Object}] options
|
55
|
+
# @raise [NotImplementedError]
|
56
|
+
# If an attempt is made to perform an unsupported operation
|
57
|
+
# @see http://www.w3.org/TR/rdf-sparql-query/#sparqlAlgebra
|
58
|
+
def execute(queryable, options = {})
|
59
|
+
raise NotImplementedError, "SPARQL::Algebra '#{first}' operator not implemented"
|
46
60
|
end
|
47
61
|
end
|
48
62
|
|
@@ -4,11 +4,11 @@ module SPARQL; module Algebra
|
|
4
4
|
# A SPARQL `concat` operator.
|
5
5
|
#
|
6
6
|
# @example
|
7
|
-
# (concat ?a ?b)
|
7
|
+
# (concat ?a ?b ...)
|
8
8
|
#
|
9
9
|
# @see http://www.w3.org/TR/sparql11-query/#func-concat
|
10
10
|
# @see http://www.w3.org/TR/xpath-functions/#func-concat
|
11
|
-
class Concat < Operator
|
11
|
+
class Concat < Operator
|
12
12
|
include Evaluatable
|
13
13
|
|
14
14
|
NAME = :concat
|
@@ -24,24 +24,23 @@ module SPARQL; module Algebra
|
|
24
24
|
# concat("foo"@en, "bar") #=> "foobar"
|
25
25
|
# concat("foo"@en, "bar"^^xsd:string) #=> "foobar"
|
26
26
|
#
|
27
|
-
# @param [RDF::
|
28
|
-
#
|
29
|
-
# @
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
RDF::Literal.new("#{left}#{right}")
|
27
|
+
# @param [RDF::Query::Solution, #[]] bindings
|
28
|
+
# @return [RDF::Term]
|
29
|
+
# @raise [TypeError] if any operand is not a literal
|
30
|
+
def evaluate(bindings = {})
|
31
|
+
ops = operands.map {|op| op.evaluate(bindings)}
|
32
|
+
|
33
|
+
raise TypeError, "expected all plain literal operands" unless ops.all? {|op| op.literal? && op.plain?}
|
34
|
+
|
35
|
+
ops.inject do |memo, op|
|
36
|
+
case
|
37
|
+
when memo.datatype == RDF::XSD.string && op.datatype == RDF::XSD.string
|
38
|
+
RDF::Literal.new("#{memo}#{op}", :datatype => RDF::XSD.string)
|
39
|
+
when memo.has_language? && memo.language == op.language
|
40
|
+
RDF::Literal.new("#{memo}#{op}", :language => memo.language)
|
41
|
+
else
|
42
|
+
RDF::Literal.new("#{memo}#{op}")
|
43
|
+
end
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end # Concat
|
@@ -31,7 +31,8 @@ module SPARQL; module Algebra
|
|
31
31
|
# @raise [TypeError] if the operand is not a simple literal
|
32
32
|
def apply(literal)
|
33
33
|
raise TypeError, "expected an simple literal, but got #{literal.inspect}" unless literal.literal? && literal.simple?
|
34
|
-
Operator.base_uri
|
34
|
+
base = Operator.base_uri || RDF::URI("")
|
35
|
+
base.join(literal.to_s)
|
35
36
|
end
|
36
37
|
|
37
38
|
Operator::URI = IRI
|
data/lib/sparql/algebra/query.rb
CHANGED
data/lib/sparql/extensions.rb
CHANGED
@@ -99,6 +99,14 @@ module RDF::Queryable
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
+
class RDF::Query
|
103
|
+
# Determine if this is an empty query, having no patterns
|
104
|
+
def empty?
|
105
|
+
self.patterns.empty?
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
|
102
110
|
##
|
103
111
|
# Extensions for `RDF::Query::Solutions`.
|
104
112
|
class RDF::Query::Solutions
|
@@ -232,7 +232,7 @@ module SPARQL::Grammar
|
|
232
232
|
add_prod_datum(:PrefixDecl, prefix_op)
|
233
233
|
end
|
234
234
|
end
|
235
|
-
|
235
|
+
|
236
236
|
# [7] SelectQuery ::= SelectClause DatasetClause* WhereClause SolutionModifier
|
237
237
|
production(:SelectQuery) do |input, data, callback|
|
238
238
|
query = merge_modifiers(data)
|
@@ -356,59 +356,9 @@ module SPARQL::Grammar
|
|
356
356
|
# [54] GroupGraphPatternSub ::= TriplesBlock?
|
357
357
|
# ( GraphPatternNotTriples '.'? TriplesBlock? )*
|
358
358
|
production(:GroupGraphPatternSub) do |input, data, callback|
|
359
|
-
|
360
|
-
debug("GroupGraphPatternSub") {"ql #{query_list.to_a.inspect}"}
|
361
|
-
debug("GroupGraphPatternSub") {"q #{data[:query] ? data[:query].first.inspect : 'nil'}"}
|
362
|
-
|
363
|
-
if query_list
|
364
|
-
lhs = data[:query].to_a.first
|
365
|
-
|
366
|
-
# Bind terminates the TriplesBlock?
|
367
|
-
if data[:extend]
|
368
|
-
lhs ||= SPARQL::Algebra::Operator::BGP.new
|
369
|
-
# query should be nil
|
370
|
-
lhs = SPARQL::Algebra::Operator::Extend.new(data.delete(:extend), lhs)
|
371
|
-
end
|
372
|
-
|
373
|
-
while !query_list.empty?
|
374
|
-
rhs = query_list.shift
|
375
|
-
# Make the right-hand-side a Join with only a single operand, if it's not already and Operator
|
376
|
-
rhs = SPARQL::Algebra::Expression.for(:join, :placeholder, rhs) unless rhs.is_a?(SPARQL::Algebra::Operator)
|
377
|
-
debug("GroupGraphPatternSub") {"<= q: #{rhs.inspect}"}
|
378
|
-
debug("GroupGraphPatternSub") {"<= lhs: #{lhs ? lhs.inspect : 'nil'}"}
|
379
|
-
lhs ||= SPARQL::Algebra::Operator::BGP.new if rhs.is_a?(SPARQL::Algebra::Operator::LeftJoin)
|
380
|
-
if lhs
|
381
|
-
if rhs.operand(0) == :placeholder
|
382
|
-
rhs.operands[0] = lhs
|
383
|
-
else
|
384
|
-
rhs = SPARQL::Algebra::Operator::Join.new(lhs, rhs)
|
385
|
-
end
|
386
|
-
end
|
387
|
-
lhs = rhs
|
388
|
-
lhs = lhs.operand(1) if lhs.operand(0) == :placeholder
|
389
|
-
debug("GroupGraphPatternSub(itr)") {"=> lhs: #{lhs.inspect}"}
|
390
|
-
end
|
391
|
-
# Trivial simplification for :join or :union of one query
|
392
|
-
case lhs
|
393
|
-
when SPARQL::Algebra::Operator::Join, SPARQL::Algebra::Operator::Union
|
394
|
-
if lhs.operand(0) == :placeholder
|
395
|
-
lhs = lhs.operand(1)
|
396
|
-
debug("GroupGraphPatternSub(simplify)") {"=> lhs: #{lhs.inspect}"}
|
397
|
-
end
|
398
|
-
end
|
399
|
-
res = lhs
|
400
|
-
elsif data[:query]
|
401
|
-
res = data[:query].first
|
402
|
-
end
|
403
|
-
|
404
|
-
debug("GroupGraphPatternSub(pre-extend)") {"res: #{res.inspect}"}
|
405
|
-
|
406
|
-
if data[:extend]
|
407
|
-
res ||= SPARQL::Algebra::Operator::BGP.new
|
408
|
-
# query should be nil
|
409
|
-
res = SPARQL::Algebra::Operator::Extend.new(data[:extend], res)
|
410
|
-
end
|
359
|
+
debug("GroupGraphPatternSub") {"q #{data[:query].inspect}"}
|
411
360
|
|
361
|
+
res = data[:query].first
|
412
362
|
debug("GroupGraphPatternSub(pre-filter)") {"res: #{res.inspect}"}
|
413
363
|
|
414
364
|
if data[:filter]
|
@@ -420,29 +370,17 @@ module SPARQL::Grammar
|
|
420
370
|
add_prod_datum(:query, res)
|
421
371
|
end
|
422
372
|
|
423
|
-
# _GroupGraphPatternSub_2 ::= ( GraphPatternNotTriples '.'? TriplesBlock? )
|
424
|
-
# Create a stack of GroupQuerys having a single graph element and resolve in GroupGraphPattern
|
425
|
-
production(:_GroupGraphPatternSub_2) do |input, data, callback|
|
426
|
-
lhs = data[:query_list]
|
427
|
-
[data[:query]].flatten.compact.each do |rhs|
|
428
|
-
rhs = SPARQL::Algebra::Expression.for(:join, :placeholder, rhs) if rhs.is_a?(RDF::Query)
|
429
|
-
add_prod_data(:query_list, rhs)
|
430
|
-
end
|
431
|
-
add_prod_datum(:query_list, lhs)
|
432
|
-
add_prod_datum(:extend, data[:extend])
|
433
|
-
add_prod_datum(:filter, data[:filter])
|
434
|
-
end
|
435
|
-
|
436
|
-
# _GroupGraphPatternSub_3
|
437
|
-
|
438
373
|
# [55] TriplesBlock ::= TriplesSameSubjectPath
|
439
374
|
# ( '.' TriplesBlock? )?
|
440
375
|
production(:TriplesBlock) do |input, data, callback|
|
441
376
|
query = SPARQL::Algebra::Operator::BGP.new
|
442
377
|
data[:pattern].to_a.each {|p| query << p}
|
443
|
-
|
378
|
+
|
444
379
|
# Append triples from ('.' TriplesBlock? )?
|
445
380
|
data[:query].to_a.each {|q| query += q}
|
381
|
+
if (lhs = (input.delete(:query) || []).first) && !lhs.empty?
|
382
|
+
query = SPARQL::Algebra::Expression.for(:join, lhs, query)
|
383
|
+
end
|
446
384
|
add_prod_datum(:query, query)
|
447
385
|
end
|
448
386
|
|
@@ -452,28 +390,44 @@ module SPARQL::Grammar
|
|
452
390
|
# | GraphGraphPattern
|
453
391
|
# | ServiceGraphPattern
|
454
392
|
# | Filter | Bind
|
393
|
+
start_production(:GraphPatternNotTriples) do |input, data, callback|
|
394
|
+
# Modifies previous graph
|
395
|
+
data[:input_query] = input.delete(:query) || [SPARQL::Algebra::Operator::BGP.new]
|
396
|
+
end
|
455
397
|
production(:GraphPatternNotTriples) do |input, data, callback|
|
456
|
-
|
398
|
+
lhs = data[:input_query].first
|
399
|
+
|
400
|
+
# Filter trickls up to GroupGraphPatternSub
|
457
401
|
add_prod_datum(:filter, data[:filter])
|
458
402
|
|
459
|
-
if data[:
|
460
|
-
|
461
|
-
|
403
|
+
if data[:extend] && lhs.is_a?(SPARQL::Algebra::Operator::Extend)
|
404
|
+
# Coalesce extensions
|
405
|
+
lhs = lhs.dup
|
406
|
+
lhs.operands.first.concat(data[:extend])
|
407
|
+
add_prod_datum(:query, lhs)
|
408
|
+
elsif data[:extend]
|
409
|
+
add_prod_datum(:query, SPARQL::Algebra::Expression.for(:extend, data[:extend], lhs))
|
410
|
+
elsif data[:leftjoin]
|
411
|
+
add_prod_datum(:query, SPARQL::Algebra::Expression.for(:leftjoin, lhs, *data[:leftjoin]))
|
412
|
+
elsif data[:query] && !lhs.empty?
|
413
|
+
add_prod_datum(:query, SPARQL::Algebra::Expression.for(:join, lhs, *data[:query]))
|
414
|
+
elsif data[:query]
|
415
|
+
add_prod_datum(:query, data[:query])
|
416
|
+
else
|
417
|
+
add_prod_datum(:query, lhs)
|
462
418
|
end
|
463
419
|
end
|
464
420
|
|
465
421
|
# [57] OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern
|
466
422
|
production(:OptionalGraphPattern) do |input, data, callback|
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
add_prod_data(:query, SPARQL::Algebra::Expression.for(:leftjoin, :placeholder, query))
|
476
|
-
end
|
423
|
+
expr = nil
|
424
|
+
query = data[:query] ? data[:query].first : SPARQL::Algebra::Operator::BGP.new
|
425
|
+
if query.is_a?(SPARQL::Algebra::Operator::Filter)
|
426
|
+
# Change to expression on left-join with query element
|
427
|
+
expr, query = query.operands
|
428
|
+
add_prod_data(:leftjoin, query, expr)
|
429
|
+
elsif !query.empty?
|
430
|
+
add_prod_data(:leftjoin, query)
|
477
431
|
end
|
478
432
|
end
|
479
433
|
|
@@ -786,9 +740,9 @@ module SPARQL::Grammar
|
|
786
740
|
accumulate_operator_expressions(:MultiplicativeExpression, :_Mul_Div, data)
|
787
741
|
end
|
788
742
|
|
789
|
-
# [118] UnaryExpression ::= '!' PrimaryExpression
|
790
|
-
# | '+' PrimaryExpression
|
791
|
-
# | '-' PrimaryExpression
|
743
|
+
# [118] UnaryExpression ::= '!' PrimaryExpression
|
744
|
+
# | '+' PrimaryExpression
|
745
|
+
# | '-' PrimaryExpression
|
792
746
|
# | PrimaryExpression
|
793
747
|
production(:UnaryExpression) do |input, data, callback|
|
794
748
|
case data[:UnaryExpression]
|
@@ -830,60 +784,60 @@ module SPARQL::Grammar
|
|
830
784
|
end
|
831
785
|
|
832
786
|
# [121] BuiltInCall ::= Aggregate
|
833
|
-
# | 'STR' '(' Expression ')'
|
834
|
-
# | 'LANG' '(' Expression ')'
|
835
|
-
# | 'LANGMATCHES' '(' Expression ',' Expression ')'
|
836
|
-
# | 'DATATYPE' '(' Expression ')'
|
837
|
-
# | 'BOUND' '(' Var ')'
|
838
|
-
# | 'IRI' '(' Expression ')'
|
839
|
-
# | 'URI' '(' Expression ')'
|
840
|
-
# | 'BNODE' ( '(' Expression ')' | NIL )
|
841
|
-
# | 'RAND' NIL
|
842
|
-
# | 'ABS' '(' Expression ')'
|
843
|
-
# | 'CEIL' '(' Expression ')'
|
844
|
-
# | 'FLOOR' '(' Expression ')'
|
845
|
-
# | 'ROUND' '(' Expression ')'
|
846
|
-
# | 'CONCAT' ExpressionList
|
847
|
-
# | SubstringExpression
|
848
|
-
# | 'STRLEN' '(' Expression ')'
|
849
|
-
# | StrReplaceExpression
|
850
|
-
# | 'UCASE' '(' Expression ')'
|
851
|
-
# | 'LCASE' '(' Expression ')'
|
852
|
-
# | 'ENCODE_FOR_URI' '(' Expression ')'
|
853
|
-
# | 'CONTAINS' '(' Expression ',' Expression ')'
|
854
|
-
# | 'STRSTARTS' '(' Expression ',' Expression ')'
|
855
|
-
# | 'STRENDS' '(' Expression ',' Expression ')'
|
856
|
-
# | 'STRBEFORE' '(' Expression ',' Expression ')'
|
857
|
-
# | 'STRAFTER' '(' Expression ',' Expression ')'
|
858
|
-
# | 'YEAR' '(' Expression ')'
|
859
|
-
# | 'MONTH' '(' Expression ')'
|
860
|
-
# | 'DAY' '(' Expression ')'
|
861
|
-
# | 'HOURS' '(' Expression ')'
|
862
|
-
# | 'MINUTES' '(' Expression ')'
|
863
|
-
# | 'SECONDS' '(' Expression ')'
|
864
|
-
# | 'TIMEZONE' '(' Expression ')'
|
865
|
-
# | 'TZ' '(' Expression ')'
|
866
|
-
# | 'NOW' NIL
|
787
|
+
# | 'STR' '(' Expression ')'
|
788
|
+
# | 'LANG' '(' Expression ')'
|
789
|
+
# | 'LANGMATCHES' '(' Expression ',' Expression ')'
|
790
|
+
# | 'DATATYPE' '(' Expression ')'
|
791
|
+
# | 'BOUND' '(' Var ')'
|
792
|
+
# | 'IRI' '(' Expression ')'
|
793
|
+
# | 'URI' '(' Expression ')'
|
794
|
+
# | 'BNODE' ( '(' Expression ')' | NIL )
|
795
|
+
# | 'RAND' NIL
|
796
|
+
# | 'ABS' '(' Expression ')'
|
797
|
+
# | 'CEIL' '(' Expression ')'
|
798
|
+
# | 'FLOOR' '(' Expression ')'
|
799
|
+
# | 'ROUND' '(' Expression ')'
|
800
|
+
# | 'CONCAT' ExpressionList
|
801
|
+
# | SubstringExpression
|
802
|
+
# | 'STRLEN' '(' Expression ')'
|
803
|
+
# | StrReplaceExpression
|
804
|
+
# | 'UCASE' '(' Expression ')'
|
805
|
+
# | 'LCASE' '(' Expression ')'
|
806
|
+
# | 'ENCODE_FOR_URI' '(' Expression ')'
|
807
|
+
# | 'CONTAINS' '(' Expression ',' Expression ')'
|
808
|
+
# | 'STRSTARTS' '(' Expression ',' Expression ')'
|
809
|
+
# | 'STRENDS' '(' Expression ',' Expression ')'
|
810
|
+
# | 'STRBEFORE' '(' Expression ',' Expression ')'
|
811
|
+
# | 'STRAFTER' '(' Expression ',' Expression ')'
|
812
|
+
# | 'YEAR' '(' Expression ')'
|
813
|
+
# | 'MONTH' '(' Expression ')'
|
814
|
+
# | 'DAY' '(' Expression ')'
|
815
|
+
# | 'HOURS' '(' Expression ')'
|
816
|
+
# | 'MINUTES' '(' Expression ')'
|
817
|
+
# | 'SECONDS' '(' Expression ')'
|
818
|
+
# | 'TIMEZONE' '(' Expression ')'
|
819
|
+
# | 'TZ' '(' Expression ')'
|
820
|
+
# | 'NOW' NIL
|
867
821
|
# | 'UUID' NIL
|
868
822
|
# | 'STRUUID' NIL
|
869
|
-
# | 'MD5' '(' Expression ')'
|
870
|
-
# | 'SHA1' '(' Expression ')'
|
871
|
-
# | 'SHA224' '(' Expression ')'
|
872
|
-
# | 'SHA256' '(' Expression ')'
|
873
|
-
# | 'SHA384' '(' Expression ')'
|
874
|
-
# | 'SHA512' '(' Expression ')'
|
875
|
-
# | 'COALESCE' ExpressionList
|
876
|
-
# | 'IF' '(' Expression ',' Expression ',' Expression ')'
|
877
|
-
# | 'STRLANG' '(' Expression ',' Expression ')'
|
878
|
-
# | 'STRDT' '(' Expression ',' Expression ')'
|
879
|
-
# | 'sameTerm' '(' Expression ',' Expression ')'
|
880
|
-
# | 'isIRI' '(' Expression ')'
|
881
|
-
# | 'isURI' '(' Expression ')'
|
882
|
-
# | 'isBLANK' '(' Expression ')'
|
883
|
-
# | 'isLITERAL' '(' Expression ')'
|
884
|
-
# | 'isNUMERIC' '(' Expression ')'
|
885
|
-
# | RegexExpression
|
886
|
-
# | ExistsFunc
|
823
|
+
# | 'MD5' '(' Expression ')'
|
824
|
+
# | 'SHA1' '(' Expression ')'
|
825
|
+
# | 'SHA224' '(' Expression ')'
|
826
|
+
# | 'SHA256' '(' Expression ')'
|
827
|
+
# | 'SHA384' '(' Expression ')'
|
828
|
+
# | 'SHA512' '(' Expression ')'
|
829
|
+
# | 'COALESCE' ExpressionList
|
830
|
+
# | 'IF' '(' Expression ',' Expression ',' Expression ')'
|
831
|
+
# | 'STRLANG' '(' Expression ',' Expression ')'
|
832
|
+
# | 'STRDT' '(' Expression ',' Expression ')'
|
833
|
+
# | 'sameTerm' '(' Expression ',' Expression ')'
|
834
|
+
# | 'isIRI' '(' Expression ')'
|
835
|
+
# | 'isURI' '(' Expression ')'
|
836
|
+
# | 'isBLANK' '(' Expression ')'
|
837
|
+
# | 'isLITERAL' '(' Expression ')'
|
838
|
+
# | 'isNUMERIC' '(' Expression ')'
|
839
|
+
# | RegexExpression
|
840
|
+
# | ExistsFunc
|
887
841
|
# | NotExistsFunc
|
888
842
|
production(:BuiltInCall) do |input, data, callback|
|
889
843
|
if builtin = data.keys.detect {|k| BUILTINS.include?(k)}
|
@@ -933,12 +887,12 @@ module SPARQL::Grammar
|
|
933
887
|
add_prod_datum(:notexists, data[:query])
|
934
888
|
end
|
935
889
|
|
936
|
-
# [127] Aggregate ::= 'COUNT' '(' 'DISTINCT'? ( '*' | Expression ) ')'
|
937
|
-
# | 'SUM' '(' 'DISTINCT'? Expression ')'
|
938
|
-
# | 'MIN' '(' 'DISTINCT'? Expression ')'
|
939
|
-
# | 'MAX' '(' 'DISTINCT'? Expression ')'
|
940
|
-
# | 'AVG' '(' 'DISTINCT'? Expression ')'
|
941
|
-
# | 'SAMPLE' '(' 'DISTINCT'? Expression ')'
|
890
|
+
# [127] Aggregate ::= 'COUNT' '(' 'DISTINCT'? ( '*' | Expression ) ')'
|
891
|
+
# | 'SUM' '(' 'DISTINCT'? Expression ')'
|
892
|
+
# | 'MIN' '(' 'DISTINCT'? Expression ')'
|
893
|
+
# | 'MAX' '(' 'DISTINCT'? Expression ')'
|
894
|
+
# | 'AVG' '(' 'DISTINCT'? Expression ')'
|
895
|
+
# | 'SAMPLE' '(' 'DISTINCT'? Expression ')'
|
942
896
|
# | 'GROUP_CONCAT' '(' 'DISTINCT'? Expression
|
943
897
|
# ( ';' 'SEPARATOR' '=' String )? ')'
|
944
898
|
production(:Aggregate) do |input, data, callback|
|
@@ -965,7 +919,7 @@ module SPARQL::Grammar
|
|
965
919
|
production(:RDFLiteral) do |input, data, callback|
|
966
920
|
if data[:string]
|
967
921
|
lit = data.dup
|
968
|
-
str = lit.delete(:string).last
|
922
|
+
str = lit.delete(:string).last
|
969
923
|
lit[:datatype] = lit.delete(:iri).last if lit[:iri]
|
970
924
|
lit[:language] = lit.delete(:language).last.downcase if lit[:language]
|
971
925
|
add_prod_datum(:literal, RDF::Literal.new(str, lit)) if str
|
@@ -1002,7 +956,7 @@ module SPARQL::Grammar
|
|
1002
956
|
##
|
1003
957
|
# Initializes a new parser instance.
|
1004
958
|
#
|
1005
|
-
# @param [String, #to_s] input
|
959
|
+
# @param [String, IO, StringIO, #to_s] input
|
1006
960
|
# @param [Hash{Symbol => Object}] options
|
1007
961
|
# @option options [Hash] :prefixes (Hash.new)
|
1008
962
|
# the prefix mappings to use (for acessing intermediate parser productions)
|
@@ -1020,9 +974,15 @@ module SPARQL::Grammar
|
|
1020
974
|
# Show progress of parser productions
|
1021
975
|
# @option options [Boolean] :debug
|
1022
976
|
# Detailed debug output
|
977
|
+
# @yield [parser] `self`
|
978
|
+
# @yieldparam [SPARQL::Grammar::Parser] parser
|
979
|
+
# @yieldreturn [void] ignored
|
1023
980
|
# @return [SPARQL::Grammar::Parser]
|
1024
|
-
def initialize(input = nil, options = {})
|
1025
|
-
@input = input
|
981
|
+
def initialize(input = nil, options = {}, &block)
|
982
|
+
@input = case input
|
983
|
+
when IO, StringIO then input.read
|
984
|
+
else input.to_s.dup
|
985
|
+
end
|
1026
986
|
@input.force_encoding(Encoding::UTF_8)
|
1027
987
|
@options = {:anon_base => "b0", :validate => false}.merge(options)
|
1028
988
|
@options[:debug] ||= case
|
@@ -1053,12 +1013,12 @@ module SPARQL::Grammar
|
|
1053
1013
|
rescue Error
|
1054
1014
|
false
|
1055
1015
|
end
|
1056
|
-
|
1016
|
+
|
1057
1017
|
# @return [String]
|
1058
1018
|
def to_sxp_bin
|
1059
1019
|
@result
|
1060
1020
|
end
|
1061
|
-
|
1021
|
+
|
1062
1022
|
def to_s
|
1063
1023
|
@result.to_sxp
|
1064
1024
|
end
|
@@ -1237,7 +1197,7 @@ module SPARQL::Grammar
|
|
1237
1197
|
# @return [RDF::Query::Variable]
|
1238
1198
|
def variable(id, distinguished = true)
|
1239
1199
|
id = nil if id.to_s.empty?
|
1240
|
-
|
1200
|
+
|
1241
1201
|
if id
|
1242
1202
|
@vars[id] ||= begin
|
1243
1203
|
v = RDF::Query::Variable.new(id)
|
@@ -1281,7 +1241,7 @@ module SPARQL::Grammar
|
|
1281
1241
|
iri.lexical = "#{prefix}:#{suffix}" unless resolve_iris?
|
1282
1242
|
iri
|
1283
1243
|
end
|
1284
|
-
|
1244
|
+
|
1285
1245
|
# Create a literal
|
1286
1246
|
def literal(value, options = {})
|
1287
1247
|
options = options.dup
|
@@ -1300,7 +1260,7 @@ module SPARQL::Grammar
|
|
1300
1260
|
def expand_collection(data)
|
1301
1261
|
# Add any triples generated from deeper productions
|
1302
1262
|
add_prod_datum(:pattern, data[:pattern])
|
1303
|
-
|
1263
|
+
|
1304
1264
|
# Create list items for each element in data[:GraphNode]
|
1305
1265
|
first = data[:Collection]
|
1306
1266
|
list = data[:GraphNode].to_a.flatten.compact
|
@@ -1312,7 +1272,7 @@ module SPARQL::Grammar
|
|
1312
1272
|
add_pattern(:Collection, :subject => first, :predicate => RDF["rest"], :object => rest)
|
1313
1273
|
first = rest
|
1314
1274
|
end
|
1315
|
-
|
1275
|
+
|
1316
1276
|
if last
|
1317
1277
|
add_pattern(:Collection, :subject => first, :predicate => RDF["first"], :object => last)
|
1318
1278
|
end
|
@@ -1343,11 +1303,11 @@ module SPARQL::Grammar
|
|
1343
1303
|
# Flatten a Data in form of :filter => [op+ bgp?], without a query into filter and query creating exprlist, if necessary
|
1344
1304
|
# @return [Array[:expr, query]]
|
1345
1305
|
def flatten_filter(data)
|
1346
|
-
query = data.pop if data.last.
|
1306
|
+
query = data.pop if data.last.is_a?(SPARQL::Algebra::Query)
|
1347
1307
|
expr = data.length > 1 ? SPARQL::Algebra::Operator::Exprlist.new(*data) : data.first
|
1348
1308
|
[expr, query]
|
1349
1309
|
end
|
1350
|
-
|
1310
|
+
|
1351
1311
|
# Merge query modifiers, datasets, and projections
|
1352
1312
|
#
|
1353
1313
|
# This includes tranforming aggregates if also used with a GROUP BY
|
@@ -1364,7 +1324,7 @@ module SPARQL::Grammar
|
|
1364
1324
|
query = SPARQL::Algebra::Expression[:group, data[:group].first, query]
|
1365
1325
|
end
|
1366
1326
|
|
1367
|
-
if data[:extend]
|
1327
|
+
if data[:extend] # FIXME: needed?
|
1368
1328
|
# extension variables must not appear in projected variables.
|
1369
1329
|
# Add them to the projection otherwise
|
1370
1330
|
data[:extend].each do |(var, expr)|
|
@@ -1382,9 +1342,9 @@ module SPARQL::Grammar
|
|
1382
1342
|
query = SPARQL::Algebra::Expression[data[:DISTINCT_REDUCED].first, query] if data[:DISTINCT_REDUCED]
|
1383
1343
|
|
1384
1344
|
query = SPARQL::Algebra::Expression[:slice, data[:slice][0], data[:slice][1], query] if data[:slice]
|
1385
|
-
|
1345
|
+
|
1386
1346
|
query = SPARQL::Algebra::Expression[:dataset, data[:dataset], query] if data[:dataset]
|
1387
|
-
|
1347
|
+
|
1388
1348
|
query
|
1389
1349
|
end
|
1390
1350
|
|
metadata
CHANGED
@@ -1,310 +1,271 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sparql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.8
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Gregg Kellogg
|
9
8
|
- Arto Bendiken
|
10
|
-
- Pius Uzamere
|
11
9
|
autorequire:
|
12
10
|
bindir: bin
|
13
11
|
cert_chain: []
|
14
|
-
date: 2013-
|
12
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
15
13
|
dependencies:
|
16
14
|
- !ruby/object:Gem::Dependency
|
17
15
|
name: rdf
|
18
16
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
17
|
requirements:
|
21
|
-
- -
|
18
|
+
- - '>='
|
22
19
|
- !ruby/object:Gem::Version
|
23
20
|
version: 1.0.6
|
24
21
|
type: :runtime
|
25
22
|
prerelease: false
|
26
23
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
24
|
requirements:
|
29
|
-
- -
|
25
|
+
- - '>='
|
30
26
|
- !ruby/object:Gem::Version
|
31
27
|
version: 1.0.6
|
32
28
|
- !ruby/object:Gem::Dependency
|
33
29
|
name: rdf-aggregate-repo
|
34
30
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
31
|
requirements:
|
37
|
-
- -
|
32
|
+
- - '>='
|
38
33
|
- !ruby/object:Gem::Version
|
39
34
|
version: '0'
|
40
35
|
type: :runtime
|
41
36
|
prerelease: false
|
42
37
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
38
|
requirements:
|
45
|
-
- -
|
39
|
+
- - '>='
|
46
40
|
- !ruby/object:Gem::Version
|
47
41
|
version: '0'
|
48
42
|
- !ruby/object:Gem::Dependency
|
49
43
|
name: ebnf
|
50
44
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
45
|
requirements:
|
53
|
-
- -
|
46
|
+
- - '>='
|
54
47
|
- !ruby/object:Gem::Version
|
55
48
|
version: 0.3.0
|
56
49
|
type: :runtime
|
57
50
|
prerelease: false
|
58
51
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
52
|
requirements:
|
61
|
-
- -
|
53
|
+
- - '>='
|
62
54
|
- !ruby/object:Gem::Version
|
63
55
|
version: 0.3.0
|
64
56
|
- !ruby/object:Gem::Dependency
|
65
57
|
name: builder
|
66
58
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
59
|
requirements:
|
69
|
-
- -
|
60
|
+
- - '>='
|
70
61
|
- !ruby/object:Gem::Version
|
71
62
|
version: '3.0'
|
72
63
|
type: :runtime
|
73
64
|
prerelease: false
|
74
65
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
66
|
requirements:
|
77
|
-
- -
|
67
|
+
- - '>='
|
78
68
|
- !ruby/object:Gem::Version
|
79
69
|
version: '3.0'
|
80
70
|
- !ruby/object:Gem::Dependency
|
81
71
|
name: json
|
82
72
|
requirement: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
73
|
requirements:
|
85
|
-
- -
|
74
|
+
- - '>='
|
86
75
|
- !ruby/object:Gem::Version
|
87
76
|
version: '1.7'
|
88
77
|
type: :runtime
|
89
78
|
prerelease: false
|
90
79
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
80
|
requirements:
|
93
|
-
- -
|
81
|
+
- - '>='
|
94
82
|
- !ruby/object:Gem::Version
|
95
83
|
version: '1.7'
|
96
84
|
- !ruby/object:Gem::Dependency
|
97
85
|
name: sxp
|
98
86
|
requirement: !ruby/object:Gem::Requirement
|
99
|
-
none: false
|
100
87
|
requirements:
|
101
|
-
- -
|
88
|
+
- - '>='
|
102
89
|
- !ruby/object:Gem::Version
|
103
90
|
version: 0.1.0
|
104
91
|
type: :runtime
|
105
92
|
prerelease: false
|
106
93
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
none: false
|
108
94
|
requirements:
|
109
|
-
- -
|
95
|
+
- - '>='
|
110
96
|
- !ruby/object:Gem::Version
|
111
97
|
version: 0.1.0
|
112
98
|
- !ruby/object:Gem::Dependency
|
113
99
|
name: sparql-client
|
114
100
|
requirement: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
101
|
requirements:
|
117
|
-
- -
|
102
|
+
- - '>='
|
118
103
|
- !ruby/object:Gem::Version
|
119
104
|
version: '1.0'
|
120
105
|
type: :runtime
|
121
106
|
prerelease: false
|
122
107
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
-
none: false
|
124
108
|
requirements:
|
125
|
-
- -
|
109
|
+
- - '>='
|
126
110
|
- !ruby/object:Gem::Version
|
127
111
|
version: '1.0'
|
128
112
|
- !ruby/object:Gem::Dependency
|
129
113
|
name: rdf-xsd
|
130
114
|
requirement: !ruby/object:Gem::Requirement
|
131
|
-
none: false
|
132
115
|
requirements:
|
133
|
-
- -
|
116
|
+
- - '>='
|
134
117
|
- !ruby/object:Gem::Version
|
135
118
|
version: '1.0'
|
136
119
|
type: :runtime
|
137
120
|
prerelease: false
|
138
121
|
version_requirements: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
122
|
requirements:
|
141
|
-
- -
|
123
|
+
- - '>='
|
142
124
|
- !ruby/object:Gem::Version
|
143
125
|
version: '1.0'
|
144
126
|
- !ruby/object:Gem::Dependency
|
145
127
|
name: sinatra
|
146
128
|
requirement: !ruby/object:Gem::Requirement
|
147
|
-
none: false
|
148
129
|
requirements:
|
149
|
-
- -
|
130
|
+
- - '>='
|
150
131
|
- !ruby/object:Gem::Version
|
151
132
|
version: 1.3.3
|
152
133
|
type: :development
|
153
134
|
prerelease: false
|
154
135
|
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
none: false
|
156
136
|
requirements:
|
157
|
-
- -
|
137
|
+
- - '>='
|
158
138
|
- !ruby/object:Gem::Version
|
159
139
|
version: 1.3.3
|
160
140
|
- !ruby/object:Gem::Dependency
|
161
141
|
name: rack
|
162
142
|
requirement: !ruby/object:Gem::Requirement
|
163
|
-
none: false
|
164
143
|
requirements:
|
165
|
-
- -
|
144
|
+
- - '>='
|
166
145
|
- !ruby/object:Gem::Version
|
167
146
|
version: 1.4.4
|
168
147
|
type: :development
|
169
148
|
prerelease: false
|
170
149
|
version_requirements: !ruby/object:Gem::Requirement
|
171
|
-
none: false
|
172
150
|
requirements:
|
173
|
-
- -
|
151
|
+
- - '>='
|
174
152
|
- !ruby/object:Gem::Version
|
175
153
|
version: 1.4.4
|
176
154
|
- !ruby/object:Gem::Dependency
|
177
155
|
name: rack-test
|
178
156
|
requirement: !ruby/object:Gem::Requirement
|
179
|
-
none: false
|
180
157
|
requirements:
|
181
|
-
- -
|
158
|
+
- - '>='
|
182
159
|
- !ruby/object:Gem::Version
|
183
160
|
version: 0.6.2
|
184
161
|
type: :development
|
185
162
|
prerelease: false
|
186
163
|
version_requirements: !ruby/object:Gem::Requirement
|
187
|
-
none: false
|
188
164
|
requirements:
|
189
|
-
- -
|
165
|
+
- - '>='
|
190
166
|
- !ruby/object:Gem::Version
|
191
167
|
version: 0.6.2
|
192
168
|
- !ruby/object:Gem::Dependency
|
193
169
|
name: rdf-turtle
|
194
170
|
requirement: !ruby/object:Gem::Requirement
|
195
|
-
none: false
|
196
171
|
requirements:
|
197
|
-
- -
|
172
|
+
- - '>='
|
198
173
|
- !ruby/object:Gem::Version
|
199
174
|
version: 1.0.4
|
200
175
|
type: :development
|
201
176
|
prerelease: false
|
202
177
|
version_requirements: !ruby/object:Gem::Requirement
|
203
|
-
none: false
|
204
178
|
requirements:
|
205
|
-
- -
|
179
|
+
- - '>='
|
206
180
|
- !ruby/object:Gem::Version
|
207
181
|
version: 1.0.4
|
208
182
|
- !ruby/object:Gem::Dependency
|
209
183
|
name: linkeddata
|
210
184
|
requirement: !ruby/object:Gem::Requirement
|
211
|
-
none: false
|
212
185
|
requirements:
|
213
|
-
- -
|
186
|
+
- - '>='
|
214
187
|
- !ruby/object:Gem::Version
|
215
188
|
version: '0'
|
216
189
|
type: :development
|
217
190
|
prerelease: false
|
218
191
|
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
none: false
|
220
192
|
requirements:
|
221
|
-
- -
|
193
|
+
- - '>='
|
222
194
|
- !ruby/object:Gem::Version
|
223
195
|
version: '0'
|
224
196
|
- !ruby/object:Gem::Dependency
|
225
197
|
name: rdf-spec
|
226
198
|
requirement: !ruby/object:Gem::Requirement
|
227
|
-
none: false
|
228
199
|
requirements:
|
229
|
-
- -
|
200
|
+
- - '>='
|
230
201
|
- !ruby/object:Gem::Version
|
231
202
|
version: '1.0'
|
232
203
|
type: :development
|
233
204
|
prerelease: false
|
234
205
|
version_requirements: !ruby/object:Gem::Requirement
|
235
|
-
none: false
|
236
206
|
requirements:
|
237
|
-
- -
|
207
|
+
- - '>='
|
238
208
|
- !ruby/object:Gem::Version
|
239
209
|
version: '1.0'
|
240
210
|
- !ruby/object:Gem::Dependency
|
241
211
|
name: open-uri-cached
|
242
212
|
requirement: !ruby/object:Gem::Requirement
|
243
|
-
none: false
|
244
213
|
requirements:
|
245
|
-
- -
|
214
|
+
- - '>='
|
246
215
|
- !ruby/object:Gem::Version
|
247
216
|
version: 0.0.5
|
248
217
|
type: :development
|
249
218
|
prerelease: false
|
250
219
|
version_requirements: !ruby/object:Gem::Requirement
|
251
|
-
none: false
|
252
220
|
requirements:
|
253
|
-
- -
|
221
|
+
- - '>='
|
254
222
|
- !ruby/object:Gem::Version
|
255
223
|
version: 0.0.5
|
256
224
|
- !ruby/object:Gem::Dependency
|
257
225
|
name: equivalent-xml
|
258
226
|
requirement: !ruby/object:Gem::Requirement
|
259
|
-
none: false
|
260
227
|
requirements:
|
261
|
-
- -
|
228
|
+
- - '>='
|
262
229
|
- !ruby/object:Gem::Version
|
263
230
|
version: '0'
|
264
231
|
type: :development
|
265
232
|
prerelease: false
|
266
233
|
version_requirements: !ruby/object:Gem::Requirement
|
267
|
-
none: false
|
268
234
|
requirements:
|
269
|
-
- -
|
235
|
+
- - '>='
|
270
236
|
- !ruby/object:Gem::Version
|
271
237
|
version: '0'
|
272
238
|
- !ruby/object:Gem::Dependency
|
273
239
|
name: nokogiri
|
274
240
|
requirement: !ruby/object:Gem::Requirement
|
275
|
-
none: false
|
276
241
|
requirements:
|
277
|
-
- -
|
242
|
+
- - '>='
|
278
243
|
- !ruby/object:Gem::Version
|
279
244
|
version: 1.5.0
|
280
245
|
type: :development
|
281
246
|
prerelease: false
|
282
247
|
version_requirements: !ruby/object:Gem::Requirement
|
283
|
-
none: false
|
284
248
|
requirements:
|
285
|
-
- -
|
249
|
+
- - '>='
|
286
250
|
- !ruby/object:Gem::Version
|
287
251
|
version: 1.5.0
|
288
252
|
- !ruby/object:Gem::Dependency
|
289
253
|
name: rspec
|
290
254
|
requirement: !ruby/object:Gem::Requirement
|
291
|
-
none: false
|
292
255
|
requirements:
|
293
|
-
- -
|
256
|
+
- - '>='
|
294
257
|
- !ruby/object:Gem::Version
|
295
258
|
version: 2.12.0
|
296
259
|
type: :development
|
297
260
|
prerelease: false
|
298
261
|
version_requirements: !ruby/object:Gem::Requirement
|
299
|
-
none: false
|
300
262
|
requirements:
|
301
|
-
- -
|
263
|
+
- - '>='
|
302
264
|
- !ruby/object:Gem::Version
|
303
265
|
version: 2.12.0
|
304
266
|
- !ruby/object:Gem::Dependency
|
305
267
|
name: spira
|
306
268
|
requirement: !ruby/object:Gem::Requirement
|
307
|
-
none: false
|
308
269
|
requirements:
|
309
270
|
- - '='
|
310
271
|
- !ruby/object:Gem::Version
|
@@ -312,7 +273,6 @@ dependencies:
|
|
312
273
|
type: :development
|
313
274
|
prerelease: false
|
314
275
|
version_requirements: !ruby/object:Gem::Requirement
|
315
|
-
none: false
|
316
276
|
requirements:
|
317
277
|
- - '='
|
318
278
|
- !ruby/object:Gem::Version
|
@@ -320,21 +280,21 @@ dependencies:
|
|
320
280
|
- !ruby/object:Gem::Dependency
|
321
281
|
name: yard
|
322
282
|
requirement: !ruby/object:Gem::Requirement
|
323
|
-
none: false
|
324
283
|
requirements:
|
325
|
-
- -
|
284
|
+
- - '>='
|
326
285
|
- !ruby/object:Gem::Version
|
327
286
|
version: 0.8.3
|
328
287
|
type: :development
|
329
288
|
prerelease: false
|
330
289
|
version_requirements: !ruby/object:Gem::Requirement
|
331
|
-
none: false
|
332
290
|
requirements:
|
333
|
-
- -
|
291
|
+
- - '>='
|
334
292
|
- !ruby/object:Gem::Version
|
335
293
|
version: 0.8.3
|
336
|
-
description:
|
337
|
-
|
294
|
+
description: |2-
|
295
|
+
|
296
|
+
Implements SPARQL grammar parsing to SPARQL Algebra, SPARQL Algebra processing
|
297
|
+
and includes SPARQL Client for accessing remote repositories.
|
338
298
|
email: public-rdf-ruby@w3.org
|
339
299
|
executables:
|
340
300
|
- sparql
|
@@ -459,27 +419,26 @@ files:
|
|
459
419
|
homepage: http://github.com/ruby-rdf/sparql
|
460
420
|
licenses:
|
461
421
|
- Public Domain
|
422
|
+
metadata: {}
|
462
423
|
post_install_message:
|
463
424
|
rdoc_options: []
|
464
425
|
require_paths:
|
465
426
|
- lib
|
466
427
|
required_ruby_version: !ruby/object:Gem::Requirement
|
467
|
-
none: false
|
468
428
|
requirements:
|
469
|
-
- -
|
429
|
+
- - '>='
|
470
430
|
- !ruby/object:Gem::Version
|
471
431
|
version: 1.9.2
|
472
432
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
473
|
-
none: false
|
474
433
|
requirements:
|
475
|
-
- -
|
434
|
+
- - '>='
|
476
435
|
- !ruby/object:Gem::Version
|
477
436
|
version: '0'
|
478
437
|
requirements: []
|
479
438
|
rubyforge_project: sparql
|
480
|
-
rubygems_version:
|
439
|
+
rubygems_version: 2.0.3
|
481
440
|
signing_key:
|
482
|
-
specification_version:
|
441
|
+
specification_version: 4
|
483
442
|
summary: SPARQL library for Ruby.
|
484
443
|
test_files: []
|
485
444
|
has_rdoc: false
|