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
@@ -6,8 +6,19 @@ module SPARQL; module Algebra
6
6
  #
7
7
  # The DELETE WHERE operation is a shortcut form for the DELETE/INSERT operation where bindings matched by the WHERE clause are used to define the triples in a graph that will be deleted.
8
8
  #
9
- # @example
10
- # (deleteWhere ((triple :a foaf:knows ?b))
9
+ # [40] DeleteWhere ::= 'DELETE WHERE' QuadPattern
10
+ #
11
+ # @example SPARQL Grammar
12
+ # PREFIX : <http://example.org/>
13
+ # PREFIX foaf: <http://xmlns.com/foaf/0.1/>
14
+ # DELETE WHERE { :a foaf:knows ?b }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>)
19
+ # (foaf: <http://xmlns.com/foaf/0.1/>))
20
+ # (update
21
+ # (deleteWhere ((triple :a foaf:knows ?b)))))
11
22
  #
12
23
  # @see https://www.w3.org/TR/sparql11-update/#deleteWhere
13
24
  class DeleteWhere < Operator::Unary
@@ -52,6 +63,17 @@ module SPARQL; module Algebra
52
63
  end
53
64
  queryable
54
65
  end
66
+
67
+ ##
68
+ #
69
+ # Returns a partial SPARQL grammar for this term.
70
+ #
71
+ # @return [String]
72
+ def to_sparql(**options)
73
+ "DELETE WHERE {\n" +
74
+ operands.first.to_sparql(as_statement: true, top_level: false, delimiter: "\n", **options) +
75
+ "\n}"
76
+ end
55
77
  end # DeleteWhere
56
78
  end # Operator
57
79
  end; end # SPARQL::Algebra
@@ -3,7 +3,15 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL descending sort operator.
5
5
  #
6
- # @example
6
+ # [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var )
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX foaf: <http://xmlns.com/foaf/0.1/>
10
+ # SELECT ?name
11
+ # WHERE { ?x foaf:name ?name }
12
+ # ORDER BY DESC(?name)
13
+ #
14
+ # @example SSE
7
15
  # (prefix ((foaf: <http://xmlns.com/foaf/0.1/>))
8
16
  # (project (?name)
9
17
  # (order ((desc ?name))
@@ -12,6 +20,17 @@ module SPARQL; module Algebra
12
20
  # @see https://www.w3.org/TR/sparql11-query/#modOrderBy
13
21
  class Desc < Operator::Asc
14
22
  NAME = :desc
23
+
24
+ ##
25
+ #
26
+ # Returns a partial SPARQL grammar for this operator.
27
+ #
28
+ # Provides order to descendant query.
29
+ #
30
+ # @return [String]
31
+ def to_sparql(**options)
32
+ "DESC(#{operands.last.to_sparql(**options)})"
33
+ end
15
34
  end # Desc
16
35
  end # Operator
17
36
  end; end # SPARQL::Algebra
@@ -5,10 +5,16 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Generages a graph across specified terms using {RDF::Queryable}`#concise_bounded_description`.
7
7
  #
8
- # @example
9
- # (prefix ((exOrg: <http://org.example.com/employees#>))
10
- # (describe (?x)
11
- # (bgp (triple ?x exOrg:employeeId "1234"))))
8
+ # [11] DescribeQuery ::= 'DESCRIBE' ( VarOrIri+ | '*' ) DatasetClause* WhereClause? SolutionModifier ValuesClause
9
+ #
10
+ # @example SPARQL Grammar
11
+ # BASE <http://example.org/>
12
+ # DESCRIBE <u> ?u WHERE { <x> <q> ?u . }
13
+ #
14
+ # @example SSE
15
+ # (base <http://example.org/>
16
+ # (describe (<u> ?u)
17
+ # (bgp (triple <x> <q> ?u))))
12
18
  #
13
19
  # @see https://www.w3.org/TR/sparql11-query/#describe
14
20
  class Describe < Operator::Binary
@@ -66,6 +72,23 @@ module SPARQL; module Algebra
66
72
  def query_yields_statements?
67
73
  true
68
74
  end
75
+
76
+ ##
77
+ #
78
+ # Returns a partial SPARQL grammar for this term.
79
+ #
80
+ # @return [String]
81
+ def to_sparql(**options)
82
+ str = "DESCRIBE "
83
+ str << if operands[0].empty?
84
+ "*"
85
+ else
86
+ operands[0].map { |e| e.to_sparql(**options) }.join(" ")
87
+ end
88
+
89
+ str << "\n"
90
+ str << operands[1].to_sparql(top_level: true, project: nil, **options)
91
+ end
69
92
  end # Construct
70
93
  end # Operator
71
94
  end; end # SPARQL::Algebra
@@ -3,7 +3,15 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `distinct` operator.
5
5
  #
6
- # @example
6
+ # [9] SelectClause ::= 'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' )
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT DISTINCT ?v
12
+ # WHERE { ?x ?p ?v }
13
+ #
14
+ # @example SSE
7
15
  # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
16
  # (: <http://example/>))
9
17
  # (distinct
@@ -36,6 +44,15 @@ module SPARQL; module Algebra
36
44
  @solutions.each(&block) if block_given?
37
45
  @solutions
38
46
  end
47
+
48
+ ##
49
+ #
50
+ # Returns a partial SPARQL grammar for this operator.
51
+ #
52
+ # @return [String]
53
+ def to_sparql(**options)
54
+ operands.first.to_sparql(distinct: true, **options)
55
+ end
39
56
  end # Distinct
40
57
  end # Operator
41
58
  end; end # SPARQL::Algebra
@@ -3,8 +3,23 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL numeric `divide` operator.
5
5
  #
6
- # @example
7
- # (/ 4 2)
6
+ # [117] MultiplicativeExpression::= UnaryExpression ( '*' UnaryExpression | '/' UnaryExpression )*
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?s WHERE {
11
+ # ?s :p ?o .
12
+ # ?s2 :p ?o2 .
13
+ # FILTER(?o / ?o2 = 4) .
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix ((: <http://example.org/>))
18
+ # (project (?s)
19
+ # (filter (= (/ ?o ?o2) 4)
20
+ # (bgp
21
+ # (triple ?s :p ?o)
22
+ # (triple ?s2 :p ?o2)))))
8
23
  #
9
24
  # @see https://www.w3.org/TR/xpath-functions/#func-numeric-divide
10
25
  class Divide < Operator::Binary
@@ -38,6 +53,15 @@ module SPARQL; module Algebra
38
53
  else raise TypeError, "expected two RDF::Literal::Numeric operands, but got #{left.inspect} and #{right.inspect}"
39
54
  end
40
55
  end
56
+
57
+ ##
58
+ #
59
+ # Returns a partial SPARQL grammar for this operator.
60
+ #
61
+ # @return [String]
62
+ def to_sparql(**options)
63
+ "#{operands.first.to_sparql(**options)} / #{operands.last.to_sparql(**options)}"
64
+ end
41
65
  end # Divide
42
66
  end # Operator
43
67
  end; end # SPARQL::Algebra
@@ -8,8 +8,14 @@ module SPARQL; module Algebra
8
8
  #
9
9
  # Equivalent to `clear` in this implementation
10
10
  #
11
- # @example
12
- # (drop default)
11
+ # [33] Drop ::= 'DROP' 'SILENT'? GraphRefAll
12
+ #
13
+ # @example SPARQL Grammar
14
+ # DROP DEFAULT
15
+ #
16
+ # @example SSE
17
+ # (update
18
+ # (drop default))
13
19
  #
14
20
  # @see https://www.w3.org/TR/sparql11-update/#drop
15
21
  class Drop < Operator
@@ -61,6 +67,15 @@ module SPARQL; module Algebra
61
67
 
62
68
  queryable
63
69
  end
70
+
71
+ ##
72
+ #
73
+ # Returns a partial SPARQL grammar for this operator.
74
+ #
75
+ # @return [String]
76
+ def to_sparql(**options)
77
+ "DROP " + operands.to_sparql(**options)
78
+ end
64
79
  end # Drop
65
80
  end # Operator
66
81
  end; end # SPARQL::Algebra
@@ -5,8 +5,21 @@ module SPARQL; module Algebra
5
5
  ##
6
6
  # The SPARQL logical `abs` operator.
7
7
  #
8
- # @example
9
- # (encode_for_uri ?x)
8
+ # [121] BuiltInCall ::= ... | 'ENCODE_FOR_URI' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
13
+ # SELECT ?s ?str (ENCODE_FOR_URI(?str) AS ?encoded) WHERE {
14
+ # ?s :str ?str
15
+ # }
16
+ #
17
+ # @example SSE
18
+ # (prefix
19
+ # ((: <http://example.org/>))
20
+ # (project (?str ?encoded)
21
+ # (extend ((?encoded (encode_for_uri ?str)))
22
+ # (bgp (triple ?s :str ?str)))))
10
23
  #
11
24
  # @see https://www.w3.org/TR/sparql11-query/#func-encode
12
25
  # @see https://www.w3.org/TR/xpath-functions/#func-abs
@@ -33,6 +46,15 @@ module SPARQL; module Algebra
33
46
  else raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}"
34
47
  end
35
48
  end
49
+
50
+ ##
51
+ #
52
+ # Returns a partial SPARQL grammar for this operator.
53
+ #
54
+ # @return [String]
55
+ def to_sparql(**options)
56
+ "ENCODE_FOR_URI(#{operands.last.to_sparql(**options)})"
57
+ end
36
58
  end # EncodeForURI
37
59
  end # Operator
38
60
  end; end # SPARQL::Algebra
@@ -3,8 +3,18 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL relational `=` (equal) comparison operator.
5
5
  #
6
- # @example
7
- # (= ?x ?y)
6
+ # [114] RelationalExpression ::= NumericExpression ('=' NumericExpression)?
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
10
+ # PREFIX : <http://example.org/things#>
11
+ # SELECT ?x
12
+ # WHERE { ?x :p ?v . FILTER ( ?v = 1 ) }
13
+ #
14
+ # @example SSE
15
+ # (prefix
16
+ # ((xsd: <http://www.w3.org/2001/XMLSchema#>) (: <http://example.org/things#>))
17
+ # (project (?x) (filter (= ?v 1) (bgp (triple ?x :p ?v)))))
8
18
  #
9
19
  # @see https://www.w3.org/TR/sparql11-query/#OperatorMapping
10
20
  # @see https://www.w3.org/TR/sparql11-query/#func-RDFterm-equal
@@ -5,10 +5,21 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # There is a filter operator EXISTS that takes a graph pattern. EXISTS returns `true`/`false` depending on whether the pattern matches the dataset given the bindings in the current group graph pattern, the dataset and the active graph at this point in the query evaluation. No additional binding of variables occurs. The `NOT EXISTS` form translates into `fn:not(EXISTS{...})`.
7
7
  #
8
- # @example
9
- # (prefix ((ex: <http://www.example.org/>))
10
- # (filter (exists (bgp (triple ?s ?p ex:o)))
11
- # (bgp (triple ?s ?p ?o))))
8
+ # [125] ExistsFunc ::= 'EXISTS' GroupGraphPattern
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example/>
12
+ # SELECT *
13
+ # WHERE {
14
+ # ?set a :Set .
15
+ # FILTER EXISTS { ?set :member 9 }
16
+ # }
17
+ #
18
+ # @example SSE
19
+ # (prefix ((: <http://example/>))
20
+ # (filter
21
+ # (exists (bgp (triple ?set :member 9)))
22
+ # (bgp (triple ?set a :Set))))
12
23
  #
13
24
  # @see https://www.w3.org/TR/sparql11-query/#func-filter-exists
14
25
  class Exists < Operator::Unary
@@ -32,6 +43,19 @@ module SPARQL; module Algebra
32
43
  depth: options[:depth].to_i + 1,
33
44
  **options).empty?
34
45
  end
46
+
47
+ ##
48
+ #
49
+ # Returns a partial SPARQL grammar for this operator.
50
+ #
51
+ # @param [Boolean] top_level (true)
52
+ # Treat this as a top-level, generating SELECT ... WHERE {}
53
+ # @return [String]
54
+ def to_sparql(top_level: true, **options)
55
+ "EXISTS {\n" +
56
+ operands.last.to_sparql(top_level: false, **options) +
57
+ "\n}"
58
+ end
35
59
  end # Exists
36
60
  end # Operator
37
61
  end; end # SPARQL::Algebra
@@ -5,7 +5,18 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Used for filters with more than one expression.
7
7
  #
8
- # @example
8
+ # [72] ExpressionList ::= NIL | '(' Expression ( ',' Expression )* ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # SELECT ?v ?w
12
+ # {
13
+ # FILTER (?v = 2)
14
+ # FILTER (?w = 3)
15
+ # ?s :p ?v .
16
+ # ?s :q ?w .
17
+ # }
18
+ #
19
+ # @example SSE
9
20
  # (prefix ((: <http://example/>))
10
21
  # (project (?v ?w)
11
22
  # (filter (exprlist (= ?v 2) (= ?w 3))
@@ -5,11 +5,19 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Extends a solution
7
7
  #
8
- # @example
9
- # (select (?z)
10
- # (project (?z)
11
- # (extend ((?z (+ ?o 10)))
12
- # (bgp (triple ?s <http://example/p> ?o)))))
8
+ # [60] Bind ::= 'BIND' '(' Expression 'AS' Var ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # SELECT ?z
12
+ # {
13
+ # ?x <http://example/p> ?o
14
+ # BIND(?o+1 AS ?z)
15
+ # }
16
+ #
17
+ # @example SSE
18
+ # (project (?z)
19
+ # (extend ((?z (+ ?o 10)))
20
+ # (bgp (triple ?s <http://example/p> ?o))))
13
21
  #
14
22
  # @see https://www.w3.org/TR/sparql11-query/#evaluation
15
23
  class Extend < Operator::Binary
@@ -73,6 +81,23 @@ module SPARQL; module Algebra
73
81
  end
74
82
  super
75
83
  end
76
- end # Filter
84
+
85
+ ##
86
+ #
87
+ # Returns a partial SPARQL grammar for this operator.
88
+ #
89
+ # Extracts bindings.
90
+ #
91
+ # @return [String]
92
+ def to_sparql(**options)
93
+ extensions = operands.first.inject({}) do |memo, (as, expression)|
94
+ memo.merge(as => expression)
95
+ end
96
+
97
+ # Merge any inherited extensions from options
98
+ extensions = options.delete(:extensions).merge(extensions) if options.key?(:extensions)
99
+ operands.last.to_sparql(extensions: extensions, **options)
100
+ end
101
+ end # Extend
77
102
  end # Operator
78
103
  end; end # SPARQL::Algebra
@@ -3,11 +3,19 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `filter` operator.
5
5
  #
6
- # @example
7
- # (select (?v)
8
- # (project (?v)
9
- # (filter (= ?v 2)
10
- # (bgp (triple ?s <http://example/p> ?v)))))
6
+ # [68] Filter ::= 'FILTER' Constraint
7
+ #
8
+ # @example SPARQL Grammar
9
+ # SELECT ?v
10
+ # {
11
+ # ?s <http://example/p> ?v
12
+ # FILTER(?v = 2)
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (project (?v)
17
+ # (filter (= ?v 2)
18
+ # (bgp (triple ?s <http://example/p> ?v))))
11
19
  #
12
20
  # @see https://www.w3.org/TR/sparql11-query/#evaluation
13
21
  class Filter < Operator::Binary
@@ -69,6 +77,20 @@ module SPARQL; module Algebra
69
77
  end
70
78
  self
71
79
  end
80
+
81
+ ##
82
+ #
83
+ # Returns a partial SPARQL grammar for this operator.
84
+ #
85
+ # Provides filters to descendant query.
86
+ #
87
+ # If filter operation is an Exprlist, then separate into multiple filter ops.
88
+ #
89
+ # @return [String]
90
+ def to_sparql(**options)
91
+ filter_ops = operands.first.is_a?(Operator::Exprlist) ? operands.first.operands : [operands.first]
92
+ operands.last.to_sparql(filter_ops: filter_ops, **options)
93
+ end
72
94
  end # Filter
73
95
  end # Operator
74
96
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL logical `floor` operator.
5
5
  #
6
- # @example
7
- # (floor ?x)
6
+ # [121] BuiltInCall ::= ... 'FLOOR' '(' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s ?num (FLOOR(?num) AS ?floor) WHERE {
12
+ # ?s :num ?num
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?num ?floor)
20
+ # (extend ((?floor (floor ?num)))
21
+ # (bgp (triple ?s :num ?num)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-floor
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-floor
@@ -30,6 +44,15 @@ module SPARQL; module Algebra
30
44
  else raise TypeError, "expected an RDF::Literal::Numeric, but got #{operand.inspect}"
31
45
  end
32
46
  end
47
+
48
+ ##
49
+ #
50
+ # Returns a partial SPARQL grammar for this operator.
51
+ #
52
+ # @return [String]
53
+ def to_sparql(**options)
54
+ "FLOOR(#{operands.to_sparql(**options)})"
55
+ end
33
56
  end # Floor
34
57
  end # Operator
35
58
  end; end # SPARQL::Algebra
@@ -5,6 +5,19 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # This is a wrapper to add a `graph_name` to the query, or an array of statements.
7
7
  #
8
+ # [58] GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example/>
12
+ # SELECT * {
13
+ # GRAPH ?g { ?s ?p ?o }
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix ((: <http://example/>))
18
+ # (graph ?g
19
+ # (bgp (triple ?s ?p ?o))))
20
+ #
8
21
  # @example of a query
9
22
  # (prefix ((: <http://example/>))
10
23
  # (graph ?g
@@ -3,8 +3,18 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL relational `>` (greater than) comparison operator.
5
5
  #
6
- # @example
7
- # (> ?x ?y)
6
+ # [114] RelationalExpression ::= NumericExpression ('>' NumericExpression)?
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
10
+ # PREFIX : <http://example.org/things#>
11
+ # SELECT ?x
12
+ # WHERE { ?x :p ?v . FILTER ( ?v > 1 ) }
13
+ #
14
+ # @example SSE
15
+ # (prefix
16
+ # ((xsd: <http://www.w3.org/2001/XMLSchema#>) (: <http://example.org/things#>))
17
+ # (project (?x) (filter (> ?v 1) (bgp (triple ?x :p ?v)))))
8
18
  #
9
19
  # @see https://www.w3.org/TR/sparql11-query/#OperatorMapping
10
20
  # @see https://www.w3.org/TR/xpath-functions/#func-compare
@@ -25,7 +35,6 @@ module SPARQL; module Algebra
25
35
  # @return [RDF::Literal::Boolean] `true` or `false`
26
36
  # @raise [TypeError] if either operand is not a literal
27
37
  def apply(left, right, **options)
28
- #require 'byebug'; byebug if super == RDF::Literal(1)
29
38
  RDF::Literal(super == RDF::Literal(1))
30
39
  end
31
40
  end # GreaterThan
@@ -4,8 +4,18 @@ module SPARQL; module Algebra
4
4
  # The SPARQL relational `>=` (greater than or equal) comparison
5
5
  # operator.
6
6
  #
7
- # @example
8
- # (>= ?x ?y)
7
+ # [114] RelationalExpression ::= NumericExpression ('>=' NumericExpression)?
8
+ #
9
+ # @example SPARQL Grammar
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # PREFIX : <http://example.org/things#>
12
+ # SELECT ?x
13
+ # WHERE { ?x :p ?v . FILTER ( ?v >= 1 ) }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((xsd: <http://www.w3.org/2001/XMLSchema#>) (: <http://example.org/things#>))
18
+ # (project (?x) (filter (>= ?v 1) (bgp (triple ?x :p ?v)))))
9
19
  #
10
20
  # @see https://www.w3.org/TR/sparql11-query/#OperatorMapping
11
21
  # @see https://www.w3.org/TR/xpath-functions/#func-compare
@@ -8,14 +8,22 @@ module SPARQL; module Algebra
8
8
  # query to be grouped. If three operands are provided,
9
9
  # the second is an array of temporary bindings.
10
10
  #
11
- # @example
12
- # (prefix ((: <http://example/>))
13
- # (project (?w ?S)
14
- # (extend ((?S ??.0))
15
- # (group (?w) ((??.0 (sample ?v)))
16
- # (leftjoin
17
- # (bgp (triple ?s :p ?v))
18
- # (bgp (triple ?s :q ?w)))))))
11
+ # [19] GroupClause ::= 'GROUP' 'BY' GroupCondition+
12
+ #
13
+ # @example SPARQL Grammar
14
+ # PREFIX : <http://www.example.org>
15
+ #
16
+ # SELECT ?P (COUNT(?O) AS ?C)
17
+ # WHERE { ?S ?P ?O }
18
+ # GROUP BY ?P
19
+ #
20
+ # @example SSE
21
+ # (prefix
22
+ # ((: <http://www.example.org>))
23
+ # (project (?P ?C)
24
+ # (extend ((?C ??.0))
25
+ # (group (?P) ((??.0 (count ?O)))
26
+ # (bgp (triple ?S ?P ?O))))))
19
27
  #
20
28
  # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
21
29
  class Group < Operator
@@ -122,6 +130,24 @@ module SPARQL; module Algebra
122
130
  end
123
131
  super
124
132
  end
133
+
134
+ ##
135
+ #
136
+ # Returns a partial SPARQL grammar for this operator.
137
+ #
138
+ # @param [Hash{Symbol => Operator}] extensions
139
+ # Variable bindings
140
+ # @return [String]
141
+ def to_sparql(extensions: {}, **options)
142
+ if operands.length > 2
143
+ # Replace extensions from temporary bindings
144
+ operands[1].each do |var, op|
145
+ ext_var = extensions.invert.fetch(var)
146
+ extensions[ext_var] = op
147
+ end
148
+ end
149
+ operands.last.to_sparql(extensions: extensions, group_ops: operands.first, **options)
150
+ end
125
151
  end # Group
126
152
  end # Operator
127
153
  end; end # SPARQL::Algebra
@@ -5,13 +5,16 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # GroupConcat is a set function which performs a string concatenation across the values of an expression with a group. The order of the strings is not specified. The separator character used in the concatenation may be given with the scalar argument SEPARATOR.
7
7
  #
8
- # @example
9
- # (prefix ((: <http://www.example.org/>))
10
- # (filter (|| (= ?g "1 22") (= ?g "22 1"))
11
- # (project (?g)
12
- # (extend ((?g ??.0))
13
- # (group () ((??.0 (group_concat ?o)))
14
- # (bgp (triple ??.0 :p1 ?o)))))))
8
+ # [127] Aggregate::= ... | 'GROUP_CONCAT' '(' 'DISTINCT'? Expression ( ';' 'SEPARATOR' '=' String )? ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # SELECT (GROUP_CONCAT(?x) AS ?y) {}
12
+ #
13
+ # @example SSE
14
+ # (project (?y)
15
+ # (extend ((?y ??.0))
16
+ # (group () ((??.0 (group_concat ?x)))
17
+ # (bgp))))
15
18
  #
16
19
  # @see https://www.w3.org/TR/sparql11-query/#defn_aggGroupConcat
17
20
  class GroupConcat < Operator
@@ -53,6 +56,15 @@ module SPARQL; module Algebra
53
56
  def apply(enum, separator, **options)
54
57
  RDF::Literal(enum.flatten.map(&:to_s).join(separator.to_s))
55
58
  end
59
+
60
+ ##
61
+ #
62
+ # Returns a partial SPARQL grammar for this operator.
63
+ #
64
+ # @return [String]
65
+ def to_sparql(**options)
66
+ "GROUP_CONCAT(#{operands.to_sparql(delimiter: ', ', **options)})"
67
+ end
56
68
  end # GroupConcat
57
69
  end # Operator
58
70
  end; end # SPARQL::Algebra