sparql 3.1.8 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -22
- data/VERSION +1 -1
- data/bin/sparql +13 -4
- data/lib/sparql/algebra/extensions.rb +93 -33
- data/lib/sparql/algebra/operator/abs.rb +22 -2
- data/lib/sparql/algebra/operator/add.rb +21 -2
- 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 +17 -1
- data/lib/sparql/algebra/operator/base.rb +18 -1
- data/lib/sparql/algebra/operator/bgp.rb +5 -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 +16 -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 +17 -1
- data/lib/sparql/algebra/operator/create.rb +19 -2
- data/lib/sparql/algebra/operator/dataset.rb +17 -0
- data/lib/sparql/algebra/operator/datatype.rb +25 -6
- data/lib/sparql/algebra/operator/day.rb +23 -5
- data/lib/sparql/algebra/operator/delete.rb +27 -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 +18 -1
- data/lib/sparql/algebra/operator/divide.rb +26 -2
- data/lib/sparql/algebra/operator/drop.rb +17 -2
- data/lib/sparql/algebra/operator/encode_for_uri.rb +24 -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 +12 -1
- data/lib/sparql/algebra/operator/extend.rb +31 -6
- data/lib/sparql/algebra/operator/filter.rb +27 -5
- data/lib/sparql/algebra/operator/floor.rb +25 -2
- data/lib/sparql/algebra/operator/graph.rb +13 -0
- 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 +34 -8
- data/lib/sparql/algebra/operator/group_concat.rb +19 -7
- data/lib/sparql/algebra/operator/hours.rb +23 -5
- data/lib/sparql/algebra/operator/if.rb +21 -4
- data/lib/sparql/algebra/operator/in.rb +18 -1
- data/lib/sparql/algebra/operator/insert.rb +22 -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 +19 -1
- data/lib/sparql/algebra/operator/is_iri.rb +19 -1
- data/lib/sparql/algebra/operator/is_literal.rb +19 -1
- data/lib/sparql/algebra/operator/is_numeric.rb +21 -3
- data/lib/sparql/algebra/operator/is_triple.rb +32 -0
- data/lib/sparql/algebra/operator/join.rb +22 -1
- 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 +23 -2
- data/lib/sparql/algebra/operator/left_join.rb +29 -1
- 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 +17 -1
- data/lib/sparql/algebra/operator/md5.rb +22 -5
- data/lib/sparql/algebra/operator/min.rb +18 -2
- data/lib/sparql/algebra/operator/minus.rb +25 -7
- data/lib/sparql/algebra/operator/minutes.rb +23 -5
- data/lib/sparql/algebra/operator/modify.rb +41 -5
- data/lib/sparql/algebra/operator/month.rb +23 -5
- 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 +12 -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 +20 -1
- data/lib/sparql/algebra/operator/path.rb +29 -2
- data/lib/sparql/algebra/operator/path_opt.rb +21 -2
- data/lib/sparql/algebra/operator/path_plus.rb +21 -2
- data/lib/sparql/algebra/operator/path_star.rb +20 -2
- data/lib/sparql/algebra/operator/plus.rb +42 -3
- 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 +51 -5
- data/lib/sparql/algebra/operator/rand.rb +30 -2
- data/lib/sparql/algebra/operator/reduced.rb +18 -1
- 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 +20 -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 +30 -8
- data/lib/sparql/algebra/operator/seconds.rb +23 -5
- data/lib/sparql/algebra/operator/seq.rb +20 -2
- data/lib/sparql/algebra/operator/sequence.rb +0 -10
- 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 +25 -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 +28 -2
- data/lib/sparql/algebra/operator/sum.rb +17 -1
- data/lib/sparql/algebra/operator/table.rb +42 -4
- data/lib/sparql/algebra/operator/timezone.rb +23 -5
- data/lib/sparql/algebra/operator/tz.rb +22 -5
- 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 +25 -4
- data/lib/sparql/algebra/operator/using.rb +32 -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 +23 -5
- data/lib/sparql/algebra/operator.rb +99 -6
- data/lib/sparql/algebra/sxp_extensions.rb +3 -3
- data/lib/sparql/grammar/parser11.rb +4 -4
- metadata +22 -35
- data/lib/sparql/algebra/operator/triple.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecbe9289bf43f7fa28940a82545ec08b19c54d8bdf64693934405e83ddb4cc53
|
4
|
+
data.tar.gz: 24ab0942be18a9d9d281452ba9a7195dcad2a31755bda6d84afe4f49fe7c34c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89a77c749eb99b0fe83f27d5f413556ac2f6cf22af7e06b8e0588155bbf5a50eb053b1f87ffe11a13b5fd873d5fcaaee1166cdf336aacd3029380898a82da382
|
7
|
+
data.tar.gz: 13be95c405b9fdf7e678bc9bbaf6dcc45075a692a08e1762deacc0779948996fdc992376f3a564644f50270282c76a759023d7393e28db07ec7828a73324a948
|
data/README.md
CHANGED
@@ -23,8 +23,7 @@ This is a [Ruby][] implementation of [SPARQL][] for [RDF.rb][].
|
|
23
23
|
* Compatible with any [Rack][] or [Sinatra][] application and any Rack-based framework.
|
24
24
|
* Helper method for describing [SPARQL Service Description][SSD]
|
25
25
|
* Implementation Report: {file:etc/earl.html EARL}
|
26
|
-
* Compatible with Ruby >= 2.
|
27
|
-
* Compatible with older Ruby versions with the help of the [Backports][] gem.
|
26
|
+
* Compatible with Ruby >= 2.6.
|
28
27
|
* Supports Unicode query strings both on all versions of Ruby.
|
29
28
|
* Provisional support for [SPARQL-star][].
|
30
29
|
|
@@ -248,27 +247,27 @@ a full set of RDF formats.
|
|
248
247
|
### Querying a repository with a SPARQL query
|
249
248
|
|
250
249
|
queryable = RDF::Repository.load("etc/doap.ttl")
|
251
|
-
|
252
|
-
queryable.query(
|
250
|
+
query = SPARQL.parse("SELECT * WHERE { ?s ?p ?o }")
|
251
|
+
queryable.query(query) do |result|
|
253
252
|
result.inspect
|
254
253
|
end
|
255
254
|
|
256
255
|
### Executing a SPARQL query against a repository
|
257
256
|
|
258
257
|
queryable = RDF::Repository.load("etc/doap.ttl")
|
259
|
-
|
260
|
-
|
258
|
+
query = SPARQL.parse("SELECT * WHERE { ?s ?p ?o }")
|
259
|
+
query.execute(queryable) do |result|
|
261
260
|
result.inspect
|
262
261
|
end
|
263
262
|
|
264
263
|
### Updating a repository
|
265
264
|
|
266
265
|
queryable = RDF::Repository.load("etc/doap.ttl")
|
267
|
-
|
266
|
+
update = SPARQL.parse(%(
|
268
267
|
PREFIX doap: <http://usefulinc.com/ns/doap#>
|
269
268
|
INSERT DATA { <https://rubygems> doap:implements <http://www.w3.org/TR/sparql11-update/>}
|
270
269
|
), update: true)
|
271
|
-
|
270
|
+
update.execute(queryable)
|
272
271
|
|
273
272
|
### Rendering solutions as JSON, XML, CSV, TSV or HTML
|
274
273
|
queryable = RDF::Repository.load("etc/doap.ttl")
|
@@ -277,8 +276,13 @@ a full set of RDF formats.
|
|
277
276
|
|
278
277
|
### Parsing a SPARQL query string to SSE
|
279
278
|
|
280
|
-
|
281
|
-
|
279
|
+
query = SPARQL.parse("SELECT * WHERE { ?s ?p ?o }")
|
280
|
+
query.to_sxp #=> (bgp (triple ?s ?p ?o))
|
281
|
+
|
282
|
+
### Parsing a SSE to SPARQL query or update string to SPARQL
|
283
|
+
|
284
|
+
query = SPARQL::Algebra.parse(%{(bgp (triple ?s ?p ?o))})
|
285
|
+
sparql = query.to_sparql #=> "SELECT * WHERE { ?s ?p ?o }"
|
282
286
|
|
283
287
|
### Command line processing
|
284
288
|
|
@@ -289,6 +293,10 @@ a full set of RDF formats.
|
|
289
293
|
sparql parse etc/input.rq
|
290
294
|
sparql parse -e "SELECT * WHERE { ?s ?p ?o }"
|
291
295
|
|
296
|
+
# Generate SPARQL Query from SSE
|
297
|
+
sparql parse --sse etc/input.sse --format sparql
|
298
|
+
sparql parse --sse --format sparql -e "(dataset (<http://usefulinc.com/ns/doap>) (bgp (triple ?s ?p ?o))))"
|
299
|
+
|
292
300
|
# Run query using SSE input
|
293
301
|
sparql execute --dataset etc/doap.ttl --sse etc/input.sse
|
294
302
|
sparql execute --sse -e "(dataset (<etc/doap.ttl>) (bgp (triple ?s ?p ?o))))"
|
@@ -368,19 +376,19 @@ Full documentation available on [Rubydoc.info][SPARQL doc]
|
|
368
376
|
|
369
377
|
## Dependencies
|
370
378
|
|
371
|
-
* [Ruby](https://ruby-lang.org/) (>= 2.
|
372
|
-
* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.
|
373
|
-
* [SPARQL::Client](https://rubygems.org/gems/sparql-client) (~> 3.
|
374
|
-
* [SXP](https://rubygems.org/gems/sxp) (~> 1.
|
375
|
-
* [Builder](https://rubygems.org/gems/builder) (
|
376
|
-
* [JSON](https://rubygems.org/gems/json) (
|
377
|
-
* Soft dependency on [Linked Data][] (>= 3.
|
378
|
-
* Soft dependency on [Nokogiri](https://rubygems.org/gems/nokogiri) (
|
379
|
+
* [Ruby](https://ruby-lang.org/) (>= 2.6)
|
380
|
+
* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.2)
|
381
|
+
* [SPARQL::Client](https://rubygems.org/gems/sparql-client) (~> 3.1)
|
382
|
+
* [SXP](https://rubygems.org/gems/sxp) (~> 1.2)
|
383
|
+
* [Builder](https://rubygems.org/gems/builder) (~> 3.2)
|
384
|
+
* [JSON](https://rubygems.org/gems/json) (~> 2.6)
|
385
|
+
* Soft dependency on [Linked Data][] (>= 3.1)
|
386
|
+
* Soft dependency on [Nokogiri](https://rubygems.org/gems/nokogiri) (~> 1.12)
|
379
387
|
Falls back to REXML for XML parsing Builder for XML serializing. Nokogiri is much more efficient
|
380
|
-
* Soft dependency on [Equivalent XML](https://rubygems.org/gems/equivalent-xml) (>= 0.
|
388
|
+
* Soft dependency on [Equivalent XML](https://rubygems.org/gems/equivalent-xml) (>= 0.6)
|
381
389
|
Equivalent XML performs more efficient comparisons of XML Literals when Nokogiri is included
|
382
|
-
* Soft dependency on [Rack][] (
|
383
|
-
* Soft dependency on [Sinatra][] (
|
390
|
+
* Soft dependency on [Rack][] (~> 2.2)
|
391
|
+
* Soft dependency on [Sinatra][] (~> 2.1)
|
384
392
|
|
385
393
|
## Installation
|
386
394
|
|
@@ -450,7 +458,6 @@ A copy of the [SPARQL 1.0 tests][] and [SPARQL 1.1 tests][] are also included in
|
|
450
458
|
[RDF.rb]: https://rubydoc.info/github/ruby-rdf/rdf
|
451
459
|
[RDF-star]: https://w3c.github.io/rdf-star/rdf-star-cg-spec.html
|
452
460
|
[SPARQL-star]: https://w3c.github.io/rdf-star/rdf-star-cg-spec.html#sparql-query-language
|
453
|
-
[Backports]: https://rubygems.org/gems/backports
|
454
461
|
[Linked Data]: https://rubygems.org/gems/linkeddata
|
455
462
|
[SPARQL doc]: https://rubydoc.info/github/ruby-rdf/sparql/frames
|
456
463
|
[SPARQL XML]: https://www.w3.org/TR/rdf-sparql-XMLres/
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.2.0
|
data/bin/sparql
CHANGED
@@ -45,9 +45,18 @@ def run(input, **options)
|
|
45
45
|
SPARQL::Grammar.parse(input, **options)
|
46
46
|
end
|
47
47
|
|
48
|
-
puts ("\nSSE:\n" + query.to_sse) if options[:debug]
|
48
|
+
puts ("\nSSE:\n" + query.to_sse) if options[:debug]
|
49
49
|
|
50
|
-
|
50
|
+
if options[:parse_only]
|
51
|
+
case options[:format]
|
52
|
+
when :sparql
|
53
|
+
puts ("\nSPARQL:\n" + query.to_sparql)
|
54
|
+
when nil, :sse
|
55
|
+
puts ("\nSSE:\n" + query.to_sse)
|
56
|
+
else
|
57
|
+
$stderr.puts "Unknown output format for parsing: #{options[:format]}. Use 'sse' or 'sparql'"
|
58
|
+
end
|
59
|
+
else
|
51
60
|
res = query.execute(options[:dataset], logger: options[:logger])
|
52
61
|
display_results(res, **options)
|
53
62
|
end
|
@@ -98,7 +107,7 @@ def usage
|
|
98
107
|
puts " --dataset: File containing RDF graph or dataset"
|
99
108
|
puts " --debug: Display detailed debug output"
|
100
109
|
puts " --execute,-e: Use option argument as the SPARQL input if no query-file given"
|
101
|
-
puts " --format: Output format for results"
|
110
|
+
puts " --format: Output format for results (json, xml, csv, tsv, html, sparql, sse, or another RDF format)"
|
102
111
|
puts " --port,-p Port on which to run server; defaults to 9292"
|
103
112
|
puts " --sse: Query input is in SSE format"
|
104
113
|
puts " --update: Process query as a SPARQL Update"
|
@@ -151,7 +160,7 @@ end
|
|
151
160
|
|
152
161
|
case cmd
|
153
162
|
when 'execute', 'parse'
|
154
|
-
options[:
|
163
|
+
options[:parse_only] = true if cmd == 'parse'
|
155
164
|
input ||= ARGV.empty? ? $stdin.read : RDF::Util::File.open_file(ARGV.first).read
|
156
165
|
run(input, **options)
|
157
166
|
when 'query'
|
@@ -43,6 +43,15 @@ class Object
|
|
43
43
|
def deep_dup
|
44
44
|
dup
|
45
45
|
end
|
46
|
+
|
47
|
+
##
|
48
|
+
#
|
49
|
+
# Returns a partial SPARQL grammar for this term.
|
50
|
+
#
|
51
|
+
# @return [String]
|
52
|
+
def to_sparql(**options)
|
53
|
+
to_sxp(**options)
|
54
|
+
end
|
46
55
|
end
|
47
56
|
|
48
57
|
##
|
@@ -56,6 +65,16 @@ class Array
|
|
56
65
|
map {|x| x.to_sxp_bin}
|
57
66
|
end
|
58
67
|
|
68
|
+
##
|
69
|
+
#
|
70
|
+
# Returns a partial SPARQL grammar for this array.
|
71
|
+
#
|
72
|
+
# @param [String] delimiter (" ")
|
73
|
+
# @return [String]
|
74
|
+
def to_sparql(delimiter: " ", **options)
|
75
|
+
map {|e| e.to_sparql(**options)}.join(delimiter)
|
76
|
+
end
|
77
|
+
|
59
78
|
##
|
60
79
|
# Evaluates the array using the given variable `bindings`.
|
61
80
|
#
|
@@ -216,15 +235,6 @@ end
|
|
216
235
|
##
|
217
236
|
# Extensions for Ruby's `Hash` class.
|
218
237
|
class Hash
|
219
|
-
##
|
220
|
-
# Returns the SXP representation of this object, defaults to `self`.
|
221
|
-
#
|
222
|
-
# @return [String]
|
223
|
-
def to_sxp_bin
|
224
|
-
to_a.to_sxp_bin
|
225
|
-
end
|
226
|
-
def to_sxp; to_sxp_bin; end
|
227
|
-
|
228
238
|
##
|
229
239
|
# A duplicate of this hash.
|
230
240
|
#
|
@@ -278,24 +288,20 @@ module RDF::Term
|
|
278
288
|
# @see SPARQL::Algebra::Expression#optimize
|
279
289
|
def optimize(**options)
|
280
290
|
optimized = self.deep_dup
|
281
|
-
optimized.lexical = nil if optimized.respond_to?(:lexical=)
|
282
|
-
optimized
|
291
|
+
#optimized.lexical = nil if optimized.respond_to?(:lexical=)
|
292
|
+
#optimized
|
283
293
|
end
|
284
|
-
end # RDF::Term
|
285
294
|
|
286
|
-
class RDF::Literal::Double
|
287
295
|
##
|
288
|
-
#
|
296
|
+
#
|
297
|
+
# Returns a partial SPARQL grammar for this term.
|
289
298
|
#
|
290
299
|
# @return [String]
|
291
|
-
def
|
292
|
-
|
293
|
-
when nan? then 'nan.0'
|
294
|
-
when infinite? then (infinite? > 0 ? '+inf.0' : '-inf.0')
|
295
|
-
else canonicalize.to_s.downcase
|
296
|
-
end
|
300
|
+
def to_sparql(**options)
|
301
|
+
to_sxp(**options)
|
297
302
|
end
|
298
|
-
end
|
303
|
+
end # RDF::Term
|
304
|
+
|
299
305
|
|
300
306
|
# Override RDF::Queryable to execute against SPARQL::Algebra::Query elements as well as RDF::Query and RDF::Pattern
|
301
307
|
module RDF::Queryable
|
@@ -343,6 +349,15 @@ module RDF::Queryable
|
|
343
349
|
query_without_sparql(pattern, **options, &block)
|
344
350
|
end
|
345
351
|
end
|
352
|
+
|
353
|
+
##
|
354
|
+
#
|
355
|
+
# Returns a partial SPARQL grammar for this term.
|
356
|
+
#
|
357
|
+
# @return [String]
|
358
|
+
def to_sparql(**options)
|
359
|
+
raise NotImplementedError, "SPARQL::Algebra '#{first}' operator not implemented"
|
360
|
+
end
|
346
361
|
end
|
347
362
|
|
348
363
|
class RDF::Statement
|
@@ -361,9 +376,29 @@ class RDF::Statement
|
|
361
376
|
##
|
362
377
|
# Returns an S-Expression (SXP) representation
|
363
378
|
#
|
379
|
+
# @param [Hash{Symbol => RDF::URI}] prefixes (nil)
|
380
|
+
# @param [RDF::URI] base_uri (nil)
|
364
381
|
# @return [String]
|
365
|
-
def to_sxp
|
366
|
-
to_sxp_bin.to_sxp
|
382
|
+
def to_sxp(prefixes: nil, base_uri: nil)
|
383
|
+
to_sxp_bin.to_sxp(prefixes: prefixes, base_uri: base_uri)
|
384
|
+
end
|
385
|
+
|
386
|
+
##
|
387
|
+
#
|
388
|
+
# Returns a partial SPARQL grammar for this term.
|
389
|
+
#
|
390
|
+
# @param [Boolean] as_statement (false) serialize as < ... >, otherwise TRIPLE(...)
|
391
|
+
# @return [String]
|
392
|
+
def to_sparql(as_statement: false, **options)
|
393
|
+
return "TRIPLE(#{to_triple.to_sparql(as_statement: true, **options)})" unless as_statement
|
394
|
+
|
395
|
+
to_triple.map do |term|
|
396
|
+
if term.is_a?(::RDF::Statement)
|
397
|
+
"<<" + term.to_sparql(**options) + ">>"
|
398
|
+
else
|
399
|
+
term.to_sparql(**options)
|
400
|
+
end
|
401
|
+
end.join(" ") + " ."
|
367
402
|
end
|
368
403
|
|
369
404
|
##
|
@@ -411,6 +446,19 @@ class RDF::Query
|
|
411
446
|
end
|
412
447
|
end
|
413
448
|
|
449
|
+
##
|
450
|
+
#
|
451
|
+
# Returns a partial SPARQL grammar for this term.
|
452
|
+
#
|
453
|
+
# @param [Boolean] top_level (true)
|
454
|
+
# Treat this as a top-level, generating SELECT ... WHERE {}
|
455
|
+
# @return [String]
|
456
|
+
def to_sparql(top_level: true, **options)
|
457
|
+
str = @patterns.map { |e| e.to_sparql(as_statement: true, top_level: false, **options) }.join("\n")
|
458
|
+
str = "GRAPH #{graph_name.to_sparql(**options)} {\n#{str}\n}\n" if graph_name
|
459
|
+
top_level ? SPARQL::Algebra::Operator.to_sparql(str, **options) : str
|
460
|
+
end
|
461
|
+
|
414
462
|
##
|
415
463
|
# Binds the pattern to a solution, making it no longer variable if all variables are resolved to bound variables
|
416
464
|
#
|
@@ -462,11 +510,11 @@ class RDF::Query
|
|
462
510
|
def optimize!(**options)
|
463
511
|
@patterns = @patterns.map do |pattern|
|
464
512
|
components = pattern.to_quad.map do |term|
|
465
|
-
if term.respond_to?(:lexical=)
|
466
|
-
|
467
|
-
else
|
513
|
+
#if term.respond_to?(:lexical=)
|
514
|
+
# term.dup.instance_eval {@lexical = nil; self}
|
515
|
+
#else
|
468
516
|
term
|
469
|
-
end
|
517
|
+
#end
|
470
518
|
end
|
471
519
|
RDF::Query::Pattern.from(components, **pattern.options)
|
472
520
|
end
|
@@ -530,11 +578,15 @@ class RDF::Query::Variable
|
|
530
578
|
self
|
531
579
|
end
|
532
580
|
|
533
|
-
|
534
|
-
#
|
535
|
-
|
536
|
-
|
537
|
-
|
581
|
+
##
|
582
|
+
#
|
583
|
+
# Returns a partial SPARQL grammar for this term.
|
584
|
+
#
|
585
|
+
# The Non-distinguished form (`??xxx`) is not part of the grammar, so replace with a blank-node
|
586
|
+
#
|
587
|
+
# @return [String]
|
588
|
+
def to_sparql(**options)
|
589
|
+
self.distinguished? ? super : "_:_nd#{self.name}"
|
538
590
|
end
|
539
591
|
end # RDF::Query::Variable
|
540
592
|
|
@@ -576,5 +628,13 @@ class RDF::Query::Solution
|
|
576
628
|
def to_sxp_bin
|
577
629
|
to_a.to_sxp_bin
|
578
630
|
end
|
579
|
-
|
631
|
+
|
632
|
+
# Transform Solution into an SXP
|
633
|
+
#
|
634
|
+
# @param [Hash{Symbol => RDF::URI}] prefixes (nil)
|
635
|
+
# @param [RDF::URI] base_uri (nil)
|
636
|
+
# @return [String]
|
637
|
+
def to_sxp(prefixes: nil, base_uri: nil)
|
638
|
+
to_sxp_bin.to_sxp(prefixes: prefixes, base_uri: base_uri)
|
639
|
+
end
|
580
640
|
end # RDF::Query::Solution
|
@@ -3,8 +3,19 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL logical `abs` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'ABS' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Query
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# SELECT * WHERE {
|
11
|
+
# ?s :num ?num
|
12
|
+
# FILTER(ABS(?num) >= 2)
|
13
|
+
# }
|
14
|
+
#
|
15
|
+
# @example SSE
|
16
|
+
# (prefix ((: <http://example.org/>))
|
17
|
+
# (filter (>= (abs ?num) 2)
|
18
|
+
# (bgp (triple ?s :num ?num))))
|
8
19
|
#
|
9
20
|
# @see https://www.w3.org/TR/sparql11-query/#func-abs
|
10
21
|
# @see https://www.w3.org/TR/xpath-functions/#func-abs
|
@@ -26,6 +37,15 @@ module SPARQL; module Algebra
|
|
26
37
|
else raise TypeError, "expected an RDF::Literal::Numeric, but got #{operand.inspect}"
|
27
38
|
end
|
28
39
|
end
|
40
|
+
|
41
|
+
##
|
42
|
+
#
|
43
|
+
# Returns a partial SPARQL grammar for this operator.
|
44
|
+
#
|
45
|
+
# @return [String]
|
46
|
+
def to_sparql(**options)
|
47
|
+
"ABS(#{operands.first.to_sparql(**options)})"
|
48
|
+
end
|
29
49
|
end # Abs
|
30
50
|
end # Operator
|
31
51
|
end; end # SPARQL::Algebra
|
@@ -6,8 +6,15 @@ module SPARQL; module Algebra
|
|
6
6
|
#
|
7
7
|
# The ADD operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, and initial data from the destination graph, if any, is kept intact.
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# [35] Add ::= "ADD" "SILENT"? GraphOrDefault "TO" GraphOrDefault
|
10
|
+
#
|
11
|
+
# @example SPARQL Update
|
12
|
+
# PREFIX : <http://example.org/>
|
13
|
+
# ADD DEFAULT TO :g1
|
14
|
+
#
|
15
|
+
# @example SSE
|
16
|
+
# (prefix ((: <http://example.org/>))
|
17
|
+
# (update (add default :g1)))
|
11
18
|
#
|
12
19
|
# @see https://www.w3.org/TR/sparql11-update/#add
|
13
20
|
class Add < Operator
|
@@ -51,6 +58,18 @@ module SPARQL; module Algebra
|
|
51
58
|
end
|
52
59
|
queryable
|
53
60
|
end
|
61
|
+
|
62
|
+
##
|
63
|
+
#
|
64
|
+
# Returns a partial SPARQL grammar for this operator.
|
65
|
+
#
|
66
|
+
# @return [String]
|
67
|
+
def to_sparql(**options)
|
68
|
+
*args, last = operands.dup
|
69
|
+
args += [:TO, last]
|
70
|
+
|
71
|
+
"ADD " + args.to_sparql(**options)
|
72
|
+
end
|
54
73
|
end # Add
|
55
74
|
end # Operator
|
56
75
|
end; end # SPARQL::Algebra
|
@@ -7,8 +7,23 @@ module SPARQL; module Algebra
|
|
7
7
|
#
|
8
8
|
# eval(Path(X, alt(P,Q), Y)) = Union(eval(Path(X, P, Y)), eval(Path(X, Q, Y)))
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
10
|
+
# [89] PathAlternative ::= PathSequence ( '|' PathSequence )*
|
11
|
+
#
|
12
|
+
# @example SPARQL Query
|
13
|
+
# PREFIX : <http://www.example.org/>
|
14
|
+
# SELECT ?t
|
15
|
+
# WHERE {
|
16
|
+
# :a :p1|:p2/:p3|:p4 ?t
|
17
|
+
# }
|
18
|
+
#
|
19
|
+
# @example SSE
|
20
|
+
# (prefix ((: <http://www.example.org/>))
|
21
|
+
# (project (?t)
|
22
|
+
# (path :a
|
23
|
+
# (alt
|
24
|
+
# (alt :p1 (seq :p2 :p3))
|
25
|
+
# :p4)
|
26
|
+
# ?t)))
|
12
27
|
#
|
13
28
|
# @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_alternative
|
14
29
|
class Alt < Operator::Binary
|
@@ -57,6 +72,15 @@ module SPARQL; module Algebra
|
|
57
72
|
query = Union.new(qa, qb)
|
58
73
|
queryable.query(query, depth: options[:depth].to_i + 1, **options, &block)
|
59
74
|
end
|
75
|
+
|
76
|
+
##
|
77
|
+
#
|
78
|
+
# Returns a partial SPARQL grammar for this operator.
|
79
|
+
#
|
80
|
+
# @return [String]
|
81
|
+
def to_sparql(**options)
|
82
|
+
"#{operands.first.to_sparql(**options)}|#{operands.last.to_sparql(**options)}"
|
83
|
+
end
|
60
84
|
end # Alt
|
61
85
|
end # Operator
|
62
86
|
end; end # SPARQL::Algebra
|
@@ -3,9 +3,22 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL logical `and` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
6
|
+
# [112] ConditionalAndExpression::= ValueLogical ( '&&' ValueLogical )*
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
10
|
+
# PREFIX : <http://example.org/ns#>
|
11
|
+
# SELECT ?a
|
12
|
+
# WHERE { ?a :p ?v .
|
13
|
+
# FILTER ("true"^^xsd:boolean && ?v) .
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix
|
18
|
+
# ((xsd: <http://www.w3.org/2001/XMLSchema#>) (: <http://example.org/ns#>))
|
19
|
+
# (project (?a)
|
20
|
+
# (filter (&& true ?v)
|
21
|
+
# (bgp (triple ?a :p ?v)))))
|
9
22
|
#
|
10
23
|
# @see https://www.w3.org/TR/sparql11-query/#func-logical-and
|
11
24
|
# @see https://www.w3.org/TR/sparql11-query/#evaluation
|
@@ -60,6 +73,15 @@ module SPARQL; module Algebra
|
|
60
73
|
else RDF::Literal(left && right)
|
61
74
|
end
|
62
75
|
end
|
76
|
+
|
77
|
+
##
|
78
|
+
#
|
79
|
+
# Returns a partial SPARQL grammar for this operator.
|
80
|
+
#
|
81
|
+
# @return [String]
|
82
|
+
def to_sparql(**options)
|
83
|
+
"(#{operands.first.to_sparql(**options)} && #{operands.last.to_sparql(**options)})"
|
84
|
+
end
|
63
85
|
end # And
|
64
86
|
end # Operator
|
65
87
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,15 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL ascending sort operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var )
|
7
|
+
#
|
8
|
+
# @example SPARQL Query
|
9
|
+
# PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
10
|
+
# SELECT ?name
|
11
|
+
# WHERE { ?x foaf:name ?name }
|
12
|
+
# ORDER BY ASC(?name)
|
13
|
+
#
|
14
|
+
# @example SSE
|
7
15
|
# (prefix ((foaf: <http://xmlns.com/foaf/0.1/>))
|
8
16
|
# (project (?name)
|
9
17
|
# (order ((asc ?name))
|
@@ -27,6 +35,17 @@ module SPARQL; module Algebra
|
|
27
35
|
def evaluate(bindings, **options)
|
28
36
|
operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options)
|
29
37
|
end
|
38
|
+
|
39
|
+
##
|
40
|
+
#
|
41
|
+
# Returns a partial SPARQL grammar for this operator.
|
42
|
+
#
|
43
|
+
# Provides order to descendant query.
|
44
|
+
#
|
45
|
+
# @return [String]
|
46
|
+
def to_sparql(**options)
|
47
|
+
"ASC(#{operands.last.to_sparql(**options)})"
|
48
|
+
end
|
30
49
|
end # Asc
|
31
50
|
end # Operator
|
32
51
|
end; end # SPARQL::Algebra
|
@@ -5,7 +5,13 @@ module SPARQL; module Algebra
|
|
5
5
|
#
|
6
6
|
# Applications can use the ASK form to test whether or not a query pattern has a solution. No information is returned about the possible query solutions, just whether or not a solution exists.
|
7
7
|
#
|
8
|
-
#
|
8
|
+
# [12] AskQuery ::= 'ASK' DatasetClause* WhereClause ValuesClause
|
9
|
+
#
|
10
|
+
# @example SPARQL Query
|
11
|
+
# PREFIX : <http://example/>
|
12
|
+
# ASK { :x :p ?x }
|
13
|
+
#
|
14
|
+
# @example SSE
|
9
15
|
# (prefix ((: <http://example/>))
|
10
16
|
# (ask
|
11
17
|
# (bgp (triple :x :p ?x))))
|
@@ -41,6 +47,16 @@ module SPARQL; module Algebra
|
|
41
47
|
def query_yields_boolean?
|
42
48
|
true
|
43
49
|
end
|
50
|
+
|
51
|
+
##
|
52
|
+
#
|
53
|
+
# Returns a partial SPARQL grammar for this term.
|
54
|
+
#
|
55
|
+
# @return [String]
|
56
|
+
def to_sparql(**options)
|
57
|
+
"ASK\n" +
|
58
|
+
operands.first.to_sparql(top_level: true, project: nil, **options)
|
59
|
+
end
|
44
60
|
end # Ask
|
45
61
|
end # Operator
|
46
62
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,14 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `avg` set function.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [127] Aggregate::= ... | 'AVG' '(' 'DISTINCT'? Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Query
|
9
|
+
# PREFIX : <http://www.example.org/>
|
10
|
+
# SELECT (AVG(?o) AS ?avg)
|
11
|
+
# WHERE { ?s :dec ?o }
|
12
|
+
#
|
13
|
+
# @example SSE
|
7
14
|
# (prefix ((: <http://www.example.org/>))
|
8
15
|
# (project (?avg)
|
9
16
|
# (extend ((?avg ??.0))
|
@@ -40,6 +47,15 @@ module SPARQL; module Algebra
|
|
40
47
|
raise TypeError, "Averaging non-numeric types: #{enum.flatten}"
|
41
48
|
end
|
42
49
|
end
|
50
|
+
|
51
|
+
##
|
52
|
+
#
|
53
|
+
# Returns a partial SPARQL grammar for this operator.
|
54
|
+
#
|
55
|
+
# @return [String]
|
56
|
+
def to_sparql(**options)
|
57
|
+
"AVG(#{operands.to_sparql(**options)})"
|
58
|
+
end
|
43
59
|
end # Avg
|
44
60
|
end # Operator
|
45
61
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,13 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL GraphPattern `base` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [5] BaseDecl ::= 'BASE' IRIREF
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# BASE <http://example.org/>
|
10
|
+
# SELECT * { <a> <b> 123.0 }
|
11
|
+
#
|
12
|
+
# @example SSE
|
7
13
|
# (base <http://example.org/>
|
8
14
|
# (bgp (triple <a> <b> 123.0)))
|
9
15
|
#
|
@@ -56,6 +62,17 @@ module SPARQL; module Algebra
|
|
56
62
|
def query_yields_statements?
|
57
63
|
operands.last.query_yields_statements?
|
58
64
|
end
|
65
|
+
|
66
|
+
##
|
67
|
+
#
|
68
|
+
# Returns a partial SPARQL grammar for this term.
|
69
|
+
#
|
70
|
+
# @return [String]
|
71
|
+
def to_sparql(**options)
|
72
|
+
str = "BASE #{operands.first.to_sparql}\n"
|
73
|
+
|
74
|
+
str << operands.last.to_sparql(base_uri: operands.first, **options)
|
75
|
+
end
|
59
76
|
end # Base
|
60
77
|
end # Operator
|
61
78
|
end; end # SPARQL::Algebra
|
@@ -5,7 +5,11 @@ module SPARQL; module Algebra
|
|
5
5
|
#
|
6
6
|
# Query with `graph_name` set to false.
|
7
7
|
#
|
8
|
-
# @example
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example/>
|
10
|
+
# SELECT * { :s :p :o }
|
11
|
+
#
|
12
|
+
# @example SSE
|
9
13
|
# (prefix ((: <http://example/>))
|
10
14
|
# (bgp (triple ?s ?p ?o)))
|
11
15
|
#
|