sparql 3.1.5 → 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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -28
  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 +4 -1
  8. data/lib/sparql/algebra/extensions.rb +96 -29
  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 +18 -2
  16. data/lib/sparql/algebra/operator/base.rb +18 -1
  17. data/lib/sparql/algebra/operator/bgp.rb +5 -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 +16 -2
  22. data/lib/sparql/algebra/operator/coalesce.rb +33 -11
  23. data/lib/sparql/algebra/operator/compare.rb +48 -33
  24. data/lib/sparql/algebra/operator/concat.rb +26 -2
  25. data/lib/sparql/algebra/operator/construct.rb +31 -7
  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 +18 -2
  29. data/lib/sparql/algebra/operator/create.rb +19 -2
  30. data/lib/sparql/algebra/operator/dataset.rb +17 -0
  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 +27 -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 +18 -1
  39. data/lib/sparql/algebra/operator/divide.rb +27 -3
  40. data/lib/sparql/algebra/operator/drop.rb +17 -2
  41. data/lib/sparql/algebra/operator/encode_for_uri.rb +25 -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 +12 -1
  45. data/lib/sparql/algebra/operator/extend.rb +33 -18
  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/graph.rb +13 -0
  49. data/lib/sparql/algebra/operator/greater_than.rb +14 -4
  50. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +14 -4
  51. data/lib/sparql/algebra/operator/group.rb +34 -8
  52. data/lib/sparql/algebra/operator/group_concat.rb +20 -8
  53. data/lib/sparql/algebra/operator/hours.rb +24 -6
  54. data/lib/sparql/algebra/operator/if.rb +21 -4
  55. data/lib/sparql/algebra/operator/in.rb +18 -1
  56. data/lib/sparql/algebra/operator/insert.rb +22 -2
  57. data/lib/sparql/algebra/operator/insert_data.rb +23 -2
  58. data/lib/sparql/algebra/operator/iri.rb +22 -5
  59. data/lib/sparql/algebra/operator/is_blank.rb +20 -2
  60. data/lib/sparql/algebra/operator/is_iri.rb +20 -2
  61. data/lib/sparql/algebra/operator/is_literal.rb +20 -2
  62. data/lib/sparql/algebra/operator/is_numeric.rb +22 -4
  63. data/lib/sparql/algebra/operator/is_triple.rb +62 -0
  64. data/lib/sparql/algebra/operator/join.rb +22 -1
  65. data/lib/sparql/algebra/operator/lang.rb +26 -1
  66. data/lib/sparql/algebra/operator/lang_matches.rb +23 -2
  67. data/lib/sparql/algebra/operator/lcase.rb +24 -3
  68. data/lib/sparql/algebra/operator/left_join.rb +29 -1
  69. data/lib/sparql/algebra/operator/less_than.rb +14 -4
  70. data/lib/sparql/algebra/operator/less_than_or_equal.rb +14 -4
  71. data/lib/sparql/algebra/operator/load.rb +25 -2
  72. data/lib/sparql/algebra/operator/max.rb +18 -2
  73. data/lib/sparql/algebra/operator/md5.rb +23 -6
  74. data/lib/sparql/algebra/operator/min.rb +19 -3
  75. data/lib/sparql/algebra/operator/minus.rb +25 -7
  76. data/lib/sparql/algebra/operator/minutes.rb +24 -6
  77. data/lib/sparql/algebra/operator/modify.rb +41 -5
  78. data/lib/sparql/algebra/operator/month.rb +24 -6
  79. data/lib/sparql/algebra/operator/move.rb +20 -2
  80. data/lib/sparql/algebra/operator/multiply.rb +27 -4
  81. data/lib/sparql/algebra/operator/negate.rb +24 -4
  82. data/lib/sparql/algebra/operator/not.rb +25 -4
  83. data/lib/sparql/algebra/operator/not_equal.rb +16 -1
  84. data/lib/sparql/algebra/operator/notexists.rb +30 -6
  85. data/lib/sparql/algebra/operator/notin.rb +20 -3
  86. data/lib/sparql/algebra/operator/notoneof.rb +12 -2
  87. data/lib/sparql/algebra/operator/now.rb +25 -6
  88. data/lib/sparql/algebra/operator/object.rb +59 -0
  89. data/lib/sparql/algebra/operator/or.rb +26 -3
  90. data/lib/sparql/algebra/operator/order.rb +27 -2
  91. data/lib/sparql/algebra/operator/path.rb +29 -2
  92. data/lib/sparql/algebra/operator/path_opt.rb +21 -2
  93. data/lib/sparql/algebra/operator/path_plus.rb +21 -2
  94. data/lib/sparql/algebra/operator/path_star.rb +20 -2
  95. data/lib/sparql/algebra/operator/plus.rb +43 -4
  96. data/lib/sparql/algebra/operator/predicate.rb +59 -0
  97. data/lib/sparql/algebra/operator/prefix.rb +24 -3
  98. data/lib/sparql/algebra/operator/project.rb +51 -5
  99. data/lib/sparql/algebra/operator/rand.rb +31 -3
  100. data/lib/sparql/algebra/operator/reduced.rb +18 -1
  101. data/lib/sparql/algebra/operator/regex.rb +27 -19
  102. data/lib/sparql/algebra/operator/replace.rb +27 -7
  103. data/lib/sparql/algebra/operator/reverse.rb +20 -2
  104. data/lib/sparql/algebra/operator/round.rb +26 -3
  105. data/lib/sparql/algebra/operator/same_term.rb +25 -7
  106. data/lib/sparql/algebra/operator/sample.rb +31 -9
  107. data/lib/sparql/algebra/operator/seconds.rb +24 -6
  108. data/lib/sparql/algebra/operator/seq.rb +20 -2
  109. data/lib/sparql/algebra/operator/sequence.rb +0 -10
  110. data/lib/sparql/algebra/operator/sha1.rb +19 -2
  111. data/lib/sparql/algebra/operator/sha256.rb +19 -2
  112. data/lib/sparql/algebra/operator/sha384.rb +19 -2
  113. data/lib/sparql/algebra/operator/sha512.rb +19 -2
  114. data/lib/sparql/algebra/operator/slice.rb +27 -5
  115. data/lib/sparql/algebra/operator/str.rb +22 -2
  116. data/lib/sparql/algebra/operator/strafter.rb +26 -3
  117. data/lib/sparql/algebra/operator/strbefore.rb +26 -3
  118. data/lib/sparql/algebra/operator/strdt.rb +23 -2
  119. data/lib/sparql/algebra/operator/strends.rb +26 -4
  120. data/lib/sparql/algebra/operator/strlang.rb +26 -7
  121. data/lib/sparql/algebra/operator/strlen.rb +24 -3
  122. data/lib/sparql/algebra/operator/strstarts.rb +26 -3
  123. data/lib/sparql/algebra/operator/struuid.rb +30 -10
  124. data/lib/sparql/algebra/operator/subject.rb +61 -0
  125. data/lib/sparql/algebra/operator/substr.rb +24 -3
  126. data/lib/sparql/algebra/operator/subtract.rb +29 -3
  127. data/lib/sparql/algebra/operator/sum.rb +18 -2
  128. data/lib/sparql/algebra/operator/table.rb +42 -4
  129. data/lib/sparql/algebra/operator/timezone.rb +24 -6
  130. data/lib/sparql/algebra/operator/tz.rb +23 -6
  131. data/lib/sparql/algebra/operator/ucase.rb +24 -3
  132. data/lib/sparql/algebra/operator/union.rb +29 -6
  133. data/lib/sparql/algebra/operator/update.rb +25 -4
  134. data/lib/sparql/algebra/operator/using.rb +32 -2
  135. data/lib/sparql/algebra/operator/uuid.rb +28 -9
  136. data/lib/sparql/algebra/operator/with.rb +38 -4
  137. data/lib/sparql/algebra/operator/year.rb +24 -6
  138. data/lib/sparql/algebra/operator.rb +112 -7
  139. data/lib/sparql/algebra/sxp_extensions.rb +3 -3
  140. data/lib/sparql/grammar/meta.rb +5390 -2410
  141. data/lib/sparql/grammar/parser11.rb +119 -53
  142. data/lib/sparql/grammar/terminals11.rb +2 -0
  143. data/lib/sparql/grammar.rb +0 -25
  144. metadata +40 -34
@@ -3,7 +3,19 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `strdt` operator.
5
5
  #
6
- # @example
6
+ # [121] BuiltInCall ::= ... | 'STRDT' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRDT(?str,xsd:string) AS ?str1) WHERE {
12
+ # ?s :str ?str
13
+ # FILTER(LANGMATCHES(LANG(?str), "en"))
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>) (xsd: <http://www.w3.org/2001/XMLSchema#>))
7
19
  # (project (?s ?str1)
8
20
  # (extend ((?str1 (strdt ?str xsd:string)))
9
21
  # (filter (langMatches (lang ?str) "en")
@@ -24,10 +36,19 @@ module SPARQL; module Algebra
24
36
  # datatype
25
37
  # @return [RDF::Literal] a datatyped literal
26
38
  # @see https://www.w3.org/TR/sparql11-query/#func-strdt
27
- def apply(value, datatypeIRI)
39
+ def apply(value, datatypeIRI, **options)
28
40
  raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
29
41
  RDF::Literal.new(value.to_s, datatype: datatypeIRI)
30
42
  end
43
+
44
+ ##
45
+ #
46
+ # Returns a partial SPARQL grammar for this operator.
47
+ #
48
+ # @return [String]
49
+ def to_sparql(**options)
50
+ "STRDT(" + operands.to_sparql(delimiter: ', ', **options) + ")"
51
+ end
31
52
  end # StrDT
32
53
  end # Operator
33
54
  end; end # SPARQL::Algebra
@@ -1,10 +1,23 @@
1
1
  module SPARQL; module Algebra
2
2
  class Operator
3
3
  ##
4
- # A SPARQL `contains` operator.
4
+ # A SPARQL `strends` operator.
5
5
  #
6
- # @example
7
- # (strends ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRENDS' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?s ?str WHERE {
11
+ # ?s :str ?str
12
+ # FILTER STRENDS(?str, "a")
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>))
18
+ # (project (?s ?str)
19
+ # (filter (strends ?str "a")
20
+ # (bgp (triple ?s :str ?str)))))
8
21
  #
9
22
  # @see https://www.w3.org/TR/sparql11-query/#func-strends
10
23
  # @see https://wwww.w3.org/TR/xpath-functions/#func-ends-with
@@ -33,7 +46,7 @@ module SPARQL; module Algebra
33
46
  # a literal
34
47
  # @return [RDF::Literal::Boolean]
35
48
  # @raise [TypeError] if operands are not compatible
36
- def apply(left, right)
49
+ def apply(left, right, **options)
37
50
  case
38
51
  when !left.compatible?(right)
39
52
  raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
@@ -41,6 +54,15 @@ module SPARQL; module Algebra
41
54
  else RDF::Literal::FALSE
42
55
  end
43
56
  end
57
+
58
+ ##
59
+ #
60
+ # Returns a partial SPARQL grammar for this operator.
61
+ #
62
+ # @return [String]
63
+ def to_sparql(**options)
64
+ "STRENDS(" + operands.to_sparql(delimiter: ', ', **options) + ")"
65
+ end
44
66
  end # StrEnds
45
67
  end # Operator
46
68
  end; end # SPARQL::Algebra
@@ -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
@@ -25,10 +35,19 @@ module SPARQL; module Algebra
25
35
  # datatype
26
36
  # @return [RDF::Literal] a datatyped literal
27
37
  # @see https://www.w3.org/TR/sparql11-query/#func-strlang
28
- def apply(value, langTag)
38
+ def apply(value, langTag, **options)
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
@@ -25,10 +37,19 @@ module SPARQL; module Algebra
25
37
  # the operand
26
38
  # @return [RDF::Literal::Integer] length of string
27
39
  # @raise [TypeError] if the operand is not a numeric value
28
- def apply(operand)
40
+ def apply(operand, **options)
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
@@ -33,7 +47,7 @@ module SPARQL; module Algebra
33
47
  # a literal
34
48
  # @return [RDF::Literal::Boolean]
35
49
  # @raise [TypeError] if operands are not compatible
36
- def apply(left, right)
50
+ def apply(left, right, **options)
37
51
  case
38
52
  when !left.compatible?(right)
39
53
  raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
@@ -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
@@ -24,9 +35,18 @@ module SPARQL; module Algebra
24
35
  # Return a string that is the scheme specific part of UUID. That is, as a simple literal, the result of generating a UUID, converting to a simple literal and removing the initial urn:uuid:.
25
36
  #
26
37
  # @return [RDF::URI]
27
- def apply
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
@@ -0,0 +1,61 @@
1
+ module SPARQL; module Algebra
2
+ class Operator
3
+ ##
4
+ # The SPARQL `SUBJECT` operator.
5
+ #
6
+ # Returns the subject part of `arg` as a term.
7
+ #
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
+ #
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
+ #
33
+ # @see https://w3c.github.io/rdf-star/rdf-star-cg-spec.html#subject
34
+ class Subject < Operator::Unary
35
+ include Evaluatable
36
+
37
+ NAME = :subject
38
+
39
+ ##
40
+ # Returns the subject part of arg.
41
+ #
42
+ # @param [RDF::Statement] operand
43
+ # the operand
44
+ # @return [RDF::Literal]
45
+ # @raise [TypeError] if the operand is not a statement
46
+ def apply(operand, **options)
47
+ raise TypeError, "expected an RDF::Statement, but got #{operand.inspect}" unless operand.is_a?(RDF::Statement)
48
+ operand.subject
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
59
+ end # Subject
60
+ end # Operator
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
@@ -49,7 +61,7 @@ module SPARQL; module Algebra
49
61
  # an optional length of the substring.
50
62
  # @return [RDF::Literal]
51
63
  # @raise [TypeError] if operands are not compatible
52
- def apply(source, startingLoc, length)
64
+ def apply(source, startingLoc, length, **options)
53
65
  raise TypeError, "expected a plain RDF::Literal, but got #{source.inspect}" unless source.literal? && source.plain?
54
66
  text = text.to_s
55
67
 
@@ -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
@@ -20,13 +37,22 @@ module SPARQL; module Algebra
20
37
  # a numeric literal
21
38
  # @return [RDF::Literal::Numeric]
22
39
  # @raise [TypeError] if either operand is not a numeric literal
23
- def apply(left, right)
40
+ def apply(left, right, **options)
24
41
  case
25
42
  when left.is_a?(RDF::Literal::Numeric) && right.is_a?(RDF::Literal::Numeric)
26
43
  left - right
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))
@@ -22,7 +29,7 @@ module SPARQL; module Algebra
22
29
  # @param [Enumerable<Array<RDF::Term>>] enum
23
30
  # enum of evaluated operand
24
31
  # @return [RDF::Literal::Numeric] The sum of the terms
25
- def apply(enum)
32
+ def apply(enum, **options)
26
33
  # FIXME: we don't actually do anything with distinct
27
34
  operands.shift if distinct = (operands.first == :distinct)
28
35
  if enum.empty?
@@ -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
@@ -26,11 +35,20 @@ module SPARQL; module Algebra
26
35
  # the operand
27
36
  # @return [RDF::Literal]
28
37
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
38
+ def apply(operand, **options)
30
39
  raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
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
@@ -24,10 +33,18 @@ module SPARQL; module Algebra
24
33
  # the operand
25
34
  # @return [RDF::Literal]
26
35
  # @raise [TypeError] if the operand is not a simple literal
27
- def apply(operand)
36
+ def apply(operand, **options)
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