sparql 3.2.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/VERSION +1 -1
- data/lib/sparql/algebra/expression.rb +28 -3
- data/lib/sparql/algebra/extensions.rb +36 -32
- data/lib/sparql/algebra/operator/abs.rb +1 -1
- data/lib/sparql/algebra/operator/alt.rb +1 -1
- data/lib/sparql/algebra/operator/avg.rb +3 -1
- data/lib/sparql/algebra/operator/bgp.rb +9 -1
- data/lib/sparql/algebra/operator/clear.rb +13 -3
- data/lib/sparql/algebra/operator/construct.rb +1 -1
- data/lib/sparql/algebra/operator/count.rb +36 -6
- data/lib/sparql/algebra/operator/create.rb +5 -4
- data/lib/sparql/algebra/operator/dataset.rb +19 -11
- data/lib/sparql/algebra/operator/delete.rb +3 -1
- data/lib/sparql/algebra/operator/delete_data.rb +1 -1
- data/lib/sparql/algebra/operator/delete_where.rb +1 -1
- data/lib/sparql/algebra/operator/distinct.rb +2 -2
- data/lib/sparql/algebra/operator/divide.rb +1 -1
- data/lib/sparql/algebra/operator/drop.rb +15 -6
- data/lib/sparql/algebra/operator/encode_for_uri.rb +2 -4
- data/lib/sparql/algebra/operator/exprlist.rb +3 -1
- data/lib/sparql/algebra/operator/extend.rb +36 -3
- data/lib/sparql/algebra/operator/filter.rb +1 -1
- data/lib/sparql/algebra/operator/function_call.rb +64 -0
- data/lib/sparql/algebra/operator/graph.rb +57 -7
- data/lib/sparql/algebra/operator/group.rb +76 -5
- data/lib/sparql/algebra/operator/group_concat.rb +25 -1
- data/lib/sparql/algebra/operator/if.rb +10 -10
- data/lib/sparql/algebra/operator/insert.rb +3 -1
- data/lib/sparql/algebra/operator/insert_data.rb +1 -1
- data/lib/sparql/algebra/operator/is_blank.rb +1 -2
- data/lib/sparql/algebra/operator/is_iri.rb +1 -2
- data/lib/sparql/algebra/operator/is_literal.rb +1 -2
- data/lib/sparql/algebra/operator/is_numeric.rb +1 -2
- data/lib/sparql/algebra/operator/join.rb +37 -3
- data/lib/sparql/algebra/operator/lcase.rb +2 -3
- data/lib/sparql/algebra/operator/left_join.rb +20 -7
- data/lib/sparql/algebra/operator/max.rb +3 -1
- data/lib/sparql/algebra/operator/min.rb +4 -2
- data/lib/sparql/algebra/operator/minus.rb +46 -6
- data/lib/sparql/algebra/operator/multiply.rb +1 -1
- data/lib/sparql/algebra/operator/notoneof.rb +12 -3
- data/lib/sparql/algebra/operator/order.rb +44 -0
- data/lib/sparql/algebra/operator/plus.rb +1 -1
- data/lib/sparql/algebra/operator/project.rb +22 -4
- data/lib/sparql/algebra/operator/reduced.rb +3 -3
- data/lib/sparql/algebra/operator/regex.rb +1 -1
- data/lib/sparql/algebra/operator/reverse.rb +12 -1
- data/lib/sparql/algebra/operator/sample.rb +3 -1
- data/lib/sparql/algebra/operator/seq.rb +1 -1
- data/lib/sparql/algebra/operator/sequence.rb +4 -1
- data/lib/sparql/algebra/operator/strlang.rb +1 -2
- data/lib/sparql/algebra/operator/subtract.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +9 -7
- data/lib/sparql/algebra/operator/table.rb +41 -7
- data/lib/sparql/algebra/operator/ucase.rb +1 -1
- data/lib/sparql/algebra/operator/update.rb +22 -1
- data/lib/sparql/algebra/operator/using.rb +18 -1
- data/lib/sparql/algebra/operator/with.rb +1 -1
- data/lib/sparql/algebra/operator.rb +46 -18
- data/lib/sparql/algebra.rb +20 -3
- data/lib/sparql/grammar/parser11.rb +3 -3
- metadata +15 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9bcab10eb6706316b68b44a0fd917d7b735b18a8353b51e49ef124fc966176d
|
4
|
+
data.tar.gz: 6da59b4e90fd1b7a7d80c42d941f7c27f6bf95892d17302caf16a13809b03afa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2f99aee7d5b9482bbd653333eeefd215da872291993a2ba138ed9bcfc3f92812672cd1508dfbd11a729d527c9724f0a80ec816c5c84fd2df9933b4b91b5a296
|
7
|
+
data.tar.gz: 41a11caf8e85ca4bd01213bb0c0c236314560338dbd2825bd2437afbf4fd9855b994150737dbcad00838dc5ac50e368d72e5bfe2e516566a6319f824bdcacc56
|
data/README.md
CHANGED
@@ -281,6 +281,8 @@ a full set of RDF formats.
|
|
281
281
|
|
282
282
|
### Parsing a SSE to SPARQL query or update string to SPARQL
|
283
283
|
|
284
|
+
# Note: if the SSE uses extension functions, they either must be XSD casting functions, or custom functions which are registered extensions. (See [SPARQL Extension Functions](#sparql-extension-functions))
|
285
|
+
|
284
286
|
query = SPARQL::Algebra.parse(%{(bgp (triple ?s ?p ?o))})
|
285
287
|
sparql = query.to_sparql #=> "SELECT * WHERE { ?s ?p ?o }"
|
286
288
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.
|
1
|
+
3.2.1
|
@@ -66,9 +66,11 @@ module SPARQL; module Algebra
|
|
66
66
|
#
|
67
67
|
# @param [Array] sse
|
68
68
|
# a SPARQL S-Expression (SSE) form
|
69
|
+
# @param [Hash{Symbol => Object}] options
|
70
|
+
# any additional options (see {Operator#initialize})
|
69
71
|
# @return [Expression]
|
70
|
-
def self.for(*sse)
|
71
|
-
self.new(sse)
|
72
|
+
def self.for(*sse, **options)
|
73
|
+
self.new(sse, **options)
|
72
74
|
end
|
73
75
|
class << self; alias_method :[], :for; end
|
74
76
|
|
@@ -86,6 +88,13 @@ module SPARQL; module Algebra
|
|
86
88
|
raise ArgumentError, "invalid SPARQL::Algebra::Expression form: #{sse.inspect}" unless sse.is_a?(Array)
|
87
89
|
|
88
90
|
operator = Operator.for(sse.first, sse.length - 1)
|
91
|
+
|
92
|
+
# If we don't find an operator, and sse.first is an extension IRI, use a function call
|
93
|
+
if !operator && sse.first.is_a?(RDF::URI) && self.extension?(sse.first)
|
94
|
+
operator = Operator.for(:function_call, sse.length)
|
95
|
+
sse.unshift(:function_call)
|
96
|
+
end
|
97
|
+
|
89
98
|
unless operator
|
90
99
|
return case sse.first
|
91
100
|
when Array
|
@@ -115,11 +124,16 @@ module SPARQL; module Algebra
|
|
115
124
|
end
|
116
125
|
|
117
126
|
debug(options) {"#{operator.inspect}(#{operands.map(&:inspect).join(',')})"}
|
127
|
+
logger = options[:logger]
|
118
128
|
options.delete_if {|k, v| [:debug, :logger, :depth, :prefixes, :base_uri, :update, :validate].include?(k) }
|
119
129
|
begin
|
120
130
|
operator.new(*operands, **options)
|
121
131
|
rescue ArgumentError => e
|
122
|
-
|
132
|
+
if logger
|
133
|
+
logger.error("Operator=#{operator.inspect}: #{e}")
|
134
|
+
else
|
135
|
+
raise "Operator=#{operator.inspect}: #{e}"
|
136
|
+
end
|
123
137
|
end
|
124
138
|
end
|
125
139
|
|
@@ -163,6 +177,17 @@ module SPARQL; module Algebra
|
|
163
177
|
@extensions ||= {}
|
164
178
|
end
|
165
179
|
|
180
|
+
##
|
181
|
+
# Is an extension function available?
|
182
|
+
#
|
183
|
+
# It's either a registered extension, or an XSD casting function
|
184
|
+
#
|
185
|
+
# @param [RDF::URI] function
|
186
|
+
# @return [Boolean]
|
187
|
+
def self.extension?(function)
|
188
|
+
function.to_s.start_with?(RDF::XSD.to_s) || self.extensions[function]
|
189
|
+
end
|
190
|
+
|
166
191
|
##
|
167
192
|
# Invoke an extension function.
|
168
193
|
#
|
@@ -70,28 +70,12 @@ class Array
|
|
70
70
|
# Returns a partial SPARQL grammar for this array.
|
71
71
|
#
|
72
72
|
# @param [String] delimiter (" ")
|
73
|
+
# If the first element is an IRI, treat it as an extension function
|
73
74
|
# @return [String]
|
74
|
-
def to_sparql(delimiter: " ",
|
75
|
+
def to_sparql(delimiter: " ", **options)
|
75
76
|
map {|e| e.to_sparql(**options)}.join(delimiter)
|
76
77
|
end
|
77
78
|
|
78
|
-
##
|
79
|
-
# Evaluates the array using the given variable `bindings`.
|
80
|
-
#
|
81
|
-
# In this case, the Array has two elements, the first of which is
|
82
|
-
# an XSD datatype, and the second is the expression to be evaluated.
|
83
|
-
# The result is cast as a literal of the appropriate type
|
84
|
-
#
|
85
|
-
# @param [RDF::Query::Solution] bindings
|
86
|
-
# a query solution containing zero or more variable bindings
|
87
|
-
# @param [Hash{Symbol => Object}] options ({})
|
88
|
-
# options passed from query
|
89
|
-
# @return [RDF::Term]
|
90
|
-
# @see SPARQL::Algebra::Expression.evaluate
|
91
|
-
def evaluate(bindings, **options)
|
92
|
-
SPARQL::Algebra::Expression.extension(*self.map {|o| o.evaluate(bindings, **options)})
|
93
|
-
end
|
94
|
-
|
95
79
|
##
|
96
80
|
# If `#execute` is invoked, it implies that a non-implemented Algebra operator
|
97
81
|
# is being invoked
|
@@ -302,7 +286,6 @@ module RDF::Term
|
|
302
286
|
end
|
303
287
|
end # RDF::Term
|
304
288
|
|
305
|
-
|
306
289
|
# Override RDF::Queryable to execute against SPARQL::Algebra::Query elements as well as RDF::Query and RDF::Pattern
|
307
290
|
module RDF::Queryable
|
308
291
|
alias_method :query_without_sparql, :query
|
@@ -390,15 +373,17 @@ class RDF::Statement
|
|
390
373
|
# @param [Boolean] as_statement (false) serialize as < ... >, otherwise TRIPLE(...)
|
391
374
|
# @return [String]
|
392
375
|
def to_sparql(as_statement: false, **options)
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
end
|
401
|
-
|
376
|
+
if as_statement
|
377
|
+
to_triple.map do |term|
|
378
|
+
if term.is_a?(::RDF::Statement)
|
379
|
+
"<<" + term.to_sparql(as_statement: true, **options) + ">>"
|
380
|
+
else
|
381
|
+
term.to_sparql(**options)
|
382
|
+
end
|
383
|
+
end.join(" ")
|
384
|
+
else
|
385
|
+
"TRIPLE(#{to_triple.to_sparql(as_statement: true, **options)})"
|
386
|
+
end
|
402
387
|
end
|
403
388
|
|
404
389
|
##
|
@@ -448,15 +433,34 @@ class RDF::Query
|
|
448
433
|
|
449
434
|
##
|
450
435
|
#
|
451
|
-
# Returns a partial SPARQL grammar for this
|
436
|
+
# Returns a partial SPARQL grammar for this query.
|
452
437
|
#
|
453
438
|
# @param [Boolean] top_level (true)
|
454
439
|
# Treat this as a top-level, generating SELECT ... WHERE {}
|
440
|
+
# @param [Array<Operator>] filter_ops ([])
|
441
|
+
# Filter Operations
|
455
442
|
# @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")
|
443
|
+
def to_sparql(top_level: true, filter_ops: [], **options)
|
444
|
+
str = @patterns.map { |e| e.to_sparql(as_statement: true, top_level: false, **options) }.join(". \n")
|
458
445
|
str = "GRAPH #{graph_name.to_sparql(**options)} {\n#{str}\n}\n" if graph_name
|
459
|
-
top_level
|
446
|
+
if top_level
|
447
|
+
SPARQL::Algebra::Operator.to_sparql(str, filter_ops: filter_ops, **options)
|
448
|
+
else
|
449
|
+
# Filters
|
450
|
+
filter_ops.each do |op|
|
451
|
+
str << "\nFILTER (#{op.to_sparql(**options)}) ."
|
452
|
+
end
|
453
|
+
|
454
|
+
# Extensons
|
455
|
+
extensions = options.fetch(:extensions, [])
|
456
|
+
extensions.each do |as, expression|
|
457
|
+
v = expression.to_sparql(as_statement: true, **options)
|
458
|
+
v = "<< #{v} >>" if expression.is_a?(RDF::Statement)
|
459
|
+
str << "\nBIND (" << v << " AS " << as.to_sparql(**options) << ") ."
|
460
|
+
end
|
461
|
+
str = "{#{str}}" unless filter_ops.empty? && extensions.empty?
|
462
|
+
str
|
463
|
+
end
|
460
464
|
end
|
461
465
|
|
462
466
|
##
|
@@ -79,7 +79,7 @@ module SPARQL; module Algebra
|
|
79
79
|
#
|
80
80
|
# @return [String]
|
81
81
|
def to_sparql(**options)
|
82
|
-
"#{operands.first.to_sparql(**options)}|#{operands.last.to_sparql(**options)}"
|
82
|
+
"(#{operands.first.to_sparql(**options)}|#{operands.last.to_sparql(**options)})"
|
83
83
|
end
|
84
84
|
end # Alt
|
85
85
|
end # Operator
|
@@ -54,7 +54,9 @@ module SPARQL; module Algebra
|
|
54
54
|
#
|
55
55
|
# @return [String]
|
56
56
|
def to_sparql(**options)
|
57
|
-
|
57
|
+
distinct = operands.first == :distinct
|
58
|
+
args = distinct ? operands[1..-1] : operands
|
59
|
+
"AVG(#{'DISTINCT ' if distinct}#{args.to_sparql(**options)})"
|
58
60
|
end
|
59
61
|
end # Avg
|
60
62
|
end # Operator
|
@@ -7,12 +7,20 @@ module SPARQL; module Algebra
|
|
7
7
|
#
|
8
8
|
# @example SPARQL Grammar
|
9
9
|
# PREFIX : <http://example/>
|
10
|
-
# SELECT * {
|
10
|
+
# SELECT * { ?s ?p ?o }
|
11
11
|
#
|
12
12
|
# @example SSE
|
13
13
|
# (prefix ((: <http://example/>))
|
14
14
|
# (bgp (triple ?s ?p ?o)))
|
15
15
|
#
|
16
|
+
# @example SPARQL Grammar (sparql-star)
|
17
|
+
# PREFIX : <http://example.com/ns#>
|
18
|
+
# SELECT * {<< :a :b :c >> :p1 :o1.}
|
19
|
+
#
|
20
|
+
# @example SSE (sparql-star)
|
21
|
+
# (prefix ((: <http://example.com/ns#>))
|
22
|
+
# (bgp (triple (triple :a :b :c) :p1 :o1)))
|
23
|
+
#
|
16
24
|
# @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
|
17
25
|
class BGP < Operator
|
18
26
|
NAME = [:bgp]
|
@@ -8,12 +8,18 @@ module SPARQL; module Algebra
|
|
8
8
|
#
|
9
9
|
# [32] Clear ::= 'CLEAR' 'SILENT'? GraphRefAll
|
10
10
|
#
|
11
|
-
# @example SPARQL Grammar
|
11
|
+
# @example SPARQL Grammar (SILENT DEFAULT)
|
12
12
|
# CLEAR SILENT DEFAULT
|
13
13
|
#
|
14
|
-
# @example SSE
|
14
|
+
# @example SSE (SILENT DEFAULT)
|
15
15
|
# (update (clear silent default))
|
16
16
|
#
|
17
|
+
# @example SPARQL Grammar (IRI)
|
18
|
+
# CLEAR GRAPH <http://example.com/>
|
19
|
+
#
|
20
|
+
# @example SSE (IRI)
|
21
|
+
# (update (clear <http://example.com/>))
|
22
|
+
#
|
17
23
|
# @see https://www.w3.org/TR/sparql11-update/#clear
|
18
24
|
class Clear < Operator
|
19
25
|
include SPARQL::Algebra::Update
|
@@ -70,7 +76,11 @@ module SPARQL; module Algebra
|
|
70
76
|
#
|
71
77
|
# @return [String]
|
72
78
|
def to_sparql(**options)
|
73
|
-
|
79
|
+
silent = operands.first == :silent
|
80
|
+
str = "CLEAR "
|
81
|
+
str << "SILENT " if operands.first == :silent
|
82
|
+
str << "GRAPH " if operands.last.is_a?(RDF::URI)
|
83
|
+
str << operands.last.to_sparql(**options)
|
74
84
|
end
|
75
85
|
end # Clear
|
76
86
|
end # Operator
|
@@ -99,7 +99,7 @@ module SPARQL; module Algebra
|
|
99
99
|
# @return [String]
|
100
100
|
def to_sparql(**options)
|
101
101
|
str = "CONSTRUCT {\n" +
|
102
|
-
operands[0].map { |e| e.to_sparql(as_statement: true, top_level: false, **options) }.join("\n") +
|
102
|
+
operands[0].map { |e| e.to_sparql(as_statement: true, top_level: false, **options) }.join(". \n") +
|
103
103
|
"\n}\n"
|
104
104
|
|
105
105
|
str << operands[1].to_sparql(top_level: true, project: nil, **options)
|
@@ -11,11 +11,39 @@ module SPARQL; module Algebra
|
|
11
11
|
# WHERE { ?S ?P ?O }
|
12
12
|
#
|
13
13
|
# @example SSE
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
14
|
+
# (prefix ((: <http://www.example.org/>))
|
15
|
+
# (project (?C)
|
16
|
+
# (extend ((?C ??.0))
|
17
|
+
# (group () ((??.0 (count ?O)))
|
18
|
+
# (bgp (triple ?S ?P ?O))))))
|
19
|
+
#
|
20
|
+
# @example SPARQL Grammar (count(*))
|
21
|
+
# PREFIX : <http://www.example.org>
|
22
|
+
#
|
23
|
+
# SELECT (COUNT(*) AS ?C)
|
24
|
+
# WHERE { ?S ?P ?O }
|
25
|
+
#
|
26
|
+
# @example SSE (count(*))
|
27
|
+
# (prefix
|
28
|
+
# ((: <http://www.example.org>))
|
29
|
+
# (project (?C)
|
30
|
+
# (extend ((?C ??.0))
|
31
|
+
# (group () ((??.0 (count)))
|
32
|
+
# (bgp (triple ?S ?P ?O))))))
|
33
|
+
#
|
34
|
+
# @example SPARQL Grammar (count(distinct *))
|
35
|
+
# PREFIX : <http://www.example.org>
|
36
|
+
#
|
37
|
+
# SELECT (COUNT(DISTINCT *) AS ?C)
|
38
|
+
# WHERE { ?S ?P ?O }
|
39
|
+
#
|
40
|
+
# @example SSE (count(distinct *))
|
41
|
+
# (prefix
|
42
|
+
# ((: <http://www.example.org>))
|
43
|
+
# (project (?C)
|
44
|
+
# (extend ((?C ??.0))
|
45
|
+
# (group () ((??.0 (count distinct)))
|
46
|
+
# (bgp (triple ?S ?P ?O))))))
|
19
47
|
#
|
20
48
|
# @see https://www.w3.org/TR/sparql11-query/#defn_aggCount
|
21
49
|
class Count < Operator
|
@@ -39,7 +67,9 @@ module SPARQL; module Algebra
|
|
39
67
|
#
|
40
68
|
# @return [String]
|
41
69
|
def to_sparql(**options)
|
42
|
-
|
70
|
+
distinct = operands.first == :distinct
|
71
|
+
args = distinct ? operands[1..-1] : operands
|
72
|
+
"COUNT(#{'DISTINCT ' if distinct}#{args.empty? ? '*' : args.to_sparql(**options)})"
|
43
73
|
end
|
44
74
|
end # Count
|
45
75
|
end # Operator
|
@@ -55,10 +55,11 @@ module SPARQL; module Algebra
|
|
55
55
|
#
|
56
56
|
# @return [String]
|
57
57
|
def to_sparql(**options)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
"
|
58
|
+
silent = operands.first == :silent
|
59
|
+
str = "CREATE "
|
60
|
+
str << "SILENT " if operands.first == :silent
|
61
|
+
str << "GRAPH " if operands.last.is_a?(RDF::URI)
|
62
|
+
str << operands.last.to_sparql(**options)
|
62
63
|
end
|
63
64
|
end # Create
|
64
65
|
end # Operator
|
@@ -73,7 +73,7 @@ module SPARQL; module Algebra
|
|
73
73
|
# @example Dataset with two default data sources
|
74
74
|
#
|
75
75
|
# (prefix ((: <http://example/>))
|
76
|
-
# (dataset (<data-g1.ttl> <data-
|
76
|
+
# (dataset (<data-g1.ttl> <data-g2.ttl)
|
77
77
|
# (bgp (triple ?s ?p ?o))))
|
78
78
|
#
|
79
79
|
# is effectively re-written to the following:
|
@@ -101,7 +101,21 @@ module SPARQL; module Algebra
|
|
101
101
|
# (filter ((= ?g <data-g1.ttl>) || (= ?g <data-g2.ttl>))
|
102
102
|
# (graph ?g (bgp (triple ?s ?p ?o))))))
|
103
103
|
#
|
104
|
-
#
|
104
|
+
#
|
105
|
+
# @example SPARQL Grammar
|
106
|
+
# BASE <http://example.org/>
|
107
|
+
# PREFIX : <http://example.com/>
|
108
|
+
#
|
109
|
+
# SELECT *
|
110
|
+
# FROM <data-g1.ttl>
|
111
|
+
# { ?s ?p ?o }
|
112
|
+
#
|
113
|
+
# @example SSE
|
114
|
+
# (base <http://example.org/>
|
115
|
+
# (prefix ((: <http://example.com/>))
|
116
|
+
# (dataset (<data-g1.ttl>)
|
117
|
+
# (bgp (triple ?s ?p ?o)))))
|
118
|
+
#
|
105
119
|
# @see https://www.w3.org/TR/sparql11-query/#specifyingDataset
|
106
120
|
class Dataset < Binary
|
107
121
|
include Query
|
@@ -163,17 +177,11 @@ module SPARQL; module Algebra
|
|
163
177
|
#
|
164
178
|
# Returns a partial SPARQL grammar for this operator.
|
165
179
|
#
|
180
|
+
# Extracts datasets
|
181
|
+
#
|
166
182
|
# @return [String]
|
167
183
|
def to_sparql(**options)
|
168
|
-
operands
|
169
|
-
str << if graph.is_a?(Array)
|
170
|
-
"FROM #{graph[0].upcase} #{graph[1].to_sparql(**options)}\n"
|
171
|
-
else
|
172
|
-
"FROM #{graph.to_sparql(**options)}\n"
|
173
|
-
end
|
174
|
-
end.tap do |str|
|
175
|
-
str << operands[1].to_sparql(**options)
|
176
|
-
end
|
184
|
+
operands.last.to_sparql(datasets: operands.first, **options)
|
177
185
|
end
|
178
186
|
end # Dataset
|
179
187
|
end # Operator
|
@@ -75,7 +75,9 @@ module SPARQL; module Algebra
|
|
75
75
|
#
|
76
76
|
# @return [String]
|
77
77
|
def to_sparql(**options)
|
78
|
-
"DELETE {\n" +
|
78
|
+
"DELETE {\n" +
|
79
|
+
operands.first.to_sparql(as_statement: true, delimiter: " .\n", **options) +
|
80
|
+
"\n}"
|
79
81
|
end
|
80
82
|
end # Delete
|
81
83
|
end # Operator
|
@@ -54,7 +54,7 @@ module SPARQL; module Algebra
|
|
54
54
|
# @return [String]
|
55
55
|
def to_sparql(**options)
|
56
56
|
"DELETE DATA {\n" +
|
57
|
-
operands.first.to_sparql(as_statement: true, top_level: false, delimiter: "\n", **options) +
|
57
|
+
operands.first.to_sparql(as_statement: true, top_level: false, delimiter: ". \n", **options) +
|
58
58
|
"\n}"
|
59
59
|
end
|
60
60
|
end # DeleteData
|
@@ -71,7 +71,7 @@ module SPARQL; module Algebra
|
|
71
71
|
# @return [String]
|
72
72
|
def to_sparql(**options)
|
73
73
|
"DELETE WHERE {\n" +
|
74
|
-
operands.first.to_sparql(as_statement: true, top_level: false, delimiter: "\n", **options) +
|
74
|
+
operands.first.to_sparql(as_statement: true, top_level: false, delimiter: ". \n", **options) +
|
75
75
|
"\n}"
|
76
76
|
end
|
77
77
|
end # DeleteWhere
|
@@ -12,8 +12,8 @@ module SPARQL; module Algebra
|
|
12
12
|
# WHERE { ?x ?p ?v }
|
13
13
|
#
|
14
14
|
# @example SSE
|
15
|
-
# (prefix ((
|
16
|
-
# (: <http://
|
15
|
+
# (prefix ((: <http://example.org/>)
|
16
|
+
# (xsd: <http://www.w3.org/2001/XMLSchema#>))
|
17
17
|
# (distinct
|
18
18
|
# (project (?v)
|
19
19
|
# (bgp (triple ?x ?p ?v)))))
|
@@ -60,7 +60,7 @@ module SPARQL; module Algebra
|
|
60
60
|
#
|
61
61
|
# @return [String]
|
62
62
|
def to_sparql(**options)
|
63
|
-
"#{operands.first.to_sparql(**options)} / #{operands.last.to_sparql(**options)}"
|
63
|
+
"(#{operands.first.to_sparql(**options)} / #{operands.last.to_sparql(**options)})"
|
64
64
|
end
|
65
65
|
end # Divide
|
66
66
|
end # Operator
|
@@ -10,12 +10,18 @@ module SPARQL; module Algebra
|
|
10
10
|
#
|
11
11
|
# [33] Drop ::= 'DROP' 'SILENT'? GraphRefAll
|
12
12
|
#
|
13
|
-
# @example SPARQL Grammar
|
14
|
-
# DROP DEFAULT
|
13
|
+
# @example SPARQL Grammar (SILENT DEFAULT)
|
14
|
+
# DROP SILENT DEFAULT
|
15
15
|
#
|
16
|
-
# @example SSE
|
16
|
+
# @example SSE (SILENT DEFAULT)
|
17
17
|
# (update
|
18
|
-
# (drop default))
|
18
|
+
# (drop silent default))
|
19
|
+
#
|
20
|
+
# @example SPARQL Grammar (IRI)
|
21
|
+
# DROP GRAPH <http://example.com/>
|
22
|
+
#
|
23
|
+
# @example SSE (IRI)
|
24
|
+
# (update (drop <http://example.com/>))
|
19
25
|
#
|
20
26
|
# @see https://www.w3.org/TR/sparql11-update/#drop
|
21
27
|
class Drop < Operator
|
@@ -40,7 +46,6 @@ module SPARQL; module Algebra
|
|
40
46
|
def execute(queryable, **options)
|
41
47
|
debug(options) {"Drop"}
|
42
48
|
silent = operands.first == :silent
|
43
|
-
silent = operands.first == :silent
|
44
49
|
operands.shift if silent
|
45
50
|
|
46
51
|
raise ArgumentError, "drop expected operand to be 'default', 'named', 'all', or an IRI" unless operands.length == 1
|
@@ -74,7 +79,11 @@ module SPARQL; module Algebra
|
|
74
79
|
#
|
75
80
|
# @return [String]
|
76
81
|
def to_sparql(**options)
|
77
|
-
|
82
|
+
silent = operands.first == :silent
|
83
|
+
str = "DROP "
|
84
|
+
str << "SILENT " if operands.first == :silent
|
85
|
+
str << "GRAPH " if operands.last.is_a?(RDF::URI)
|
86
|
+
str << operands.last.to_sparql(**options)
|
78
87
|
end
|
79
88
|
end # Drop
|
80
89
|
end # Operator
|
@@ -9,15 +9,13 @@ module SPARQL; module Algebra
|
|
9
9
|
#
|
10
10
|
# @example SPARQL Grammar
|
11
11
|
# PREFIX : <http://example.org/>
|
12
|
-
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
13
12
|
# SELECT ?s ?str (ENCODE_FOR_URI(?str) AS ?encoded) WHERE {
|
14
13
|
# ?s :str ?str
|
15
14
|
# }
|
16
15
|
#
|
17
16
|
# @example SSE
|
18
|
-
# (prefix
|
19
|
-
# ((
|
20
|
-
# (project (?str ?encoded)
|
17
|
+
# (prefix ((: <http://example.org/>))
|
18
|
+
# (project (?s ?str ?encoded)
|
21
19
|
# (extend ((?encoded (encode_for_uri ?str)))
|
22
20
|
# (bgp (triple ?s :str ?str)))))
|
23
21
|
#
|
@@ -8,6 +8,8 @@ module SPARQL; module Algebra
|
|
8
8
|
# [72] ExpressionList ::= NIL | '(' Expression ( ',' Expression )* ')'
|
9
9
|
#
|
10
10
|
# @example SPARQL Grammar
|
11
|
+
# PREFIX : <http://example.org/>
|
12
|
+
#
|
11
13
|
# SELECT ?v ?w
|
12
14
|
# {
|
13
15
|
# FILTER (?v = 2)
|
@@ -17,7 +19,7 @@ module SPARQL; module Algebra
|
|
17
19
|
# }
|
18
20
|
#
|
19
21
|
# @example SSE
|
20
|
-
# (prefix ((: <http://example/>))
|
22
|
+
# (prefix ((: <http://example.org/>))
|
21
23
|
# (project (?v ?w)
|
22
24
|
# (filter (exprlist (= ?v 2) (= ?w 3))
|
23
25
|
# (bgp
|
@@ -10,14 +10,47 @@ module SPARQL; module Algebra
|
|
10
10
|
# @example SPARQL Grammar
|
11
11
|
# SELECT ?z
|
12
12
|
# {
|
13
|
-
# ?x <http://example/p> ?o
|
14
|
-
# BIND(?o+
|
13
|
+
# ?x <http://example.org/p> ?o
|
14
|
+
# BIND(?o+10 AS ?z)
|
15
15
|
# }
|
16
16
|
#
|
17
17
|
# @example SSE
|
18
18
|
# (project (?z)
|
19
19
|
# (extend ((?z (+ ?o 10)))
|
20
|
-
# (bgp (triple ?
|
20
|
+
# (bgp (triple ?x <http://example.org/p> ?o))))
|
21
|
+
#
|
22
|
+
# @example SPARQL Grammar (cast as boolean)
|
23
|
+
# PREFIX : <http://example.org/>
|
24
|
+
# PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
|
25
|
+
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
26
|
+
# SELECT ?a ?v (xsd:boolean(?v) AS ?boolean)
|
27
|
+
# WHERE { ?a :p ?v . }
|
28
|
+
#
|
29
|
+
# @example SSE (cast as boolean)
|
30
|
+
# (prefix ((: <http://example.org/>)
|
31
|
+
# (rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
|
32
|
+
# (xsd: <http://www.w3.org/2001/XMLSchema#>))
|
33
|
+
# (project (?a ?v ?boolean)
|
34
|
+
# (extend ((?boolean (xsd:boolean ?v)))
|
35
|
+
# (bgp (triple ?a :p ?v)))))
|
36
|
+
#
|
37
|
+
# @example SPARQL Grammar (inner bind)
|
38
|
+
# PREFIX : <http://example.org/>
|
39
|
+
#
|
40
|
+
# SELECT ?z ?s1
|
41
|
+
# {
|
42
|
+
# ?s ?p ?o .
|
43
|
+
# BIND(?o+1 AS ?z)
|
44
|
+
# ?s1 ?p1 ?z
|
45
|
+
# }
|
46
|
+
#
|
47
|
+
# @example SSE (inner bind)
|
48
|
+
# (prefix ((: <http://example.org/>))
|
49
|
+
# (project (?z ?s1)
|
50
|
+
# (join
|
51
|
+
# (extend ((?z (+ ?o 1)))
|
52
|
+
# (bgp (triple ?s ?p ?o)))
|
53
|
+
# (bgp (triple ?s1 ?p1 ?z)))))
|
21
54
|
#
|
22
55
|
# @see https://www.w3.org/TR/sparql11-query/#evaluation
|
23
56
|
class Extend < Operator::Binary
|
@@ -89,7 +89,7 @@ module SPARQL; module Algebra
|
|
89
89
|
# @return [String]
|
90
90
|
def to_sparql(**options)
|
91
91
|
filter_ops = operands.first.is_a?(Operator::Exprlist) ? operands.first.operands : [operands.first]
|
92
|
-
operands.last.to_sparql(filter_ops: filter_ops, **options)
|
92
|
+
str = operands.last.to_sparql(filter_ops: filter_ops, **options)
|
93
93
|
end
|
94
94
|
end # Filter
|
95
95
|
end # Operator
|