sparql 3.1.8 → 3.2.3

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.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +88 -60
  3. data/VERSION +1 -1
  4. data/bin/sparql +15 -35
  5. data/lib/rack/sparql/conneg.rb +22 -1
  6. data/lib/sinatra/sparql/extensions.rb +1 -1
  7. data/lib/sinatra/sparql.rb +57 -12
  8. data/lib/sparql/algebra/expression.rb +63 -10
  9. data/lib/sparql/algebra/extensions.rb +110 -46
  10. data/lib/sparql/algebra/operator/abs.rb +22 -2
  11. data/lib/sparql/algebra/operator/add.rb +21 -2
  12. data/lib/sparql/algebra/operator/adjust.rb +69 -0
  13. data/lib/sparql/algebra/operator/alt.rb +26 -2
  14. data/lib/sparql/algebra/operator/and.rb +25 -3
  15. data/lib/sparql/algebra/operator/asc.rb +20 -1
  16. data/lib/sparql/algebra/operator/ask.rb +17 -1
  17. data/lib/sparql/algebra/operator/avg.rb +19 -1
  18. data/lib/sparql/algebra/operator/base.rb +18 -1
  19. data/lib/sparql/algebra/operator/bgp.rb +13 -1
  20. data/lib/sparql/algebra/operator/bnode.rb +33 -10
  21. data/lib/sparql/algebra/operator/bound.rb +22 -1
  22. data/lib/sparql/algebra/operator/ceil.rb +25 -2
  23. data/lib/sparql/algebra/operator/clear.rb +26 -2
  24. data/lib/sparql/algebra/operator/coalesce.rb +33 -11
  25. data/lib/sparql/algebra/operator/compare.rb +9 -0
  26. data/lib/sparql/algebra/operator/concat.rb +26 -2
  27. data/lib/sparql/algebra/operator/construct.rb +29 -6
  28. data/lib/sparql/algebra/operator/contains.rb +24 -2
  29. data/lib/sparql/algebra/operator/copy.rb +19 -2
  30. data/lib/sparql/algebra/operator/count.rb +52 -6
  31. data/lib/sparql/algebra/operator/create.rb +20 -2
  32. data/lib/sparql/algebra/operator/dataset.rb +37 -2
  33. data/lib/sparql/algebra/operator/datatype.rb +25 -6
  34. data/lib/sparql/algebra/operator/day.rb +25 -7
  35. data/lib/sparql/algebra/operator/delete.rb +29 -2
  36. data/lib/sparql/algebra/operator/delete_data.rb +23 -2
  37. data/lib/sparql/algebra/operator/delete_where.rb +24 -2
  38. data/lib/sparql/algebra/operator/desc.rb +20 -1
  39. data/lib/sparql/algebra/operator/describe.rb +27 -4
  40. data/lib/sparql/algebra/operator/distinct.rb +20 -3
  41. data/lib/sparql/algebra/operator/divide.rb +26 -2
  42. data/lib/sparql/algebra/operator/drop.rb +27 -3
  43. data/lib/sparql/algebra/operator/encode_for_uri.rb +22 -2
  44. data/lib/sparql/algebra/operator/equal.rb +12 -2
  45. data/lib/sparql/algebra/operator/exists.rb +28 -4
  46. data/lib/sparql/algebra/operator/exprlist.rb +15 -2
  47. data/lib/sparql/algebra/operator/extend.rb +95 -7
  48. data/lib/sparql/algebra/operator/filter.rb +27 -5
  49. data/lib/sparql/algebra/operator/floor.rb +25 -2
  50. data/lib/sparql/algebra/operator/function_call.rb +64 -0
  51. data/lib/sparql/algebra/operator/graph.rb +69 -6
  52. data/lib/sparql/algebra/operator/greater_than.rb +12 -3
  53. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +12 -2
  54. data/lib/sparql/algebra/operator/group.rb +133 -8
  55. data/lib/sparql/algebra/operator/group_concat.rb +43 -7
  56. data/lib/sparql/algebra/operator/hours.rb +25 -7
  57. data/lib/sparql/algebra/operator/if.rb +20 -3
  58. data/lib/sparql/algebra/operator/in.rb +18 -1
  59. data/lib/sparql/algebra/operator/insert.rb +24 -2
  60. data/lib/sparql/algebra/operator/insert_data.rb +23 -2
  61. data/lib/sparql/algebra/operator/iri.rb +21 -4
  62. data/lib/sparql/algebra/operator/is_blank.rb +20 -3
  63. data/lib/sparql/algebra/operator/is_iri.rb +20 -3
  64. data/lib/sparql/algebra/operator/is_literal.rb +20 -3
  65. data/lib/sparql/algebra/operator/is_numeric.rb +22 -5
  66. data/lib/sparql/algebra/operator/is_triple.rb +32 -0
  67. data/lib/sparql/algebra/operator/join.rb +58 -3
  68. data/lib/sparql/algebra/operator/lang.rb +25 -0
  69. data/lib/sparql/algebra/operator/lang_matches.rb +22 -1
  70. data/lib/sparql/algebra/operator/lcase.rb +22 -2
  71. data/lib/sparql/algebra/operator/left_join.rb +44 -3
  72. data/lib/sparql/algebra/operator/less_than.rb +12 -3
  73. data/lib/sparql/algebra/operator/less_than_or_equal.rb +12 -2
  74. data/lib/sparql/algebra/operator/load.rb +25 -2
  75. data/lib/sparql/algebra/operator/max.rb +19 -1
  76. data/lib/sparql/algebra/operator/md5.rb +22 -5
  77. data/lib/sparql/algebra/operator/min.rb +21 -3
  78. data/lib/sparql/algebra/operator/minus.rb +65 -7
  79. data/lib/sparql/algebra/operator/minutes.rb +25 -7
  80. data/lib/sparql/algebra/operator/modify.rb +62 -5
  81. data/lib/sparql/algebra/operator/month.rb +25 -7
  82. data/lib/sparql/algebra/operator/move.rb +20 -2
  83. data/lib/sparql/algebra/operator/multiply.rb +26 -3
  84. data/lib/sparql/algebra/operator/negate.rb +23 -3
  85. data/lib/sparql/algebra/operator/not.rb +24 -3
  86. data/lib/sparql/algebra/operator/not_equal.rb +13 -0
  87. data/lib/sparql/algebra/operator/notexists.rb +30 -6
  88. data/lib/sparql/algebra/operator/notin.rb +20 -3
  89. data/lib/sparql/algebra/operator/notoneof.rb +21 -2
  90. data/lib/sparql/algebra/operator/now.rb +24 -5
  91. data/lib/sparql/algebra/operator/object.rb +32 -0
  92. data/lib/sparql/algebra/operator/or.rb +26 -3
  93. data/lib/sparql/algebra/operator/order.rb +64 -1
  94. data/lib/sparql/algebra/operator/path.rb +29 -2
  95. data/lib/sparql/algebra/operator/path_opt.rb +28 -65
  96. data/lib/sparql/algebra/operator/path_plus.rb +37 -10
  97. data/lib/sparql/algebra/operator/path_range.rb +178 -0
  98. data/lib/sparql/algebra/operator/path_star.rb +25 -4
  99. data/lib/sparql/algebra/operator/path_zero.rb +110 -0
  100. data/lib/sparql/algebra/operator/plus.rb +49 -8
  101. data/lib/sparql/algebra/operator/predicate.rb +32 -0
  102. data/lib/sparql/algebra/operator/prefix.rb +24 -3
  103. data/lib/sparql/algebra/operator/project.rb +111 -6
  104. data/lib/sparql/algebra/operator/rand.rb +30 -2
  105. data/lib/sparql/algebra/operator/reduced.rb +20 -3
  106. data/lib/sparql/algebra/operator/regex.rb +26 -18
  107. data/lib/sparql/algebra/operator/replace.rb +26 -6
  108. data/lib/sparql/algebra/operator/reverse.rb +31 -2
  109. data/lib/sparql/algebra/operator/round.rb +25 -2
  110. data/lib/sparql/algebra/operator/same_term.rb +24 -6
  111. data/lib/sparql/algebra/operator/sample.rb +32 -8
  112. data/lib/sparql/algebra/operator/seconds.rb +25 -7
  113. data/lib/sparql/algebra/operator/seq.rb +23 -5
  114. data/lib/sparql/algebra/operator/sequence.rb +14 -11
  115. data/lib/sparql/algebra/operator/sha1.rb +18 -1
  116. data/lib/sparql/algebra/operator/sha256.rb +18 -1
  117. data/lib/sparql/algebra/operator/sha384.rb +18 -1
  118. data/lib/sparql/algebra/operator/sha512.rb +18 -1
  119. data/lib/sparql/algebra/operator/slice.rb +27 -5
  120. data/lib/sparql/algebra/operator/str.rb +21 -1
  121. data/lib/sparql/algebra/operator/strafter.rb +25 -2
  122. data/lib/sparql/algebra/operator/strbefore.rb +25 -2
  123. data/lib/sparql/algebra/operator/strdt.rb +22 -1
  124. data/lib/sparql/algebra/operator/strends.rb +25 -3
  125. data/lib/sparql/algebra/operator/strlang.rb +24 -6
  126. data/lib/sparql/algebra/operator/strlen.rb +23 -2
  127. data/lib/sparql/algebra/operator/strstarts.rb +25 -2
  128. data/lib/sparql/algebra/operator/struuid.rb +29 -9
  129. data/lib/sparql/algebra/operator/subject.rb +32 -0
  130. data/lib/sparql/algebra/operator/substr.rb +23 -2
  131. data/lib/sparql/algebra/operator/subtract.rb +37 -7
  132. data/lib/sparql/algebra/operator/sum.rb +24 -6
  133. data/lib/sparql/algebra/operator/table.rb +85 -4
  134. data/lib/sparql/algebra/operator/timezone.rb +25 -7
  135. data/lib/sparql/algebra/operator/triple.rb +24 -0
  136. data/lib/sparql/algebra/operator/tz.rb +24 -7
  137. data/lib/sparql/algebra/operator/ucase.rb +23 -2
  138. data/lib/sparql/algebra/operator/union.rb +29 -6
  139. data/lib/sparql/algebra/operator/update.rb +46 -4
  140. data/lib/sparql/algebra/operator/using.rb +49 -2
  141. data/lib/sparql/algebra/operator/uuid.rb +27 -8
  142. data/lib/sparql/algebra/operator/with.rb +38 -4
  143. data/lib/sparql/algebra/operator/year.rb +25 -7
  144. data/lib/sparql/algebra/operator.rb +150 -12
  145. data/lib/sparql/algebra/query.rb +5 -3
  146. data/lib/sparql/algebra/sxp_extensions.rb +3 -3
  147. data/lib/sparql/algebra.rb +42 -6
  148. data/lib/sparql/grammar/meta.rb +1367 -267
  149. data/lib/sparql/grammar/parser11.rb +829 -331
  150. data/lib/sparql/grammar/terminals11.rb +2 -2
  151. data/lib/sparql/grammar.rb +6 -4
  152. data/lib/sparql/results.rb +3 -2
  153. data/lib/sparql/server.rb +93 -0
  154. data/lib/sparql.rb +8 -5
  155. metadata +57 -35
@@ -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-g1.ttl)
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
- # @example Dataset with multiple named graphs
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
@@ -115,6 +129,11 @@ module SPARQL; module Algebra
115
129
  #
116
130
  # Datasets are specified in operand(1), which is an array of default or named graph URIs.
117
131
  #
132
+ # If `options` contains any of the Protocol attributes, the dataset is constructed on creation, and these operations should be ignored:
133
+ #
134
+ # * `default-graph-uri`
135
+ # * `named-graph-uri`
136
+ #
118
137
  # @param [RDF::Queryable] queryable
119
138
  # the graph or repository to query
120
139
  # @param [Hash{Symbol => Object}] options
@@ -128,6 +147,11 @@ module SPARQL; module Algebra
128
147
  # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
129
148
  def execute(queryable, **options, &base)
130
149
  debug(options) {"Dataset"}
150
+ if %i(default-graph-uri named-graph-uri).any? {|k| options.key?(k)}
151
+ debug("=> Skip constructing merge repo due to options", options)
152
+ return queryable.query(operands.last, depth: options[:depth].to_i + 1, **options, &base)
153
+ end
154
+
131
155
  default_datasets = []
132
156
  named_datasets = []
133
157
  operand(0).each do |uri|
@@ -158,6 +182,17 @@ module SPARQL; module Algebra
158
182
  aggregate.default(*default_datasets.select {|name| queryable.has_graph?(name)})
159
183
  aggregate.query(operands.last, depth: options[:depth].to_i + 1, **options, &base)
160
184
  end
185
+
186
+ ##
187
+ #
188
+ # Returns a partial SPARQL grammar for this operator.
189
+ #
190
+ # Extracts datasets
191
+ #
192
+ # @return [String]
193
+ def to_sparql(**options)
194
+ operands.last.to_sparql(datasets: operands.first, **options)
195
+ end
161
196
  end # Dataset
162
197
  end # Operator
163
198
  end; end # SPARQL::Algebra
@@ -3,13 +3,23 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `datatype` operator.
5
5
  #
6
- # @example
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
- # (rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
9
- # (: <http://example.org/>))
10
- # (project (?s)
11
- # (filter (= (datatype (xsd:double ?v)) xsd:double)
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
@@ -33,6 +43,15 @@ module SPARQL; module Algebra
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
- # @example
7
- # (prefix ((: <http://example.org/>))
8
- # (project (?s ?x)
9
- # (extend ((?x (day ?date)))
10
- # (bgp (triple ?s :date ?date)))))
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
@@ -20,12 +29,21 @@ module SPARQL; module Algebra
20
29
  #
21
30
  # @param [RDF::Literal] operand
22
31
  # the operand
23
- # @return [RDF::Literal]
32
+ # @return [RDF::Literal::Temporal]
24
33
  # @raise [TypeError] if the operand is not a simple literal
25
34
  def apply(operand, **options)
26
- raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
35
+ raise TypeError, "expected an RDF::Literal::Temporal, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::Temporal)
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
- # @example
10
- # (delete ((triple ?s ?p ?o))))
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(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
- # @example
10
- # (deleteData ((triple :a foaf:knows :c)))
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(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
- # @example
10
- # (deleteWhere ((triple :a foaf:knows ?b))
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(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
- # @example
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
- # @example
9
- # (prefix ((exOrg: <http://org.example.com/employees#>))
10
- # (describe (?x)
11
- # (bgp (triple ?x exOrg:employeeId "1234"))))
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
- # @example
7
- # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
- # (: <http://example/>))
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
- # @example
7
- # (/ 4 2)
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
@@ -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
- # @example
12
- # (drop default)
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
- # @example
9
- # (encode_for_uri ?x)
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
@@ -33,6 +44,15 @@ module SPARQL; module Algebra
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
@@ -3,8 +3,18 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL relational `=` (equal) comparison operator.
5
5
  #
6
- # @example
7
- # (= ?x ?y)
6
+ # [114] RelationalExpression ::= NumericExpression ('=' NumericExpression)?
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
10
+ # PREFIX : <http://example.org/things#>
11
+ # SELECT ?x
12
+ # WHERE { ?x :p ?v . FILTER ( ?v = 1 ) }
13
+ #
14
+ # @example SSE
15
+ # (prefix
16
+ # ((xsd: <http://www.w3.org/2001/XMLSchema#>) (: <http://example.org/things#>))
17
+ # (project (?x) (filter (= ?v 1) (bgp (triple ?x :p ?v)))))
8
18
  #
9
19
  # @see https://www.w3.org/TR/sparql11-query/#OperatorMapping
10
20
  # @see https://www.w3.org/TR/sparql11-query/#func-RDFterm-equal
@@ -5,10 +5,21 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # There is a filter operator EXISTS that takes a graph pattern. EXISTS returns `true`/`false` depending on whether the pattern matches the dataset given the bindings in the current group graph pattern, the dataset and the active graph at this point in the query evaluation. No additional binding of variables occurs. The `NOT EXISTS` form translates into `fn:not(EXISTS{...})`.
7
7
  #
8
- # @example
9
- # (prefix ((ex: <http://www.example.org/>))
10
- # (filter (exists (bgp (triple ?s ?p ex:o)))
11
- # (bgp (triple ?s ?p ?o))))
8
+ # [125] ExistsFunc ::= 'EXISTS' GroupGraphPattern
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example/>
12
+ # SELECT *
13
+ # WHERE {
14
+ # ?set a :Set .
15
+ # FILTER EXISTS { ?set :member 9 }
16
+ # }
17
+ #
18
+ # @example SSE
19
+ # (prefix ((: <http://example/>))
20
+ # (filter
21
+ # (exists (bgp (triple ?set :member 9)))
22
+ # (bgp (triple ?set a :Set))))
12
23
  #
13
24
  # @see https://www.w3.org/TR/sparql11-query/#func-filter-exists
14
25
  class Exists < Operator::Unary
@@ -32,6 +43,19 @@ module SPARQL; module Algebra
32
43
  depth: options[:depth].to_i + 1,
33
44
  **options).empty?
34
45
  end
46
+
47
+ ##
48
+ #
49
+ # Returns a partial SPARQL grammar for this operator.
50
+ #
51
+ # @param [Boolean] top_level (true)
52
+ # Treat this as a top-level, generating SELECT ... WHERE {}
53
+ # @return [String]
54
+ def to_sparql(top_level: true, **options)
55
+ "EXISTS {\n" +
56
+ operands.last.to_sparql(top_level: false, **options) +
57
+ "\n}"
58
+ end
35
59
  end # Exists
36
60
  end # Operator
37
61
  end; end # SPARQL::Algebra
@@ -5,8 +5,21 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Used for filters with more than one expression.
7
7
  #
8
- # @example
9
- # (prefix ((: <http://example/>))
8
+ # [72] ExpressionList ::= NIL | '(' Expression ( ',' Expression )* ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ #
13
+ # SELECT ?v ?w
14
+ # {
15
+ # FILTER (?v = 2)
16
+ # FILTER (?w = 3)
17
+ # ?s :p ?v .
18
+ # ?s :q ?w .
19
+ # }
20
+ #
21
+ # @example SSE
22
+ # (prefix ((: <http://example.org/>))
10
23
  # (project (?v ?w)
11
24
  # (filter (exprlist (= ?v 2) (= ?w 3))
12
25
  # (bgp