sparql 3.1.8 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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