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,8 +3,17 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL Property Path `reverse` (NegatedPropertySet) operator.
5
5
  #
6
- # @example
7
- # (reverse :p)
6
+ # [92] PathEltOrInverse ::= PathElt | '^' PathElt
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX ex: <http://www.example.org/schema#>
10
+ # PREFIX in: <http://www.example.org/instance#>
11
+ # ASK { in:b ^ex:p in:a }
12
+ #
13
+ # @example SSE
14
+ # (prefix ((ex: <http://www.example.org/schema#>)
15
+ # (in: <http://www.example.org/instance#>))
16
+ # (ask (path in:b (reverse ex:p) in:a)))
8
17
  #
9
18
  # @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_inverse
10
19
  class Reverse < Operator::Unary
@@ -49,6 +58,15 @@ module SPARQL; module Algebra
49
58
  ), &block)
50
59
 
51
60
  end
61
+
62
+ ##
63
+ #
64
+ # Returns a partial SPARQL grammar for this operator.
65
+ #
66
+ # @return [String]
67
+ def to_sparql(**options)
68
+ "^" + operands.first.to_sparql(**options)
69
+ end
52
70
  end # Reverse
53
71
  end # Operator
54
72
  end; end # SPARQL::Algebra
@@ -5,8 +5,22 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Returns the number with no fractional part that is closest to the argument. If there are two such numbers, then the one that is closest to positive infinity is returned. An error is raised if `arg` is not a numeric value.
7
7
  #
8
- # @example
9
- # (round ?x)
8
+ # [121] BuiltInCall ::= ... 'ROUND' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
13
+ # SELECT ?s ?num (ROUND(?num) AS ?round) WHERE {
14
+ # ?s :num ?num
15
+ # }
16
+ #
17
+ # @example SSE
18
+ # (prefix
19
+ # ((: <http://example.org/>)
20
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
21
+ # (project (?s ?num ?round)
22
+ # (extend ((?round (round ?num)))
23
+ # (bgp (triple ?s :num ?num)))))
10
24
  #
11
25
  # @see https://www.w3.org/TR/sparql11-query/#func-round
12
26
  # @see https://www.w3.org/TR/xpath-functions/#func-round
@@ -29,5 +43,14 @@ module SPARQL; module Algebra
29
43
  end
30
44
  end
31
45
  end # Round
46
+
47
+ ##
48
+ #
49
+ # Returns a partial SPARQL grammar for this operator.
50
+ #
51
+ # @return [String]
52
+ def to_sparql(**options)
53
+ "ROUND(#{operands.to_sparql(**options)})"
54
+ end
32
55
  end # Operator
33
56
  end; end # SPARQL::Algebra
@@ -3,12 +3,21 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `sameTerm` operator.
5
5
  #
6
- # @example
7
- # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
- # (: <http://example.org/things#>))
9
- # (project (?x ?v)
10
- # (filter (sameTerm ?v)
11
- # (bgp (triple ?x :p ?v)))))
6
+ # [121] BuiltInCall ::= ... | 'sameTerm' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/things#>
10
+ # SELECT * {
11
+ # ?x1 :p ?v1 .
12
+ # ?x2 :p ?v2 .
13
+ # FILTER sameTerm(?v1, ?v2)
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/things#>))
19
+ # (filter (sameTerm ?v1 ?v2)
20
+ # (bgp (triple ?x1 :p ?v1) (triple ?x2 :p ?v2))))
12
21
  #
13
22
  # @see https://www.w3.org/TR/sparql11-query/#func-sameTerm
14
23
  class SameTerm < Operator::Binary
@@ -44,6 +53,15 @@ module SPARQL; module Algebra
44
53
  super # @see Operator#optimize!
45
54
  end
46
55
  end
56
+
57
+ ##
58
+ #
59
+ # Returns a partial SPARQL grammar for this operator.
60
+ #
61
+ # @return [String]
62
+ def to_sparql(**options)
63
+ "sameTerm(#{operands.to_sparql(delimiter: ', ', **options)})"
64
+ end
47
65
  end # SameTerm
48
66
  end # Operator
49
67
  end; end # SPARQL::Algebra
@@ -3,13 +3,26 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `sample` set function.
5
5
  #
6
- # @example
7
- # (prefix ((: <http://www.example.org/>))
8
- # (filter (|| (|| (= ?sample 1.0) (= ?sample 2.2)) (= ?sample 3.5))
9
- # (project (?sample)
10
- # (extend ((?sample ??.0))
11
- # (group () ((??.0 (sample ?o)))
12
- # (bgp (triple ?s :dec ?o)))))))
6
+ # [127] Aggregate::= ... | 'SAMPLE' '(' 'DISTINCT'? Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example/>
10
+ #
11
+ # SELECT ?w (SAMPLE(?v) AS ?S)
12
+ # {
13
+ # ?s :p ?v .
14
+ # OPTIONAL { ?s :q ?w }
15
+ # }
16
+ # GROUP BY ?w
17
+ #
18
+ # @example SSE
19
+ # (prefix ((: <http://example/>))
20
+ # (project (?w ?S)
21
+ # (extend ((?S ??.0))
22
+ # (group (?w) ((??.0 (sample ?v)))
23
+ # (leftjoin
24
+ # (bgp (triple ?s :p ?v))
25
+ # (bgp (triple ?s :q ?w))))) ))
13
26
  #
14
27
  # @see https://www.w3.org/TR/sparql11-query/#defn_aggSample
15
28
  class Sample < Operator
@@ -34,6 +47,15 @@ module SPARQL; module Algebra
34
47
  def apply(enum, **options)
35
48
  enum.detect(lambda {raise TypeError, "Sampling an empty multiset"}) {|e| e.first}.first
36
49
  end
37
- end # LCase
50
+
51
+ ##
52
+ #
53
+ # Returns a partial SPARQL grammar for this operator.
54
+ #
55
+ # @return [String]
56
+ def to_sparql(**options)
57
+ "SAMPLE(#{operands.to_sparql(**options)})"
58
+ end
59
+ end # Sample
38
60
  end # Operator
39
61
  end; end # SPARQL::Algebra
@@ -5,11 +5,20 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Returns the seconds part of the lexical form of `arg`.
7
7
  #
8
- # @example
9
- # (prefix ((: <http://example.org/>))
10
- # (project (?s ?x)
11
- # (extend ((?x (seconds ?date)))
12
- # (bgp (triple ?s :date ?date)))))
8
+ # [121] BuiltInCall ::= ... | 'SECONDS' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # SELECT ?s (SECONDS(?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 (seconds ?date)))
21
+ # (bgp (triple ?s :date ?date)))))
13
22
  #
14
23
  # @see https://www.w3.org/TR/sparql11-query/#func-seconds
15
24
  class Seconds < Operator::Unary
@@ -28,6 +37,15 @@ 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
  RDF::Literal(operand.object.second)
30
39
  end
40
+
41
+ ##
42
+ #
43
+ # Returns a partial SPARQL grammar for this operator.
44
+ #
45
+ # @return [String]
46
+ def to_sparql(**options)
47
+ "SECONDS(#{operands.last.to_sparql(**options)})"
48
+ end
31
49
  end # Seconds
32
50
  end # Operator
33
51
  end; end # SPARQL::Algebra
@@ -3,8 +3,17 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL Property Path `sequence` (SequencePath) operator.
5
5
  #
6
- # @example
7
- # (seq :a :b)
6
+ # # [90] PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX ex: <http://www.example.org/schema#>
10
+ # PREFIX in: <http://www.example.org/instance#>
11
+ # SELECT * WHERE { in:a ex:p1/ex:p2 ?x }
12
+ #
13
+ # @example SSE
14
+ # (prefix ((ex: <http://www.example.org/schema#>)
15
+ # (in: <http://www.example.org/instance#>))
16
+ # (path in:a (seq ex:p1 ex:p2) ?x))
8
17
  #
9
18
  # @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_sequence
10
19
  class Seq < Operator::Binary
@@ -67,6 +76,15 @@ module SPARQL; module Algebra
67
76
  @solutions.each(&block) if block_given?
68
77
  @solutions
69
78
  end
79
+
80
+ ##
81
+ #
82
+ # Returns a partial SPARQL grammar for this operator.
83
+ #
84
+ # @return [String]
85
+ def to_sparql(**options)
86
+ operands.to_sparql(delimiter: '/', **options)
87
+ end
70
88
  end # Seq
71
89
  end # Operator
72
90
  end; end # SPARQL::Algebra
@@ -6,16 +6,6 @@ module SPARQL; module Algebra
6
6
  #
7
7
  # Sequences through each operand
8
8
  #
9
- # @example
10
- # (sequence
11
- # (bgp
12
- # (triple ?s ?p ??0)
13
- # (triple ??0 rdf:first ??1)
14
- # (triple ??0 rdf:rest ??2)
15
- # (triple ??2 rdf:first ??3)
16
- # (triple ??2 rdf:rest rdf:nil))
17
- # (path ??1 (seq (path* :p) :q) 123)
18
- # (path ??3 (reverse :r) "hello"))
19
9
  class Sequence < Operator
20
10
  include SPARQL::Algebra::Update
21
11
 
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA1 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA1' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA1(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha1 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA1.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA1(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA1
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA256 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA256' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA256(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha256 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA256.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA256(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA256
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA384 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA384' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA384(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha384 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA384.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA384(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA384
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA512 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA512' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA512(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha512 ?l)))
@@ -31,6 +39,15 @@ module SPARQL; module Algebra
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA512.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA512(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA512
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -3,12 +3,23 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `slice` operator.
5
5
  #
6
- # @example
6
+ # [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause?
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/ns#>
10
+ #
11
+ # SELECT ?v
12
+ # WHERE { :a ?p ?v }
13
+ # ORDER BY ?v
14
+ # OFFSET 100
15
+ # LIMIT 1
16
+ #
17
+ # @example SSE
7
18
  # (prefix ((: <http://example.org/ns#>))
8
- # (slice 1 1
9
- # (project (?v)
10
- # (order (?v)
11
- # (bgp (triple ??0 :num ?v))))))
19
+ # (slice 100 1
20
+ # (project (?v)
21
+ # (order (?v)
22
+ # (bgp (triple :a ?p ?v))))))
12
23
  #
13
24
  # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
14
25
  class Slice < Operator::Ternary
@@ -52,6 +63,17 @@ module SPARQL; module Algebra
52
63
  @solutions.each(&block) if block_given?
53
64
  @solutions
54
65
  end
66
+
67
+ ##
68
+ #
69
+ # Extracts OFFSET and LIMIT.
70
+ #
71
+ # @return [String]
72
+ def to_sparql(**options)
73
+ offset = operands[0].to_i unless operands[0] == :_
74
+ limit = operands[1].to_i unless operands[1] == :_
75
+ operands.last.to_sparql(offset: offset, limit: limit, **options)
76
+ end
55
77
  end # Slice
56
78
  end # Operator
57
79
  end; end # SPARQL::Algebra
@@ -3,7 +3,18 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `str` operator.
5
5
  #
6
- # @example
6
+ # [121] BuiltInCall ::= ... | 'STR' '(' 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 ( str(?v) = "1" ) .
15
+ # }
16
+ #
17
+ # @example SSE
7
18
  # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
19
  # (: <http://example.org/things#>))
9
20
  # (project (?x ?v)
@@ -30,6 +41,15 @@ module SPARQL; module Algebra
30
41
  else raise TypeError, "expected an RDF::Literal or RDF::URI, but got #{term.inspect}"
31
42
  end
32
43
  end
44
+
45
+ ##
46
+ #
47
+ # Returns a partial SPARQL grammar for this operator.
48
+ #
49
+ # @return [String]
50
+ def to_sparql(**options)
51
+ "str(" + operands.first.to_sparql(**options) + ")"
52
+ end
33
53
  end # Str
34
54
  end # Operator
35
55
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `strafter` operator.
5
5
  #
6
- # @example
7
- # (strafter ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRAFTER' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRAFTER(?str,"e") AS ?suffix) WHERE {
12
+ # ?s :str ?str
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?suffix)
20
+ # (extend ((?suffix (strafter ?str "e")))
21
+ # (bgp (triple ?s :str ?str)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strafter
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-substring-after
@@ -52,6 +66,15 @@ module SPARQL; module Algebra
52
66
  RDF::Literal(parts.last, datatype: left.datatype, language: left.language)
53
67
  end
54
68
  end
69
+
70
+ ##
71
+ #
72
+ # Returns a partial SPARQL grammar for this operator.
73
+ #
74
+ # @return [String]
75
+ def to_sparql(**options)
76
+ "STRAFTER(" + operands.to_sparql(delimiter: ', ', **options) + ")"
77
+ end
55
78
  end # StrAfter
56
79
  end # Operator
57
80
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `strbefore` operator.
5
5
  #
6
- # @example
7
- # (strbefore ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRBEFORE' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRBEFORE(?str,"s") AS ?prefix) WHERE {
12
+ # ?s :str ?str
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?prefix)
20
+ # (extend ((?prefix (strbefore ?str "s")))
21
+ # (bgp (triple ?s :str ?str)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strbefore
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-substring-before
@@ -54,6 +68,15 @@ module SPARQL; module Algebra
54
68
  RDF::Literal(parts.first, language: left.language, datatype: left.datatype)
55
69
  end
56
70
  end
71
+
72
+ ##
73
+ #
74
+ # Returns a partial SPARQL grammar for this operator.
75
+ #
76
+ # @return [String]
77
+ def to_sparql(**options)
78
+ "STRBEFORE(" + operands.to_sparql(delimiter: ', ', **options) + ")"
79
+ end
57
80
  end # StrBefore
58
81
  end # Operator
59
82
  end; end # SPARQL::Algebra
@@ -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")
@@ -28,6 +40,15 @@ module SPARQL; module Algebra
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
@@ -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