sparql 3.1.6 → 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 +31 -22
- data/VERSION +1 -1
- data/bin/sparql +14 -4
- data/lib/sparql/algebra/aggregate.rb +1 -1
- data/lib/sparql/algebra/evaluatable.rb +4 -4
- data/lib/sparql/algebra/expression.rb +28 -3
- data/lib/sparql/algebra/extensions.rb +109 -45
- data/lib/sparql/algebra/operator/abs.rb +23 -3
- 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 +20 -2
- data/lib/sparql/algebra/operator/base.rb +18 -1
- data/lib/sparql/algebra/operator/bgp.rb +13 -1
- data/lib/sparql/algebra/operator/bnode.rb +34 -11
- data/lib/sparql/algebra/operator/bound.rb +22 -1
- data/lib/sparql/algebra/operator/ceil.rb +26 -3
- data/lib/sparql/algebra/operator/clear.rb +26 -2
- data/lib/sparql/algebra/operator/coalesce.rb +33 -11
- data/lib/sparql/algebra/operator/compare.rb +48 -40
- 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 +25 -3
- data/lib/sparql/algebra/operator/copy.rb +19 -2
- data/lib/sparql/algebra/operator/count.rb +53 -7
- data/lib/sparql/algebra/operator/create.rb +20 -2
- data/lib/sparql/algebra/operator/dataset.rb +27 -2
- data/lib/sparql/algebra/operator/datatype.rb +26 -7
- data/lib/sparql/algebra/operator/day.rb +24 -6
- data/lib/sparql/algebra/operator/delete.rb +29 -2
- data/lib/sparql/algebra/operator/delete_data.rb +23 -2
- data/lib/sparql/algebra/operator/delete_where.rb +24 -2
- data/lib/sparql/algebra/operator/desc.rb +20 -1
- data/lib/sparql/algebra/operator/describe.rb +27 -4
- data/lib/sparql/algebra/operator/distinct.rb +20 -3
- data/lib/sparql/algebra/operator/divide.rb +27 -3
- data/lib/sparql/algebra/operator/drop.rb +27 -3
- data/lib/sparql/algebra/operator/encode_for_uri.rb +23 -3
- data/lib/sparql/algebra/operator/equal.rb +13 -3
- data/lib/sparql/algebra/operator/exists.rb +28 -4
- data/lib/sparql/algebra/operator/exprlist.rb +15 -2
- data/lib/sparql/algebra/operator/extend.rb +64 -6
- data/lib/sparql/algebra/operator/filter.rb +27 -5
- data/lib/sparql/algebra/operator/floor.rb +26 -3
- data/lib/sparql/algebra/operator/function_call.rb +64 -0
- data/lib/sparql/algebra/operator/graph.rb +69 -6
- data/lib/sparql/algebra/operator/greater_than.rb +14 -4
- data/lib/sparql/algebra/operator/greater_than_or_equal.rb +14 -4
- data/lib/sparql/algebra/operator/group.rb +105 -8
- data/lib/sparql/algebra/operator/group_concat.rb +44 -8
- data/lib/sparql/algebra/operator/hours.rb +24 -6
- data/lib/sparql/algebra/operator/if.rb +20 -3
- data/lib/sparql/algebra/operator/in.rb +18 -1
- data/lib/sparql/algebra/operator/insert.rb +24 -2
- data/lib/sparql/algebra/operator/insert_data.rb +23 -2
- data/lib/sparql/algebra/operator/iri.rb +22 -5
- data/lib/sparql/algebra/operator/is_blank.rb +21 -4
- data/lib/sparql/algebra/operator/is_iri.rb +21 -4
- data/lib/sparql/algebra/operator/is_literal.rb +21 -4
- data/lib/sparql/algebra/operator/is_numeric.rb +23 -6
- data/lib/sparql/algebra/operator/is_triple.rb +33 -1
- data/lib/sparql/algebra/operator/join.rb +56 -1
- data/lib/sparql/algebra/operator/lang.rb +26 -1
- data/lib/sparql/algebra/operator/lang_matches.rb +23 -2
- data/lib/sparql/algebra/operator/lcase.rb +23 -3
- data/lib/sparql/algebra/operator/left_join.rb +42 -1
- data/lib/sparql/algebra/operator/less_than.rb +14 -4
- data/lib/sparql/algebra/operator/less_than_or_equal.rb +14 -4
- data/lib/sparql/algebra/operator/load.rb +25 -2
- data/lib/sparql/algebra/operator/max.rb +20 -2
- data/lib/sparql/algebra/operator/md5.rb +23 -6
- data/lib/sparql/algebra/operator/min.rb +22 -4
- data/lib/sparql/algebra/operator/minus.rb +65 -7
- data/lib/sparql/algebra/operator/minutes.rb +24 -6
- data/lib/sparql/algebra/operator/modify.rb +41 -5
- data/lib/sparql/algebra/operator/month.rb +24 -6
- data/lib/sparql/algebra/operator/move.rb +20 -2
- data/lib/sparql/algebra/operator/multiply.rb +27 -4
- data/lib/sparql/algebra/operator/negate.rb +24 -4
- data/lib/sparql/algebra/operator/not.rb +25 -4
- data/lib/sparql/algebra/operator/not_equal.rb +16 -1
- data/lib/sparql/algebra/operator/notexists.rb +30 -6
- data/lib/sparql/algebra/operator/notin.rb +20 -3
- data/lib/sparql/algebra/operator/notoneof.rb +21 -2
- data/lib/sparql/algebra/operator/now.rb +25 -6
- data/lib/sparql/algebra/operator/object.rb +33 -1
- data/lib/sparql/algebra/operator/or.rb +26 -3
- data/lib/sparql/algebra/operator/order.rb +71 -2
- 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 +43 -4
- data/lib/sparql/algebra/operator/predicate.rb +33 -1
- data/lib/sparql/algebra/operator/prefix.rb +24 -3
- data/lib/sparql/algebra/operator/project.rb +69 -5
- data/lib/sparql/algebra/operator/rand.rb +31 -3
- data/lib/sparql/algebra/operator/reduced.rb +20 -3
- data/lib/sparql/algebra/operator/regex.rb +27 -19
- data/lib/sparql/algebra/operator/replace.rb +27 -7
- data/lib/sparql/algebra/operator/reverse.rb +31 -2
- data/lib/sparql/algebra/operator/round.rb +26 -3
- data/lib/sparql/algebra/operator/same_term.rb +25 -7
- data/lib/sparql/algebra/operator/sample.rb +33 -9
- data/lib/sparql/algebra/operator/seconds.rb +24 -6
- data/lib/sparql/algebra/operator/seq.rb +20 -2
- data/lib/sparql/algebra/operator/sequence.rb +4 -11
- data/lib/sparql/algebra/operator/sha1.rb +19 -2
- data/lib/sparql/algebra/operator/sha256.rb +19 -2
- data/lib/sparql/algebra/operator/sha384.rb +19 -2
- data/lib/sparql/algebra/operator/sha512.rb +19 -2
- data/lib/sparql/algebra/operator/slice.rb +27 -5
- data/lib/sparql/algebra/operator/str.rb +22 -2
- data/lib/sparql/algebra/operator/strafter.rb +26 -3
- data/lib/sparql/algebra/operator/strbefore.rb +26 -3
- data/lib/sparql/algebra/operator/strdt.rb +23 -2
- data/lib/sparql/algebra/operator/strends.rb +26 -4
- data/lib/sparql/algebra/operator/strlang.rb +25 -7
- data/lib/sparql/algebra/operator/strlen.rb +24 -3
- data/lib/sparql/algebra/operator/strstarts.rb +26 -3
- data/lib/sparql/algebra/operator/struuid.rb +30 -10
- data/lib/sparql/algebra/operator/subject.rb +33 -1
- data/lib/sparql/algebra/operator/substr.rb +24 -3
- data/lib/sparql/algebra/operator/subtract.rb +29 -3
- data/lib/sparql/algebra/operator/sum.rb +25 -7
- data/lib/sparql/algebra/operator/table.rb +76 -4
- data/lib/sparql/algebra/operator/timezone.rb +24 -6
- data/lib/sparql/algebra/operator/tz.rb +23 -6
- data/lib/sparql/algebra/operator/ucase.rb +24 -3
- data/lib/sparql/algebra/operator/union.rb +29 -6
- data/lib/sparql/algebra/operator/update.rb +46 -4
- data/lib/sparql/algebra/operator/using.rb +49 -2
- data/lib/sparql/algebra/operator/uuid.rb +28 -9
- data/lib/sparql/algebra/operator/with.rb +38 -4
- data/lib/sparql/algebra/operator/year.rb +24 -6
- data/lib/sparql/algebra/operator.rb +135 -14
- data/lib/sparql/algebra/sxp_extensions.rb +3 -3
- data/lib/sparql/algebra.rb +20 -3
- data/lib/sparql/grammar/meta.rb +1103 -907
- data/lib/sparql/grammar/parser11.rb +63 -56
- metadata +43 -29
- data/lib/sparql/algebra/operator/triple.rb +0 -27
@@ -6,8 +6,13 @@ module SPARQL; module Algebra
|
|
6
6
|
#
|
7
7
|
# The COPY operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, but data from the destination graph, if any, is removed before insertion.
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# [37] Copy ::= 'COPY' 'SILENT'? GraphOrDefault 'TO' GraphOrDefault
|
10
|
+
#
|
11
|
+
# @example SPARQL Grammar
|
12
|
+
# COPY SILENT GRAPH <http://www.example.com/g1> TO DEFAULT
|
13
|
+
#
|
14
|
+
# @example SSE
|
15
|
+
# (update (copy silent <http://www.example.com/g1> default))
|
11
16
|
#
|
12
17
|
# @see https://www.w3.org/TR/sparql11-update/#copy
|
13
18
|
class Copy < Operator
|
@@ -59,6 +64,18 @@ module SPARQL; module Algebra
|
|
59
64
|
end
|
60
65
|
queryable
|
61
66
|
end
|
67
|
+
|
68
|
+
##
|
69
|
+
#
|
70
|
+
# Returns a partial SPARQL grammar for this operator.
|
71
|
+
#
|
72
|
+
# @return [String]
|
73
|
+
def to_sparql(**options)
|
74
|
+
*args, last = operands.dup
|
75
|
+
args += [:TO, last]
|
76
|
+
|
77
|
+
"COPY " + args.to_sparql(**options)
|
78
|
+
end
|
62
79
|
end # Copy
|
63
80
|
end # Operator
|
64
81
|
end; end # SPARQL::Algebra
|
@@ -3,12 +3,47 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `count` set function.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
6
|
+
# [127] Aggregate::= 'COUNT' '(' 'DISTINCT'? ( '*' | Expression ) ')' ...
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://www.example.org/>
|
10
|
+
# SELECT (COUNT(?O) AS ?C)
|
11
|
+
# WHERE { ?S ?P ?O }
|
12
|
+
#
|
13
|
+
# @example SSE
|
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))))))
|
12
47
|
#
|
13
48
|
# @see https://www.w3.org/TR/sparql11-query/#defn_aggCount
|
14
49
|
class Count < Operator
|
@@ -22,9 +57,20 @@ module SPARQL; module Algebra
|
|
22
57
|
# @param [Enumerable<Array<RDF::Term>>] enum
|
23
58
|
# enum of evaluated operand
|
24
59
|
# @return [RDF::Literal::Integer] The number of non-error terms in the multiset
|
25
|
-
def apply(enum)
|
60
|
+
def apply(enum, **options)
|
26
61
|
RDF::Literal(enum.length)
|
27
62
|
end
|
63
|
+
|
64
|
+
##
|
65
|
+
#
|
66
|
+
# Returns a partial SPARQL grammar for this operator.
|
67
|
+
#
|
68
|
+
# @return [String]
|
69
|
+
def to_sparql(**options)
|
70
|
+
distinct = operands.first == :distinct
|
71
|
+
args = distinct ? operands[1..-1] : operands
|
72
|
+
"COUNT(#{'DISTINCT ' if distinct}#{args.empty? ? '*' : args.to_sparql(**options)})"
|
73
|
+
end
|
28
74
|
end # Count
|
29
75
|
end # Operator
|
30
76
|
end; end # SPARQL::Algebra
|
@@ -8,8 +8,13 @@ module SPARQL; module Algebra
|
|
8
8
|
#
|
9
9
|
# This is a no-op for RDF.rb implementations, unless the graph exists
|
10
10
|
#
|
11
|
-
#
|
12
|
-
#
|
11
|
+
# [34] Create ::= 'CREATE' 'SILENT'? GraphRef
|
12
|
+
#
|
13
|
+
# @example SPARQL Grammar
|
14
|
+
# CREATE SILENT GRAPH <http://example.org/g1>
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (update (create silent <http://example.org/g1>))
|
13
18
|
#
|
14
19
|
# @see https://www.w3.org/TR/sparql11-update/#create
|
15
20
|
class Create < Operator
|
@@ -43,6 +48,19 @@ module SPARQL; module Algebra
|
|
43
48
|
end
|
44
49
|
queryable
|
45
50
|
end
|
51
|
+
|
52
|
+
##
|
53
|
+
#
|
54
|
+
# Returns a partial SPARQL grammar for this operator.
|
55
|
+
#
|
56
|
+
# @return [String]
|
57
|
+
def to_sparql(**options)
|
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)
|
63
|
+
end
|
46
64
|
end # Create
|
47
65
|
end # Operator
|
48
66
|
end; end # SPARQL::Algebra
|
@@ -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
|
@@ -158,6 +172,17 @@ module SPARQL; module Algebra
|
|
158
172
|
aggregate.default(*default_datasets.select {|name| queryable.has_graph?(name)})
|
159
173
|
aggregate.query(operands.last, depth: options[:depth].to_i + 1, **options, &base)
|
160
174
|
end
|
175
|
+
|
176
|
+
##
|
177
|
+
#
|
178
|
+
# Returns a partial SPARQL grammar for this operator.
|
179
|
+
#
|
180
|
+
# Extracts datasets
|
181
|
+
#
|
182
|
+
# @return [String]
|
183
|
+
def to_sparql(**options)
|
184
|
+
operands.last.to_sparql(datasets: operands.first, **options)
|
185
|
+
end
|
161
186
|
end # Dataset
|
162
187
|
end # Operator
|
163
188
|
end; end # SPARQL::Algebra
|
@@ -3,13 +3,23 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `datatype` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'DATATYPE' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
10
|
+
# PREFIX : <http://example.org/things#>
|
11
|
+
# SELECT ?x ?v
|
12
|
+
# WHERE
|
13
|
+
# { ?x :p ?v .
|
14
|
+
# FILTER ( datatype(?v) = xsd:double ) .
|
15
|
+
# }
|
16
|
+
#
|
17
|
+
# @example SSE
|
7
18
|
# (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
|
8
|
-
# (
|
9
|
-
#
|
10
|
-
# (
|
11
|
-
#
|
12
|
-
# (bgp (triple ?s :p ?v)))))
|
19
|
+
# (: <http://example.org/things#>))
|
20
|
+
# (project (?x ?v)
|
21
|
+
# (filter (= (datatype ?v) xsd:double)
|
22
|
+
# (bgp (triple ?x :p ?v)))))
|
13
23
|
#
|
14
24
|
# @see https://www.w3.org/TR/sparql11-query/#func-datatype
|
15
25
|
class Datatype < Operator::Unary
|
@@ -27,12 +37,21 @@ module SPARQL; module Algebra
|
|
27
37
|
# a typed or simple literal
|
28
38
|
# @return [RDF::URI] the datatype IRI, or `xsd:string` for simple literals
|
29
39
|
# @raise [TypeError] if the operand is not a typed or simple literal
|
30
|
-
def apply(literal)
|
40
|
+
def apply(literal, **options)
|
31
41
|
case literal
|
32
42
|
when RDF::Literal then literal.datatype
|
33
43
|
else raise TypeError, "expected an RDF::Literal, but got #{literal.inspect}"
|
34
44
|
end
|
35
45
|
end
|
46
|
+
|
47
|
+
##
|
48
|
+
#
|
49
|
+
# Returns a partial SPARQL grammar for this operator.
|
50
|
+
#
|
51
|
+
# @return [String]
|
52
|
+
def to_sparql(**options)
|
53
|
+
"DATATYPE(#{operands.last.to_sparql(**options)})"
|
54
|
+
end
|
36
55
|
end # Datatype
|
37
56
|
end # Operator
|
38
57
|
end; end # SPARQL::Algebra
|
@@ -3,11 +3,20 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL logical `day` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'DAY' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# SELECT ?s (DAY(?date) AS ?x) WHERE {
|
11
|
+
# ?s :date ?date
|
12
|
+
# }
|
13
|
+
#
|
14
|
+
# @example SSE
|
15
|
+
# (prefix
|
16
|
+
# ((: <http://example.org/>))
|
17
|
+
# (project (?s ?x)
|
18
|
+
# (extend ((?x (day ?date)))
|
19
|
+
# (bgp (triple ?s :date ?date)))))
|
11
20
|
#
|
12
21
|
# @see https://www.w3.org/TR/sparql11-query/#func-day
|
13
22
|
class Day < Operator::Unary
|
@@ -22,10 +31,19 @@ module SPARQL; module Algebra
|
|
22
31
|
# the operand
|
23
32
|
# @return [RDF::Literal]
|
24
33
|
# @raise [TypeError] if the operand is not a simple literal
|
25
|
-
def apply(operand)
|
34
|
+
def apply(operand, **options)
|
26
35
|
raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
|
27
36
|
RDF::Literal(operand.object.day)
|
28
37
|
end
|
38
|
+
|
39
|
+
##
|
40
|
+
#
|
41
|
+
# Returns a partial SPARQL grammar for this operator.
|
42
|
+
#
|
43
|
+
# @return [String]
|
44
|
+
def to_sparql(**options)
|
45
|
+
"DAY(#{operands.last.to_sparql(**options)})"
|
46
|
+
end
|
29
47
|
end # Day
|
30
48
|
end # Operator
|
31
49
|
end; end # SPARQL::Algebra
|
@@ -6,8 +6,24 @@ module SPARQL; module Algebra
|
|
6
6
|
#
|
7
7
|
# The DELETE operation is a form of the DELETE/INSERT operation having no INSERT section
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# [42] DeleteClause ::= 'DELETE' QuadPattern
|
10
|
+
#
|
11
|
+
# @example SPARQL Grammar
|
12
|
+
# PREFIX : <http://example.org/>
|
13
|
+
# PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
14
|
+
#
|
15
|
+
# DELETE { ?s ?p ?o }
|
16
|
+
# WHERE { :a foaf:knows ?s . ?s ?p ?o }
|
17
|
+
#
|
18
|
+
# @example SSE
|
19
|
+
# (prefix ((: <http://example.org/>)
|
20
|
+
# (foaf: <http://xmlns.com/foaf/0.1/>))
|
21
|
+
# (update
|
22
|
+
# (modify
|
23
|
+
# (bgp
|
24
|
+
# (triple :a foaf:knows ?s)
|
25
|
+
# (triple ?s ?p ?o))
|
26
|
+
# (delete ((triple ?s ?p ?o))))))
|
11
27
|
#
|
12
28
|
# @see https://www.w3.org/TR/sparql11-update/#delete
|
13
29
|
class Delete < Operator::Unary
|
@@ -52,6 +68,17 @@ module SPARQL; module Algebra
|
|
52
68
|
end
|
53
69
|
queryable
|
54
70
|
end
|
71
|
+
|
72
|
+
##
|
73
|
+
#
|
74
|
+
# Returns a partial SPARQL grammar for this term.
|
75
|
+
#
|
76
|
+
# @return [String]
|
77
|
+
def to_sparql(**options)
|
78
|
+
"DELETE {\n" +
|
79
|
+
operands.first.to_sparql(as_statement: true, delimiter: " .\n", **options) +
|
80
|
+
"\n}"
|
81
|
+
end
|
55
82
|
end # Delete
|
56
83
|
end # Operator
|
57
84
|
end; end # SPARQL::Algebra
|
@@ -6,8 +6,18 @@ module SPARQL; module Algebra
|
|
6
6
|
#
|
7
7
|
# The DELETE DATA operation removes some triples, given inline in the request, if the respective graphs in the Graph Store contain those
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# [39] DeleteData ::= 'DELETE DATA' QuadData
|
10
|
+
#
|
11
|
+
# @example SPARQL Grammar
|
12
|
+
# PREFIX : <http://example.org/>
|
13
|
+
# PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
14
|
+
# DELETE DATA {
|
15
|
+
# :a foaf:knows :b .
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
# @example SSE
|
19
|
+
# (prefix ((: <http://example.org/>) (foaf: <http://xmlns.com/foaf/0.1/>))
|
20
|
+
# (update (deleteData ((triple :a foaf:knows :b)))))
|
11
21
|
#
|
12
22
|
# @see https://www.w3.org/TR/sparql11-update/#deleteData
|
13
23
|
class DeleteData < Operator::Unary
|
@@ -36,6 +46,17 @@ module SPARQL; module Algebra
|
|
36
46
|
end
|
37
47
|
queryable
|
38
48
|
end
|
49
|
+
|
50
|
+
##
|
51
|
+
#
|
52
|
+
# Returns a partial SPARQL grammar for this term.
|
53
|
+
#
|
54
|
+
# @return [String]
|
55
|
+
def to_sparql(**options)
|
56
|
+
"DELETE DATA {\n" +
|
57
|
+
operands.first.to_sparql(as_statement: true, top_level: false, delimiter: ". \n", **options) +
|
58
|
+
"\n}"
|
59
|
+
end
|
39
60
|
end # DeleteData
|
40
61
|
end # Operator
|
41
62
|
end; end # SPARQL::Algebra
|
@@ -6,8 +6,19 @@ module SPARQL; module Algebra
|
|
6
6
|
#
|
7
7
|
# The DELETE WHERE operation is a shortcut form for the DELETE/INSERT operation where bindings matched by the WHERE clause are used to define the triples in a graph that will be deleted.
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# [40] DeleteWhere ::= 'DELETE WHERE' QuadPattern
|
10
|
+
#
|
11
|
+
# @example SPARQL Grammar
|
12
|
+
# PREFIX : <http://example.org/>
|
13
|
+
# PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
14
|
+
# DELETE WHERE { :a foaf:knows ?b }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix
|
18
|
+
# ((: <http://example.org/>)
|
19
|
+
# (foaf: <http://xmlns.com/foaf/0.1/>))
|
20
|
+
# (update
|
21
|
+
# (deleteWhere ((triple :a foaf:knows ?b)))))
|
11
22
|
#
|
12
23
|
# @see https://www.w3.org/TR/sparql11-update/#deleteWhere
|
13
24
|
class DeleteWhere < Operator::Unary
|
@@ -52,6 +63,17 @@ module SPARQL; module Algebra
|
|
52
63
|
end
|
53
64
|
queryable
|
54
65
|
end
|
66
|
+
|
67
|
+
##
|
68
|
+
#
|
69
|
+
# Returns a partial SPARQL grammar for this term.
|
70
|
+
#
|
71
|
+
# @return [String]
|
72
|
+
def to_sparql(**options)
|
73
|
+
"DELETE WHERE {\n" +
|
74
|
+
operands.first.to_sparql(as_statement: true, top_level: false, delimiter: ". \n", **options) +
|
75
|
+
"\n}"
|
76
|
+
end
|
55
77
|
end # DeleteWhere
|
56
78
|
end # Operator
|
57
79
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,15 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL descending sort operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var )
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
10
|
+
# SELECT ?name
|
11
|
+
# WHERE { ?x foaf:name ?name }
|
12
|
+
# ORDER BY DESC(?name)
|
13
|
+
#
|
14
|
+
# @example SSE
|
7
15
|
# (prefix ((foaf: <http://xmlns.com/foaf/0.1/>))
|
8
16
|
# (project (?name)
|
9
17
|
# (order ((desc ?name))
|
@@ -12,6 +20,17 @@ module SPARQL; module Algebra
|
|
12
20
|
# @see https://www.w3.org/TR/sparql11-query/#modOrderBy
|
13
21
|
class Desc < Operator::Asc
|
14
22
|
NAME = :desc
|
23
|
+
|
24
|
+
##
|
25
|
+
#
|
26
|
+
# Returns a partial SPARQL grammar for this operator.
|
27
|
+
#
|
28
|
+
# Provides order to descendant query.
|
29
|
+
#
|
30
|
+
# @return [String]
|
31
|
+
def to_sparql(**options)
|
32
|
+
"DESC(#{operands.last.to_sparql(**options)})"
|
33
|
+
end
|
15
34
|
end # Desc
|
16
35
|
end # Operator
|
17
36
|
end; end # SPARQL::Algebra
|
@@ -5,10 +5,16 @@ module SPARQL; module Algebra
|
|
5
5
|
#
|
6
6
|
# Generages a graph across specified terms using {RDF::Queryable}`#concise_bounded_description`.
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
8
|
+
# [11] DescribeQuery ::= 'DESCRIBE' ( VarOrIri+ | '*' ) DatasetClause* WhereClause? SolutionModifier ValuesClause
|
9
|
+
#
|
10
|
+
# @example SPARQL Grammar
|
11
|
+
# BASE <http://example.org/>
|
12
|
+
# DESCRIBE <u> ?u WHERE { <x> <q> ?u . }
|
13
|
+
#
|
14
|
+
# @example SSE
|
15
|
+
# (base <http://example.org/>
|
16
|
+
# (describe (<u> ?u)
|
17
|
+
# (bgp (triple <x> <q> ?u))))
|
12
18
|
#
|
13
19
|
# @see https://www.w3.org/TR/sparql11-query/#describe
|
14
20
|
class Describe < Operator::Binary
|
@@ -66,6 +72,23 @@ module SPARQL; module Algebra
|
|
66
72
|
def query_yields_statements?
|
67
73
|
true
|
68
74
|
end
|
75
|
+
|
76
|
+
##
|
77
|
+
#
|
78
|
+
# Returns a partial SPARQL grammar for this term.
|
79
|
+
#
|
80
|
+
# @return [String]
|
81
|
+
def to_sparql(**options)
|
82
|
+
str = "DESCRIBE "
|
83
|
+
str << if operands[0].empty?
|
84
|
+
"*"
|
85
|
+
else
|
86
|
+
operands[0].map { |e| e.to_sparql(**options) }.join(" ")
|
87
|
+
end
|
88
|
+
|
89
|
+
str << "\n"
|
90
|
+
str << operands[1].to_sparql(top_level: true, project: nil, **options)
|
91
|
+
end
|
69
92
|
end # Construct
|
70
93
|
end # Operator
|
71
94
|
end; end # SPARQL::Algebra
|
@@ -3,9 +3,17 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL GraphPattern `distinct` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
6
|
+
# [9] SelectClause ::= 'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' )
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
11
|
+
# SELECT DISTINCT ?v
|
12
|
+
# WHERE { ?x ?p ?v }
|
13
|
+
#
|
14
|
+
# @example SSE
|
15
|
+
# (prefix ((: <http://example.org/>)
|
16
|
+
# (xsd: <http://www.w3.org/2001/XMLSchema#>))
|
9
17
|
# (distinct
|
10
18
|
# (project (?v)
|
11
19
|
# (bgp (triple ?x ?p ?v)))))
|
@@ -36,6 +44,15 @@ module SPARQL; module Algebra
|
|
36
44
|
@solutions.each(&block) if block_given?
|
37
45
|
@solutions
|
38
46
|
end
|
47
|
+
|
48
|
+
##
|
49
|
+
#
|
50
|
+
# Returns a partial SPARQL grammar for this operator.
|
51
|
+
#
|
52
|
+
# @return [String]
|
53
|
+
def to_sparql(**options)
|
54
|
+
operands.first.to_sparql(distinct: true, **options)
|
55
|
+
end
|
39
56
|
end # Distinct
|
40
57
|
end # Operator
|
41
58
|
end; end # SPARQL::Algebra
|
@@ -3,8 +3,23 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL numeric `divide` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# [117] MultiplicativeExpression::= UnaryExpression ( '*' UnaryExpression | '/' UnaryExpression )*
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# SELECT ?s WHERE {
|
11
|
+
# ?s :p ?o .
|
12
|
+
# ?s2 :p ?o2 .
|
13
|
+
# FILTER(?o / ?o2 = 4) .
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix ((: <http://example.org/>))
|
18
|
+
# (project (?s)
|
19
|
+
# (filter (= (/ ?o ?o2) 4)
|
20
|
+
# (bgp
|
21
|
+
# (triple ?s :p ?o)
|
22
|
+
# (triple ?s2 :p ?o2)))))
|
8
23
|
#
|
9
24
|
# @see https://www.w3.org/TR/xpath-functions/#func-numeric-divide
|
10
25
|
class Divide < Operator::Binary
|
@@ -21,7 +36,7 @@ module SPARQL; module Algebra
|
|
21
36
|
# a numeric literal
|
22
37
|
# @return [RDF::Literal::Numeric]
|
23
38
|
# @raise [TypeError] if either operand is not a numeric literal
|
24
|
-
def apply(left, right)
|
39
|
+
def apply(left, right, **options)
|
25
40
|
case
|
26
41
|
when left.is_a?(RDF::Literal::Numeric) && right.is_a?(RDF::Literal::Numeric)
|
27
42
|
# For xsd:decimal and xsd:integer operands, if the divisor is
|
@@ -38,6 +53,15 @@ module SPARQL; module Algebra
|
|
38
53
|
else raise TypeError, "expected two RDF::Literal::Numeric operands, but got #{left.inspect} and #{right.inspect}"
|
39
54
|
end
|
40
55
|
end
|
56
|
+
|
57
|
+
##
|
58
|
+
#
|
59
|
+
# Returns a partial SPARQL grammar for this operator.
|
60
|
+
#
|
61
|
+
# @return [String]
|
62
|
+
def to_sparql(**options)
|
63
|
+
"(#{operands.first.to_sparql(**options)} / #{operands.last.to_sparql(**options)})"
|
64
|
+
end
|
41
65
|
end # Divide
|
42
66
|
end # Operator
|
43
67
|
end; end # SPARQL::Algebra
|
@@ -8,8 +8,20 @@ module SPARQL; module Algebra
|
|
8
8
|
#
|
9
9
|
# Equivalent to `clear` in this implementation
|
10
10
|
#
|
11
|
-
#
|
12
|
-
#
|
11
|
+
# [33] Drop ::= 'DROP' 'SILENT'? GraphRefAll
|
12
|
+
#
|
13
|
+
# @example SPARQL Grammar (SILENT DEFAULT)
|
14
|
+
# DROP SILENT DEFAULT
|
15
|
+
#
|
16
|
+
# @example SSE (SILENT DEFAULT)
|
17
|
+
# (update
|
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/>))
|
13
25
|
#
|
14
26
|
# @see https://www.w3.org/TR/sparql11-update/#drop
|
15
27
|
class Drop < Operator
|
@@ -34,7 +46,6 @@ module SPARQL; module Algebra
|
|
34
46
|
def execute(queryable, **options)
|
35
47
|
debug(options) {"Drop"}
|
36
48
|
silent = operands.first == :silent
|
37
|
-
silent = operands.first == :silent
|
38
49
|
operands.shift if silent
|
39
50
|
|
40
51
|
raise ArgumentError, "drop expected operand to be 'default', 'named', 'all', or an IRI" unless operands.length == 1
|
@@ -61,6 +72,19 @@ module SPARQL; module Algebra
|
|
61
72
|
|
62
73
|
queryable
|
63
74
|
end
|
75
|
+
|
76
|
+
##
|
77
|
+
#
|
78
|
+
# Returns a partial SPARQL grammar for this operator.
|
79
|
+
#
|
80
|
+
# @return [String]
|
81
|
+
def to_sparql(**options)
|
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)
|
87
|
+
end
|
64
88
|
end # Drop
|
65
89
|
end # Operator
|
66
90
|
end; end # SPARQL::Algebra
|
@@ -5,8 +5,19 @@ module SPARQL; module Algebra
|
|
5
5
|
##
|
6
6
|
# The SPARQL logical `abs` operator.
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
8
|
+
# [121] BuiltInCall ::= ... | 'ENCODE_FOR_URI' '(' Expression ')'
|
9
|
+
#
|
10
|
+
# @example SPARQL Grammar
|
11
|
+
# PREFIX : <http://example.org/>
|
12
|
+
# SELECT ?s ?str (ENCODE_FOR_URI(?str) AS ?encoded) WHERE {
|
13
|
+
# ?s :str ?str
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix ((: <http://example.org/>))
|
18
|
+
# (project (?s ?str ?encoded)
|
19
|
+
# (extend ((?encoded (encode_for_uri ?str)))
|
20
|
+
# (bgp (triple ?s :str ?str)))))
|
10
21
|
#
|
11
22
|
# @see https://www.w3.org/TR/sparql11-query/#func-encode
|
12
23
|
# @see https://www.w3.org/TR/xpath-functions/#func-abs
|
@@ -27,12 +38,21 @@ module SPARQL; module Algebra
|
|
27
38
|
# the operand
|
28
39
|
# @return [RDF::Literal] literal of same type
|
29
40
|
# @raise [TypeError] if the operand is not a literal value
|
30
|
-
def apply(operand)
|
41
|
+
def apply(operand, **options)
|
31
42
|
case operand
|
32
43
|
when RDF::Literal then RDF::Literal(CGI.escape(operand.to_s))
|
33
44
|
else raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}"
|
34
45
|
end
|
35
46
|
end
|
47
|
+
|
48
|
+
##
|
49
|
+
#
|
50
|
+
# Returns a partial SPARQL grammar for this operator.
|
51
|
+
#
|
52
|
+
# @return [String]
|
53
|
+
def to_sparql(**options)
|
54
|
+
"ENCODE_FOR_URI(#{operands.last.to_sparql(**options)})"
|
55
|
+
end
|
36
56
|
end # EncodeForURI
|
37
57
|
end # Operator
|
38
58
|
end; end # SPARQL::Algebra
|