sparql 3.1.8 → 3.2.0

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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -22
  3. data/VERSION +1 -1
  4. data/bin/sparql +13 -4
  5. data/lib/sparql/algebra/extensions.rb +93 -33
  6. data/lib/sparql/algebra/operator/abs.rb +22 -2
  7. data/lib/sparql/algebra/operator/add.rb +21 -2
  8. data/lib/sparql/algebra/operator/alt.rb +26 -2
  9. data/lib/sparql/algebra/operator/and.rb +25 -3
  10. data/lib/sparql/algebra/operator/asc.rb +20 -1
  11. data/lib/sparql/algebra/operator/ask.rb +17 -1
  12. data/lib/sparql/algebra/operator/avg.rb +17 -1
  13. data/lib/sparql/algebra/operator/base.rb +18 -1
  14. data/lib/sparql/algebra/operator/bgp.rb +5 -1
  15. data/lib/sparql/algebra/operator/bnode.rb +33 -10
  16. data/lib/sparql/algebra/operator/bound.rb +22 -1
  17. data/lib/sparql/algebra/operator/ceil.rb +25 -2
  18. data/lib/sparql/algebra/operator/clear.rb +16 -2
  19. data/lib/sparql/algebra/operator/coalesce.rb +33 -11
  20. data/lib/sparql/algebra/operator/compare.rb +9 -0
  21. data/lib/sparql/algebra/operator/concat.rb +26 -2
  22. data/lib/sparql/algebra/operator/construct.rb +29 -6
  23. data/lib/sparql/algebra/operator/contains.rb +24 -2
  24. data/lib/sparql/algebra/operator/copy.rb +19 -2
  25. data/lib/sparql/algebra/operator/count.rb +17 -1
  26. data/lib/sparql/algebra/operator/create.rb +19 -2
  27. data/lib/sparql/algebra/operator/dataset.rb +17 -0
  28. data/lib/sparql/algebra/operator/datatype.rb +25 -6
  29. data/lib/sparql/algebra/operator/day.rb +23 -5
  30. data/lib/sparql/algebra/operator/delete.rb +27 -2
  31. data/lib/sparql/algebra/operator/delete_data.rb +23 -2
  32. data/lib/sparql/algebra/operator/delete_where.rb +24 -2
  33. data/lib/sparql/algebra/operator/desc.rb +20 -1
  34. data/lib/sparql/algebra/operator/describe.rb +27 -4
  35. data/lib/sparql/algebra/operator/distinct.rb +18 -1
  36. data/lib/sparql/algebra/operator/divide.rb +26 -2
  37. data/lib/sparql/algebra/operator/drop.rb +17 -2
  38. data/lib/sparql/algebra/operator/encode_for_uri.rb +24 -2
  39. data/lib/sparql/algebra/operator/equal.rb +12 -2
  40. data/lib/sparql/algebra/operator/exists.rb +28 -4
  41. data/lib/sparql/algebra/operator/exprlist.rb +12 -1
  42. data/lib/sparql/algebra/operator/extend.rb +31 -6
  43. data/lib/sparql/algebra/operator/filter.rb +27 -5
  44. data/lib/sparql/algebra/operator/floor.rb +25 -2
  45. data/lib/sparql/algebra/operator/graph.rb +13 -0
  46. data/lib/sparql/algebra/operator/greater_than.rb +12 -3
  47. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +12 -2
  48. data/lib/sparql/algebra/operator/group.rb +34 -8
  49. data/lib/sparql/algebra/operator/group_concat.rb +19 -7
  50. data/lib/sparql/algebra/operator/hours.rb +23 -5
  51. data/lib/sparql/algebra/operator/if.rb +21 -4
  52. data/lib/sparql/algebra/operator/in.rb +18 -1
  53. data/lib/sparql/algebra/operator/insert.rb +22 -2
  54. data/lib/sparql/algebra/operator/insert_data.rb +23 -2
  55. data/lib/sparql/algebra/operator/iri.rb +21 -4
  56. data/lib/sparql/algebra/operator/is_blank.rb +19 -1
  57. data/lib/sparql/algebra/operator/is_iri.rb +19 -1
  58. data/lib/sparql/algebra/operator/is_literal.rb +19 -1
  59. data/lib/sparql/algebra/operator/is_numeric.rb +21 -3
  60. data/lib/sparql/algebra/operator/is_triple.rb +32 -0
  61. data/lib/sparql/algebra/operator/join.rb +22 -1
  62. data/lib/sparql/algebra/operator/lang.rb +25 -0
  63. data/lib/sparql/algebra/operator/lang_matches.rb +22 -1
  64. data/lib/sparql/algebra/operator/lcase.rb +23 -2
  65. data/lib/sparql/algebra/operator/left_join.rb +29 -1
  66. data/lib/sparql/algebra/operator/less_than.rb +12 -3
  67. data/lib/sparql/algebra/operator/less_than_or_equal.rb +12 -2
  68. data/lib/sparql/algebra/operator/load.rb +25 -2
  69. data/lib/sparql/algebra/operator/max.rb +17 -1
  70. data/lib/sparql/algebra/operator/md5.rb +22 -5
  71. data/lib/sparql/algebra/operator/min.rb +18 -2
  72. data/lib/sparql/algebra/operator/minus.rb +25 -7
  73. data/lib/sparql/algebra/operator/minutes.rb +23 -5
  74. data/lib/sparql/algebra/operator/modify.rb +41 -5
  75. data/lib/sparql/algebra/operator/month.rb +23 -5
  76. data/lib/sparql/algebra/operator/move.rb +20 -2
  77. data/lib/sparql/algebra/operator/multiply.rb +26 -3
  78. data/lib/sparql/algebra/operator/negate.rb +23 -3
  79. data/lib/sparql/algebra/operator/not.rb +24 -3
  80. data/lib/sparql/algebra/operator/not_equal.rb +13 -0
  81. data/lib/sparql/algebra/operator/notexists.rb +30 -6
  82. data/lib/sparql/algebra/operator/notin.rb +20 -3
  83. data/lib/sparql/algebra/operator/notoneof.rb +12 -2
  84. data/lib/sparql/algebra/operator/now.rb +24 -5
  85. data/lib/sparql/algebra/operator/object.rb +32 -0
  86. data/lib/sparql/algebra/operator/or.rb +26 -3
  87. data/lib/sparql/algebra/operator/order.rb +20 -1
  88. data/lib/sparql/algebra/operator/path.rb +29 -2
  89. data/lib/sparql/algebra/operator/path_opt.rb +21 -2
  90. data/lib/sparql/algebra/operator/path_plus.rb +21 -2
  91. data/lib/sparql/algebra/operator/path_star.rb +20 -2
  92. data/lib/sparql/algebra/operator/plus.rb +42 -3
  93. data/lib/sparql/algebra/operator/predicate.rb +32 -0
  94. data/lib/sparql/algebra/operator/prefix.rb +24 -3
  95. data/lib/sparql/algebra/operator/project.rb +51 -5
  96. data/lib/sparql/algebra/operator/rand.rb +30 -2
  97. data/lib/sparql/algebra/operator/reduced.rb +18 -1
  98. data/lib/sparql/algebra/operator/regex.rb +26 -18
  99. data/lib/sparql/algebra/operator/replace.rb +26 -6
  100. data/lib/sparql/algebra/operator/reverse.rb +20 -2
  101. data/lib/sparql/algebra/operator/round.rb +25 -2
  102. data/lib/sparql/algebra/operator/same_term.rb +24 -6
  103. data/lib/sparql/algebra/operator/sample.rb +30 -8
  104. data/lib/sparql/algebra/operator/seconds.rb +23 -5
  105. data/lib/sparql/algebra/operator/seq.rb +20 -2
  106. data/lib/sparql/algebra/operator/sequence.rb +0 -10
  107. data/lib/sparql/algebra/operator/sha1.rb +18 -1
  108. data/lib/sparql/algebra/operator/sha256.rb +18 -1
  109. data/lib/sparql/algebra/operator/sha384.rb +18 -1
  110. data/lib/sparql/algebra/operator/sha512.rb +18 -1
  111. data/lib/sparql/algebra/operator/slice.rb +27 -5
  112. data/lib/sparql/algebra/operator/str.rb +21 -1
  113. data/lib/sparql/algebra/operator/strafter.rb +25 -2
  114. data/lib/sparql/algebra/operator/strbefore.rb +25 -2
  115. data/lib/sparql/algebra/operator/strdt.rb +22 -1
  116. data/lib/sparql/algebra/operator/strends.rb +25 -3
  117. data/lib/sparql/algebra/operator/strlang.rb +25 -6
  118. data/lib/sparql/algebra/operator/strlen.rb +23 -2
  119. data/lib/sparql/algebra/operator/strstarts.rb +25 -2
  120. data/lib/sparql/algebra/operator/struuid.rb +29 -9
  121. data/lib/sparql/algebra/operator/subject.rb +32 -0
  122. data/lib/sparql/algebra/operator/substr.rb +23 -2
  123. data/lib/sparql/algebra/operator/subtract.rb +28 -2
  124. data/lib/sparql/algebra/operator/sum.rb +17 -1
  125. data/lib/sparql/algebra/operator/table.rb +42 -4
  126. data/lib/sparql/algebra/operator/timezone.rb +23 -5
  127. data/lib/sparql/algebra/operator/tz.rb +22 -5
  128. data/lib/sparql/algebra/operator/ucase.rb +23 -2
  129. data/lib/sparql/algebra/operator/union.rb +29 -6
  130. data/lib/sparql/algebra/operator/update.rb +25 -4
  131. data/lib/sparql/algebra/operator/using.rb +32 -2
  132. data/lib/sparql/algebra/operator/uuid.rb +27 -8
  133. data/lib/sparql/algebra/operator/with.rb +38 -4
  134. data/lib/sparql/algebra/operator/year.rb +23 -5
  135. data/lib/sparql/algebra/operator.rb +99 -6
  136. data/lib/sparql/algebra/sxp_extensions.rb +3 -3
  137. data/lib/sparql/grammar/parser11.rb +4 -4
  138. metadata +22 -35
  139. data/lib/sparql/algebra/operator/triple.rb +0 -27
@@ -3,12 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `strlang` operator.
5
5
  #
6
- # @example
7
- # (prefix ((: <http://example.org/>))
8
- # (project (?s ?s2)
9
- # (extend ((?s2 (strlang ?str "en-US")))
10
- # (filter (langMatches (lang ?str) "en")
11
- # (bgp (triple ?s :str ?str))))))
6
+ # [121] BuiltInCall ::= ... | 'STRLANG' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?s (STRLANG(?str,"en-US") AS ?s2) WHERE {
11
+ # ?s :str ?str
12
+ # FILTER(LANGMATCHES(LANG(?str), "en"))
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>) (xsd: <http://www.w3.org/2001/XMLSchema#>))
18
+ # (project (?s ?s2)
19
+ # (extend ((?s2 (strlang ?str "en-US")))
20
+ # (filter (langMatches (lang ?str) "en")
21
+ # (bgp (triple ?s :str ?str))))))
12
22
  #
13
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strlang
14
24
  class StrLang < Operator::Binary
@@ -29,6 +39,15 @@ module SPARQL; module Algebra
29
39
  raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
30
40
  RDF::Literal.new(value.to_s, language: langTag.to_s)
31
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "STRLANG(" + operands.to_sparql(delimiter: ', ', **options) + ")"
50
+ end
32
51
  end # StrLang
33
52
  end # Operator
34
53
  end; end # SPARQL::Algebra
@@ -3,8 +3,20 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `strlen` operator.
5
5
  #
6
- # @example
7
- # (strlen ?x)
6
+ # [121] BuiltInCall ::= ... 'STRLEN' '(' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?str (STRLEN(?str) AS ?len) WHERE {
11
+ # ?s :str ?str
12
+ # }
13
+ #
14
+ # @example SSE
15
+ # (prefix
16
+ # ((: <http://example.org/>))
17
+ # (project (?str ?len)
18
+ # (extend ((?len (strlen ?str)))
19
+ # (bgp (triple ?s :str ?str)))))
8
20
  #
9
21
  # @see https://www.w3.org/TR/sparql11-query/#func-strlen
10
22
  # @see https://www.w3.org/TR/xpath-functions/#func-string-length
@@ -29,6 +41,15 @@ module SPARQL; module Algebra
29
41
  raise TypeError, "expected a plain RDF::Literal, but got #{operand.inspect}" unless operand.literal? && operand.plain?
30
42
  RDF::Literal(operand.to_s.length)
31
43
  end
44
+
45
+ ##
46
+ #
47
+ # Returns a partial SPARQL grammar for this operator.
48
+ #
49
+ # @return [String]
50
+ def to_sparql(**options)
51
+ "STRLEN(" + operands.to_sparql(delimiter: ', ', **options) + ")"
52
+ end
32
53
  end # StrLen
33
54
  end # Operator
34
55
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `strstarts` operator.
5
5
  #
6
- # @example
7
- # (strstarts ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRSTARTS' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+
11
+ # SELECT ?s ?str WHERE {
12
+ # ?s :str ?str
13
+ # FILTER STRSTARTS(?str, "a")
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>))
19
+ # (project (?s ?str)
20
+ # (filter (strstarts ?str "a")
21
+ # (bgp (triple ?s :str ?str)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strstarts
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-starts-with
@@ -41,6 +55,15 @@ module SPARQL; module Algebra
41
55
  else RDF::Literal::FALSE
42
56
  end
43
57
  end
58
+
59
+ ##
60
+ #
61
+ # Returns a partial SPARQL grammar for this operator.
62
+ #
63
+ # @return [String]
64
+ def to_sparql(**options)
65
+ "STRSTARTS(" + operands.to_sparql(delimiter: ', ', **options) + ")"
66
+ end
44
67
  end # StrStarts
45
68
  end # Operator
46
69
  end; end # SPARQL::Algebra
@@ -3,16 +3,27 @@ require 'securerandom'
3
3
  module SPARQL; module Algebra
4
4
  class Operator
5
5
  ##
6
- # The SPARQL `uuid` function.
6
+ # [121] BuiltInCall ::= ... | 'STRUUID' NIL
7
7
  #
8
- # @example
9
- # (prefix ((: <http://example.org/>)
10
- # (xsd: <http://www.w3.org/2001/XMLSchema#>))
11
- # (project (?length)
12
- # (extend ((?length (strlen ?uuid)))
13
- # (filter (&& (isLiteral ?uuid) (regex ?uuid "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$" "i"))
14
- # (extend ((?uuid (struuid)))
15
- # (bgp))))))
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT (STRLEN(?uuid) AS ?length)
12
+ # WHERE {
13
+ # BIND(STRUUID() AS ?uuid)
14
+ # FILTER(ISLITERAL(?uuid) && REGEX(?uuid, "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$", "i"))
15
+ # }
16
+ #
17
+ # @example SSE
18
+ # (prefix ((: <http://example.org/>) (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?length)
20
+ # (extend ((?length (strlen ?uuid)))
21
+ # (filter
22
+ # (&&
23
+ # (isLiteral ?uuid)
24
+ # (regex ?uuid "^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$" "i"))
25
+ # (extend ((?uuid (struuid)))
26
+ # (bgp))))))
16
27
  #
17
28
  # @see https://www.w3.org/TR/sparql11-query/#func-struuid
18
29
  class StrUUID < Operator::Nullary
@@ -27,6 +38,15 @@ module SPARQL; module Algebra
27
38
  def apply(**options)
28
39
  RDF::Literal(SecureRandom.uuid)
29
40
  end
41
+
42
+ ##
43
+ #
44
+ # Returns a partial SPARQL grammar for this operator.
45
+ #
46
+ # @return [String]
47
+ def to_sparql(**options)
48
+ "STRUUID(" + operands.to_sparql(delimiter: ', ', **options) + ")"
49
+ end
30
50
  end # StrUUID
31
51
  end # Operator
32
52
  end; end # SPARQL::Algebra
@@ -7,6 +7,29 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # If triple is an RDF-star triple, the function returns the subject of this triple. Passing anything other than an RDF-star triple is an error.
9
9
  #
10
+ # [121] BuiltInCall ::= ... | 'SUBJECT' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.com/ns#>
14
+ # SELECT * {
15
+ # ?t :source :g
16
+ # FILTER(isTriple(?t))
17
+ # FILTER(SUBJECT(?t) = :s)
18
+ # FILTER(PREDICATE(?t) = :p)
19
+ # FILTER(OBJECT(?t) = :o)
20
+ # }
21
+ #
22
+ # @example SSE
23
+ # (prefix
24
+ # ((: <http://example.com/ns#>))
25
+ # (filter
26
+ # (exprlist
27
+ # (isTRIPLE ?t)
28
+ # (= (subject ?t) :s)
29
+ # (= (predicate ?t) :p)
30
+ # (= (object ?t) :o))
31
+ # (bgp (triple ?t :source :g))) )
32
+ #
10
33
  # @see https://w3c.github.io/rdf-star/rdf-star-cg-spec.html#subject
11
34
  class Subject < Operator::Unary
12
35
  include Evaluatable
@@ -24,6 +47,15 @@ module SPARQL; module Algebra
24
47
  raise TypeError, "expected an RDF::Statement, but got #{operand.inspect}" unless operand.is_a?(RDF::Statement)
25
48
  operand.subject
26
49
  end
50
+
51
+ ##
52
+ #
53
+ # Returns a partial SPARQL grammar for this operator.
54
+ #
55
+ # @return [String]
56
+ def to_sparql(**options)
57
+ "SUBJECT(" + operands.last.to_sparql(**options) + ")"
58
+ end
27
59
  end # Subject
28
60
  end # Operator
29
61
  end; end # SPARQL::Algebra
@@ -3,8 +3,20 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `substr` operator.
5
5
  #
6
- # @example
7
- # (substr ?x ?y)
6
+ # [123] SubstringExpression ::= 'SUBSTR' '(' Expression ',' Expression ( ',' Expression )? ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?s ?str (SUBSTR(?str,1,1) AS ?substr)
11
+ # WHERE {
12
+ # ?s :str ?str
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix ((: <http://example.org/>))
17
+ # (project (?s ?str ?substr)
18
+ # (extend ((?substr (substr ?str 1 1)))
19
+ # (bgp (triple ?s :str ?str)))))
8
20
  #
9
21
  # @see https://www.w3.org/TR/sparql11-query/#func-substr
10
22
  # @see https://www.w3.org/TR/xpath-functions/#func-substring
@@ -75,6 +87,15 @@ module SPARQL; module Algebra
75
87
  def to_sxp_bin
76
88
  [NAME] + operands.reject {|o| o.to_s == ""}
77
89
  end
90
+
91
+ ##
92
+ #
93
+ # Returns a partial SPARQL grammar for this operator.
94
+ #
95
+ # @return [String]
96
+ def to_sparql(**options)
97
+ "SUBSTR(" + operands.to_sparql(delimiter: ', ', **options) + ")"
98
+ end
78
99
  end # SubStr
79
100
  end # Operator
80
101
  end; end # SPARQL::Algebra
@@ -2,8 +2,25 @@ module SPARQL; module Algebra
2
2
  class Operator
3
3
  ##
4
4
  # The SPARQL numeric `subtract` operator.
5
- # (- ?x ?y)
6
- # (subtract ?x ?y)
5
+ #
6
+ # [116] AdditiveExpression ::= MultiplicativeExpression ( '-' MultiplicativeExpression )?
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 = 3) .
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>))
19
+ # (project (?s)
20
+ # (filter (= (- ?o ?o2) 3)
21
+ # (bgp
22
+ # (triple ?s :p ?o)
23
+ # (triple ?s2 :p ?o2)))))
7
24
  #
8
25
  # @see https://www.w3.org/TR/xpath-functions/#func-numeric-subtract
9
26
  class Subtract < Operator::Binary
@@ -27,6 +44,15 @@ module SPARQL; module Algebra
27
44
  else raise TypeError, "expected two RDF::Literal::Numeric operands, but got #{left.inspect} and #{right.inspect}"
28
45
  end
29
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(**options)} - #{operands.last.to_sparql(**options)}"
55
+ end
30
56
  end # Subtract
31
57
  end # Operator
32
58
  end; end # SPARQL::Algebra
@@ -3,7 +3,14 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `sum` set function.
5
5
  #
6
- # @example
6
+ # [127] Aggregate::= ... | 'SUM' '(' 'DISTINCT'? Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://www.example.org/>
10
+ # SELECT (SUM(?O) AS ?sum)
11
+ # WHERE { ?s :dec ?o }
12
+ #
13
+ # @example SSE
7
14
  # (prefix ((: <http://www.example.org/>))
8
15
  # (project (?sum)
9
16
  # (extend ((?sum ??.0))
@@ -33,6 +40,15 @@ module SPARQL; module Algebra
33
40
  raise TypeError, "Averaging non-numeric types: #{enum.flatten}"
34
41
  end
35
42
  end
43
+
44
+ ##
45
+ #
46
+ # Returns a partial SPARQL grammar for this operator.
47
+ #
48
+ # @return [String]
49
+ def to_sparql(**options)
50
+ "SUM(" + operands.to_sparql(**options) + ")"
51
+ end
36
52
  end # Sum
37
53
  end # Operator
38
54
  end; end # SPARQL::Algebra
@@ -6,10 +6,26 @@ module SPARQL; module Algebra
6
6
  # This is used to provide inline values. Each row becomes
7
7
  # a solution.
8
8
  #
9
- # @example
10
- # (table (vars ?book ?title)
11
- # (row (?title "SPARQL Tutorial"))
12
- # (row (?book :book2)))
9
+ # [28] ValuesClause ::= ( 'VALUES' DataBlock )?
10
+ #
11
+ # @example SPARQL Grammar
12
+ # PREFIX dc: <http://purl.org/dc/elements/1.1/>
13
+ # PREFIX : <http://example.org/book/>
14
+ # PREFIX ns: <http://example.org/ns#>
15
+ # SELECT ?book ?title ?price {
16
+ # ?book dc:title ?title ;
17
+ # ns:price ?price .
18
+ # }
19
+ # VALUES ?book { :book1 }
20
+ #
21
+ # @example SSE
22
+ # (prefix ((dc: <http://purl.org/dc/elements/1.1/>)
23
+ # (: <http://example.org/book/>)
24
+ # (ns: <http://example.org/ns#>))
25
+ # (project (?book ?title ?price)
26
+ # (join
27
+ # (bgp (triple ?book dc:title ?title) (triple ?book ns:price ?price))
28
+ # (table (vars ?book) (row (?book :book1)))) ))
13
29
  #
14
30
  # @example empty table
15
31
  # (table unit)
@@ -46,6 +62,28 @@ module SPARQL; module Algebra
46
62
  @solutions.each(&block) if block_given?
47
63
  @solutions
48
64
  end
65
+
66
+ ##
67
+ #
68
+ # Returns a partial SPARQL grammar for this operator.
69
+ #
70
+ # @return [String]
71
+ def to_sparql(**options)
72
+ str = "VALUES (#{operands.first[1..-1].map { |e| e.to_sparql(**options) }.join(' ')}) {\n"
73
+ operands[1..-1].each do |row|
74
+ line = '('
75
+ row[1..-1].each do |col|
76
+ line << "#{col[1].to_sparql(**options)} "
77
+ end
78
+ line = line.chop
79
+ line << ")\n"
80
+
81
+ str << line
82
+ end
83
+
84
+ str << "}\n"
85
+ str
86
+ end
49
87
  end # Table
50
88
  end # Operator
51
89
  end; end # SPARQL::Algebra
@@ -5,11 +5,20 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Returns the timezone part of `arg` as an xsd:dayTimeDuration. Raises an error if there is no timezone.
7
7
  #
8
- # @example
9
- # (prefix ((: <http://example.org/>))
10
- # (project (?s ?x)
11
- # (extend ((?x (timezone ?date)))
12
- # (bgp (triple ?s :date ?date)))))
8
+ # [121] BuiltInCall ::= ... | 'TIMEZONE' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # SELECT ?s (TIMEZONE(?date) AS ?x) WHERE {
13
+ # ?s :date ?date
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>))
19
+ # (project (?s ?x)
20
+ # (extend ((?x (timezone ?date)))
21
+ # (bgp (triple ?s :date ?date)))))
13
22
  #
14
23
  # @see https://www.w3.org/TR/sparql11-query/#func-timezone
15
24
  class Timezone < Operator::Unary
@@ -31,6 +40,15 @@ module SPARQL; module Algebra
31
40
  raise TypeError, "literal has no timezone" unless res = operand.timezone
32
41
  res
33
42
  end
43
+
44
+ ##
45
+ #
46
+ # Returns a partial SPARQL grammar for this operator.
47
+ #
48
+ # @return [String]
49
+ def to_sparql(**options)
50
+ "TIMEZONE(" + operands.to_sparql(**options) + ")"
51
+ end
34
52
  end # Timezone
35
53
  end # Operator
36
54
  end; end # SPARQL::Algebra
@@ -5,11 +5,20 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Returns the timezone part of `arg` as a simple literal. Returns the empty string if there is no timezone.
7
7
  #
8
- # @example
9
- # (prefix ((: <http://example.org/>))
10
- # (project (?s ?x)
11
- # (extend ((?x (tz ?date)))
12
- # (bgp (triple ?s :date ?date)))))
8
+ # [121] BuiltInCall ::= ... | 'TZ' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # SELECT ?s (TZ(?date) AS ?x) WHERE {
13
+ # ?s :date ?date
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>))
19
+ # (project (?s ?x)
20
+ # (extend ((?x (tz ?date)))
21
+ # (bgp (triple ?s :date ?date)))))
13
22
  #
14
23
  # @see https://www.w3.org/TR/sparql11-query/#func-tz
15
24
  class TZ < Operator::Unary
@@ -28,6 +37,14 @@ module SPARQL; module Algebra
28
37
  raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
29
38
  operand.tz
30
39
  end
40
+ ##
41
+ #
42
+ # Returns a partial SPARQL grammar for this operator.
43
+ #
44
+ # @return [String]
45
+ def to_sparql(**options)
46
+ "TZ(" + operands.to_sparql(**options) + ")"
47
+ end
31
48
  end # TZ
32
49
  end # Operator
33
50
  end; end # SPARQL::Algebra
@@ -3,8 +3,20 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL logical `ucase` operator.
5
5
  #
6
- # @example
7
- # (ucase ?x)
6
+ # [121] BuiltInCall ::= ... | 'UCASE' '(' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?s (UCASE(?str) AS ?ustr) WHERE {
11
+ # ?s :str ?str
12
+ # }
13
+ #
14
+ # @example SSE
15
+ # (prefix
16
+ # ((: <http://example.org/>))
17
+ # (project (?str ?ustr)
18
+ # (extend ((?ustr (ucase ?str)))
19
+ # (bgp (triple ?s :str ?str)))))
8
20
  #
9
21
  # @see https://www.w3.org/TR/sparql11-query/#func-ucase
10
22
  # @see https://www.w3.org/TR/xpath-functions/#func-ucase
@@ -26,6 +38,15 @@ module SPARQL; module Algebra
26
38
  else raise TypeError, "expected an RDF::Literal::Numeric, but got #{operand.inspect}"
27
39
  end
28
40
  end
41
+
42
+ ##
43
+ #
44
+ # Returns a partial SPARQL grammar for this operator.
45
+ #
46
+ # @return [String]
47
+ def to_sparql(**options)
48
+ "UCASE(" + operands.last.to_sparql(**options) + ")"
49
+ end
29
50
  end # UCase
30
51
  end # Operator
31
52
  end; end # SPARQL::Algebra
@@ -3,12 +3,19 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `union` operator.
5
5
  #
6
- # @example
7
- # (prefix ((: <http://example/>))
8
- # (union
9
- # (bgp (triple ?s ?p ?o))
10
- # (graph ?g
11
- # (bgp (triple ?s ?p ?o)))))
6
+ # [67] GroupOrUnionGraphPattern::= GroupGraphPattern ( 'UNION' GroupGraphPattern )*
7
+ #
8
+ # @example SPARQL Grammar
9
+ # SELECT * {
10
+ # { ?s ?p ?o }
11
+ # UNION
12
+ # { GRAPH ?g { ?s ?p ?o } }}
13
+ #
14
+ # @example SSE
15
+ # (union
16
+ # (bgp (triple ?s ?p ?o))
17
+ # (graph ?g
18
+ # (bgp (triple ?s ?p ?o))))
12
19
  #
13
20
  # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
14
21
  class Union < Operator::Binary
@@ -66,6 +73,22 @@ module SPARQL; module Algebra
66
73
  @operands = ops
67
74
  self
68
75
  end
76
+
77
+ ##
78
+ #
79
+ # Returns a partial SPARQL grammar for this operator.
80
+ #
81
+ # @param [Boolean] top_level (true)
82
+ # Treat this as a top-level, generating SELECT ... WHERE {}
83
+ # @return [String]
84
+ def to_sparql(top_level: true, **options)
85
+ str = "{\n"
86
+ str << operands[0].to_sparql(top_level: false, **options)
87
+ str << "\n} UNION {\n"
88
+ str << operands[1].to_sparql(top_level: false, **options)
89
+ str << "\n}"
90
+ top_level ? Operator.to_sparql(str, **options) : str
91
+ end
69
92
  end # Union
70
93
  end # Operator
71
94
  end; end # SPARQL::Algebra
@@ -3,11 +3,23 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `prefix` operator.
5
5
  #
6
- # @example
7
- # (update
6
+ # [29] Update ::= Prologue ( Update1 ( ';' Update )? )?
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX foaf: <http://xmlns.com/foaf/0.1/>
11
+ # DELETE { ?a foaf:knows ?b }
12
+ # INSERT { ?b foaf:knows ?a }
13
+ # WHERE { ?a foaf:knows ?b }
14
+ #
15
+ # @example SSE
16
+ # (prefix ((: <http://example.org/>)
17
+ # (foaf: <http://xmlns.com/foaf/0.1/>))
18
+ # (update
8
19
  # (modify
9
- # (bgp (triple ?s ?p ?o))
10
- # (insert ((triple ?s ?p "q")))))
20
+ # (bgp (triple ?a foaf:knows ?b))
21
+ # (delete ((triple ?a foaf:knows ?b)))
22
+ # (insert ((triple ?b foaf:knows ?a)))) ))
11
23
  #
12
24
  # @see https://www.w3.org/TR/sparql11-update/#graphUpdate
13
25
  class Update < Operator
@@ -39,6 +51,15 @@ module SPARQL; module Algebra
39
51
  end
40
52
  queryable
41
53
  end
54
+
55
+ ##
56
+ #
57
+ # Returns a partial SPARQL grammar for this operator.
58
+ #
59
+ # @return [String]
60
+ def to_sparql(**options)
61
+ str = operands.map { |e| e.to_sparql(**options) }.join("\n")
62
+ end
42
63
  end # Update
43
64
  end # Operator
44
65
  end; end # SPARQL::Algebra
@@ -6,8 +6,27 @@ module SPARQL; module Algebra
6
6
  #
7
7
  # The USING and USING NAMED clauses affect the RDF Dataset used while evaluating the WHERE clause. This describes a dataset in the same way as FROM and FROM NAMED clauses describe RDF Datasets in the SPARQL 1.1 Query Language
8
8
  #
9
- # @example
10
- # (using (:g1) (bgp (triple ?s ?p ?o)))
9
+ # [44] UsingClause ::= 'USING' ( iri | 'NAMED' iri )
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
+ # USING <http://example.org/g2>
17
+ # WHERE {
18
+ # :a foaf:knows ?s .
19
+ # ?s ?p ?o
20
+ # }
21
+ #
22
+ # @example SSE
23
+ # (prefix
24
+ # ((: <http://example.org/>) (foaf: <http://xmlns.com/foaf/0.1/>))
25
+ # (update
26
+ # (modify
27
+ # (using (:g2)
28
+ # (bgp (triple :a foaf:knows ?s) (triple ?s ?p ?o)))
29
+ # (delete ((triple ?s ?p ?o)))) ))
11
30
  #
12
31
  # @see https://www.w3.org/TR/sparql11-update/#add
13
32
  class Using < Operator
@@ -35,6 +54,17 @@ module SPARQL; module Algebra
35
54
  debug(options) {"Using"}
36
55
  Dataset.new(*operands).execute(queryable, depth: options[:depth].to_i + 1, **options, &block)
37
56
  end
57
+
58
+ ##
59
+ #
60
+ # Returns a partial SPARQL grammar for this operator.
61
+ #
62
+ # @return [String]
63
+ def to_sparql(**options)
64
+ str = "USING #{operands.first.to_sparql(**options)}\n"
65
+ content = operands.last.to_sparql(top_level: false, **options)
66
+ str << Operator.to_sparql(content, project: nil, **options)
67
+ end
38
68
  end # Using
39
69
  end # Operator
40
70
  end; end # SPARQL::Algebra