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.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -22
  3. data/VERSION +1 -1
  4. data/bin/sparql +14 -4
  5. data/lib/sparql/algebra/aggregate.rb +1 -1
  6. data/lib/sparql/algebra/evaluatable.rb +4 -4
  7. data/lib/sparql/algebra/expression.rb +28 -3
  8. data/lib/sparql/algebra/extensions.rb +109 -45
  9. data/lib/sparql/algebra/operator/abs.rb +23 -3
  10. data/lib/sparql/algebra/operator/add.rb +21 -2
  11. data/lib/sparql/algebra/operator/alt.rb +26 -2
  12. data/lib/sparql/algebra/operator/and.rb +25 -3
  13. data/lib/sparql/algebra/operator/asc.rb +20 -1
  14. data/lib/sparql/algebra/operator/ask.rb +17 -1
  15. data/lib/sparql/algebra/operator/avg.rb +20 -2
  16. data/lib/sparql/algebra/operator/base.rb +18 -1
  17. data/lib/sparql/algebra/operator/bgp.rb +13 -1
  18. data/lib/sparql/algebra/operator/bnode.rb +34 -11
  19. data/lib/sparql/algebra/operator/bound.rb +22 -1
  20. data/lib/sparql/algebra/operator/ceil.rb +26 -3
  21. data/lib/sparql/algebra/operator/clear.rb +26 -2
  22. data/lib/sparql/algebra/operator/coalesce.rb +33 -11
  23. data/lib/sparql/algebra/operator/compare.rb +48 -40
  24. data/lib/sparql/algebra/operator/concat.rb +26 -2
  25. data/lib/sparql/algebra/operator/construct.rb +29 -6
  26. data/lib/sparql/algebra/operator/contains.rb +25 -3
  27. data/lib/sparql/algebra/operator/copy.rb +19 -2
  28. data/lib/sparql/algebra/operator/count.rb +53 -7
  29. data/lib/sparql/algebra/operator/create.rb +20 -2
  30. data/lib/sparql/algebra/operator/dataset.rb +27 -2
  31. data/lib/sparql/algebra/operator/datatype.rb +26 -7
  32. data/lib/sparql/algebra/operator/day.rb +24 -6
  33. data/lib/sparql/algebra/operator/delete.rb +29 -2
  34. data/lib/sparql/algebra/operator/delete_data.rb +23 -2
  35. data/lib/sparql/algebra/operator/delete_where.rb +24 -2
  36. data/lib/sparql/algebra/operator/desc.rb +20 -1
  37. data/lib/sparql/algebra/operator/describe.rb +27 -4
  38. data/lib/sparql/algebra/operator/distinct.rb +20 -3
  39. data/lib/sparql/algebra/operator/divide.rb +27 -3
  40. data/lib/sparql/algebra/operator/drop.rb +27 -3
  41. data/lib/sparql/algebra/operator/encode_for_uri.rb +23 -3
  42. data/lib/sparql/algebra/operator/equal.rb +13 -3
  43. data/lib/sparql/algebra/operator/exists.rb +28 -4
  44. data/lib/sparql/algebra/operator/exprlist.rb +15 -2
  45. data/lib/sparql/algebra/operator/extend.rb +64 -6
  46. data/lib/sparql/algebra/operator/filter.rb +27 -5
  47. data/lib/sparql/algebra/operator/floor.rb +26 -3
  48. data/lib/sparql/algebra/operator/function_call.rb +64 -0
  49. data/lib/sparql/algebra/operator/graph.rb +69 -6
  50. data/lib/sparql/algebra/operator/greater_than.rb +14 -4
  51. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +14 -4
  52. data/lib/sparql/algebra/operator/group.rb +105 -8
  53. data/lib/sparql/algebra/operator/group_concat.rb +44 -8
  54. data/lib/sparql/algebra/operator/hours.rb +24 -6
  55. data/lib/sparql/algebra/operator/if.rb +20 -3
  56. data/lib/sparql/algebra/operator/in.rb +18 -1
  57. data/lib/sparql/algebra/operator/insert.rb +24 -2
  58. data/lib/sparql/algebra/operator/insert_data.rb +23 -2
  59. data/lib/sparql/algebra/operator/iri.rb +22 -5
  60. data/lib/sparql/algebra/operator/is_blank.rb +21 -4
  61. data/lib/sparql/algebra/operator/is_iri.rb +21 -4
  62. data/lib/sparql/algebra/operator/is_literal.rb +21 -4
  63. data/lib/sparql/algebra/operator/is_numeric.rb +23 -6
  64. data/lib/sparql/algebra/operator/is_triple.rb +33 -1
  65. data/lib/sparql/algebra/operator/join.rb +56 -1
  66. data/lib/sparql/algebra/operator/lang.rb +26 -1
  67. data/lib/sparql/algebra/operator/lang_matches.rb +23 -2
  68. data/lib/sparql/algebra/operator/lcase.rb +23 -3
  69. data/lib/sparql/algebra/operator/left_join.rb +42 -1
  70. data/lib/sparql/algebra/operator/less_than.rb +14 -4
  71. data/lib/sparql/algebra/operator/less_than_or_equal.rb +14 -4
  72. data/lib/sparql/algebra/operator/load.rb +25 -2
  73. data/lib/sparql/algebra/operator/max.rb +20 -2
  74. data/lib/sparql/algebra/operator/md5.rb +23 -6
  75. data/lib/sparql/algebra/operator/min.rb +22 -4
  76. data/lib/sparql/algebra/operator/minus.rb +65 -7
  77. data/lib/sparql/algebra/operator/minutes.rb +24 -6
  78. data/lib/sparql/algebra/operator/modify.rb +41 -5
  79. data/lib/sparql/algebra/operator/month.rb +24 -6
  80. data/lib/sparql/algebra/operator/move.rb +20 -2
  81. data/lib/sparql/algebra/operator/multiply.rb +27 -4
  82. data/lib/sparql/algebra/operator/negate.rb +24 -4
  83. data/lib/sparql/algebra/operator/not.rb +25 -4
  84. data/lib/sparql/algebra/operator/not_equal.rb +16 -1
  85. data/lib/sparql/algebra/operator/notexists.rb +30 -6
  86. data/lib/sparql/algebra/operator/notin.rb +20 -3
  87. data/lib/sparql/algebra/operator/notoneof.rb +21 -2
  88. data/lib/sparql/algebra/operator/now.rb +25 -6
  89. data/lib/sparql/algebra/operator/object.rb +33 -1
  90. data/lib/sparql/algebra/operator/or.rb +26 -3
  91. data/lib/sparql/algebra/operator/order.rb +71 -2
  92. data/lib/sparql/algebra/operator/path.rb +29 -2
  93. data/lib/sparql/algebra/operator/path_opt.rb +21 -2
  94. data/lib/sparql/algebra/operator/path_plus.rb +21 -2
  95. data/lib/sparql/algebra/operator/path_star.rb +20 -2
  96. data/lib/sparql/algebra/operator/plus.rb +43 -4
  97. data/lib/sparql/algebra/operator/predicate.rb +33 -1
  98. data/lib/sparql/algebra/operator/prefix.rb +24 -3
  99. data/lib/sparql/algebra/operator/project.rb +69 -5
  100. data/lib/sparql/algebra/operator/rand.rb +31 -3
  101. data/lib/sparql/algebra/operator/reduced.rb +20 -3
  102. data/lib/sparql/algebra/operator/regex.rb +27 -19
  103. data/lib/sparql/algebra/operator/replace.rb +27 -7
  104. data/lib/sparql/algebra/operator/reverse.rb +31 -2
  105. data/lib/sparql/algebra/operator/round.rb +26 -3
  106. data/lib/sparql/algebra/operator/same_term.rb +25 -7
  107. data/lib/sparql/algebra/operator/sample.rb +33 -9
  108. data/lib/sparql/algebra/operator/seconds.rb +24 -6
  109. data/lib/sparql/algebra/operator/seq.rb +20 -2
  110. data/lib/sparql/algebra/operator/sequence.rb +4 -11
  111. data/lib/sparql/algebra/operator/sha1.rb +19 -2
  112. data/lib/sparql/algebra/operator/sha256.rb +19 -2
  113. data/lib/sparql/algebra/operator/sha384.rb +19 -2
  114. data/lib/sparql/algebra/operator/sha512.rb +19 -2
  115. data/lib/sparql/algebra/operator/slice.rb +27 -5
  116. data/lib/sparql/algebra/operator/str.rb +22 -2
  117. data/lib/sparql/algebra/operator/strafter.rb +26 -3
  118. data/lib/sparql/algebra/operator/strbefore.rb +26 -3
  119. data/lib/sparql/algebra/operator/strdt.rb +23 -2
  120. data/lib/sparql/algebra/operator/strends.rb +26 -4
  121. data/lib/sparql/algebra/operator/strlang.rb +25 -7
  122. data/lib/sparql/algebra/operator/strlen.rb +24 -3
  123. data/lib/sparql/algebra/operator/strstarts.rb +26 -3
  124. data/lib/sparql/algebra/operator/struuid.rb +30 -10
  125. data/lib/sparql/algebra/operator/subject.rb +33 -1
  126. data/lib/sparql/algebra/operator/substr.rb +24 -3
  127. data/lib/sparql/algebra/operator/subtract.rb +29 -3
  128. data/lib/sparql/algebra/operator/sum.rb +25 -7
  129. data/lib/sparql/algebra/operator/table.rb +76 -4
  130. data/lib/sparql/algebra/operator/timezone.rb +24 -6
  131. data/lib/sparql/algebra/operator/tz.rb +23 -6
  132. data/lib/sparql/algebra/operator/ucase.rb +24 -3
  133. data/lib/sparql/algebra/operator/union.rb +29 -6
  134. data/lib/sparql/algebra/operator/update.rb +46 -4
  135. data/lib/sparql/algebra/operator/using.rb +49 -2
  136. data/lib/sparql/algebra/operator/uuid.rb +28 -9
  137. data/lib/sparql/algebra/operator/with.rb +38 -4
  138. data/lib/sparql/algebra/operator/year.rb +24 -6
  139. data/lib/sparql/algebra/operator.rb +135 -14
  140. data/lib/sparql/algebra/sxp_extensions.rb +3 -3
  141. data/lib/sparql/algebra.rb +20 -3
  142. data/lib/sparql/grammar/meta.rb +1103 -907
  143. data/lib/sparql/grammar/parser11.rb +63 -56
  144. metadata +43 -29
  145. 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
- # @example
10
- # (copy silent <iri> to default)
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
- # @example
7
- # (prefix ((: <http://www.example.org>))
8
- # (project (?C)
9
- # (extend ((?C ??.0))
10
- # (group () ((??.0 (count ?O)))
11
- # (bgp (triple ?S ?P ?O))))))
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
- # @example
12
- # (create silent <graph>)
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-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
@@ -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
- # @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
@@ -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
- # @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
@@ -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
- # @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(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
- # @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(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
- # @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(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
- # @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
@@ -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
- # @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
@@ -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