sparql 3.1.8 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -22
- data/VERSION +1 -1
- data/bin/sparql +13 -4
- data/lib/sparql/algebra/extensions.rb +93 -33
- data/lib/sparql/algebra/operator/abs.rb +22 -2
- data/lib/sparql/algebra/operator/add.rb +21 -2
- data/lib/sparql/algebra/operator/alt.rb +26 -2
- data/lib/sparql/algebra/operator/and.rb +25 -3
- data/lib/sparql/algebra/operator/asc.rb +20 -1
- data/lib/sparql/algebra/operator/ask.rb +17 -1
- data/lib/sparql/algebra/operator/avg.rb +17 -1
- data/lib/sparql/algebra/operator/base.rb +18 -1
- data/lib/sparql/algebra/operator/bgp.rb +5 -1
- data/lib/sparql/algebra/operator/bnode.rb +33 -10
- data/lib/sparql/algebra/operator/bound.rb +22 -1
- data/lib/sparql/algebra/operator/ceil.rb +25 -2
- data/lib/sparql/algebra/operator/clear.rb +16 -2
- data/lib/sparql/algebra/operator/coalesce.rb +33 -11
- data/lib/sparql/algebra/operator/compare.rb +9 -0
- data/lib/sparql/algebra/operator/concat.rb +26 -2
- data/lib/sparql/algebra/operator/construct.rb +29 -6
- data/lib/sparql/algebra/operator/contains.rb +24 -2
- data/lib/sparql/algebra/operator/copy.rb +19 -2
- data/lib/sparql/algebra/operator/count.rb +17 -1
- data/lib/sparql/algebra/operator/create.rb +19 -2
- data/lib/sparql/algebra/operator/dataset.rb +17 -0
- data/lib/sparql/algebra/operator/datatype.rb +25 -6
- data/lib/sparql/algebra/operator/day.rb +23 -5
- data/lib/sparql/algebra/operator/delete.rb +27 -2
- data/lib/sparql/algebra/operator/delete_data.rb +23 -2
- data/lib/sparql/algebra/operator/delete_where.rb +24 -2
- data/lib/sparql/algebra/operator/desc.rb +20 -1
- data/lib/sparql/algebra/operator/describe.rb +27 -4
- data/lib/sparql/algebra/operator/distinct.rb +18 -1
- data/lib/sparql/algebra/operator/divide.rb +26 -2
- data/lib/sparql/algebra/operator/drop.rb +17 -2
- data/lib/sparql/algebra/operator/encode_for_uri.rb +24 -2
- data/lib/sparql/algebra/operator/equal.rb +12 -2
- data/lib/sparql/algebra/operator/exists.rb +28 -4
- data/lib/sparql/algebra/operator/exprlist.rb +12 -1
- data/lib/sparql/algebra/operator/extend.rb +31 -6
- data/lib/sparql/algebra/operator/filter.rb +27 -5
- data/lib/sparql/algebra/operator/floor.rb +25 -2
- data/lib/sparql/algebra/operator/graph.rb +13 -0
- data/lib/sparql/algebra/operator/greater_than.rb +12 -3
- data/lib/sparql/algebra/operator/greater_than_or_equal.rb +12 -2
- data/lib/sparql/algebra/operator/group.rb +34 -8
- data/lib/sparql/algebra/operator/group_concat.rb +19 -7
- data/lib/sparql/algebra/operator/hours.rb +23 -5
- data/lib/sparql/algebra/operator/if.rb +21 -4
- data/lib/sparql/algebra/operator/in.rb +18 -1
- data/lib/sparql/algebra/operator/insert.rb +22 -2
- data/lib/sparql/algebra/operator/insert_data.rb +23 -2
- data/lib/sparql/algebra/operator/iri.rb +21 -4
- data/lib/sparql/algebra/operator/is_blank.rb +19 -1
- data/lib/sparql/algebra/operator/is_iri.rb +19 -1
- data/lib/sparql/algebra/operator/is_literal.rb +19 -1
- data/lib/sparql/algebra/operator/is_numeric.rb +21 -3
- data/lib/sparql/algebra/operator/is_triple.rb +32 -0
- data/lib/sparql/algebra/operator/join.rb +22 -1
- data/lib/sparql/algebra/operator/lang.rb +25 -0
- data/lib/sparql/algebra/operator/lang_matches.rb +22 -1
- data/lib/sparql/algebra/operator/lcase.rb +23 -2
- data/lib/sparql/algebra/operator/left_join.rb +29 -1
- data/lib/sparql/algebra/operator/less_than.rb +12 -3
- data/lib/sparql/algebra/operator/less_than_or_equal.rb +12 -2
- data/lib/sparql/algebra/operator/load.rb +25 -2
- data/lib/sparql/algebra/operator/max.rb +17 -1
- data/lib/sparql/algebra/operator/md5.rb +22 -5
- data/lib/sparql/algebra/operator/min.rb +18 -2
- data/lib/sparql/algebra/operator/minus.rb +25 -7
- data/lib/sparql/algebra/operator/minutes.rb +23 -5
- data/lib/sparql/algebra/operator/modify.rb +41 -5
- data/lib/sparql/algebra/operator/month.rb +23 -5
- data/lib/sparql/algebra/operator/move.rb +20 -2
- data/lib/sparql/algebra/operator/multiply.rb +26 -3
- data/lib/sparql/algebra/operator/negate.rb +23 -3
- data/lib/sparql/algebra/operator/not.rb +24 -3
- data/lib/sparql/algebra/operator/not_equal.rb +13 -0
- data/lib/sparql/algebra/operator/notexists.rb +30 -6
- data/lib/sparql/algebra/operator/notin.rb +20 -3
- data/lib/sparql/algebra/operator/notoneof.rb +12 -2
- data/lib/sparql/algebra/operator/now.rb +24 -5
- data/lib/sparql/algebra/operator/object.rb +32 -0
- data/lib/sparql/algebra/operator/or.rb +26 -3
- data/lib/sparql/algebra/operator/order.rb +20 -1
- data/lib/sparql/algebra/operator/path.rb +29 -2
- data/lib/sparql/algebra/operator/path_opt.rb +21 -2
- data/lib/sparql/algebra/operator/path_plus.rb +21 -2
- data/lib/sparql/algebra/operator/path_star.rb +20 -2
- data/lib/sparql/algebra/operator/plus.rb +42 -3
- data/lib/sparql/algebra/operator/predicate.rb +32 -0
- data/lib/sparql/algebra/operator/prefix.rb +24 -3
- data/lib/sparql/algebra/operator/project.rb +51 -5
- data/lib/sparql/algebra/operator/rand.rb +30 -2
- data/lib/sparql/algebra/operator/reduced.rb +18 -1
- data/lib/sparql/algebra/operator/regex.rb +26 -18
- data/lib/sparql/algebra/operator/replace.rb +26 -6
- data/lib/sparql/algebra/operator/reverse.rb +20 -2
- data/lib/sparql/algebra/operator/round.rb +25 -2
- data/lib/sparql/algebra/operator/same_term.rb +24 -6
- data/lib/sparql/algebra/operator/sample.rb +30 -8
- data/lib/sparql/algebra/operator/seconds.rb +23 -5
- data/lib/sparql/algebra/operator/seq.rb +20 -2
- data/lib/sparql/algebra/operator/sequence.rb +0 -10
- data/lib/sparql/algebra/operator/sha1.rb +18 -1
- data/lib/sparql/algebra/operator/sha256.rb +18 -1
- data/lib/sparql/algebra/operator/sha384.rb +18 -1
- data/lib/sparql/algebra/operator/sha512.rb +18 -1
- data/lib/sparql/algebra/operator/slice.rb +27 -5
- data/lib/sparql/algebra/operator/str.rb +21 -1
- data/lib/sparql/algebra/operator/strafter.rb +25 -2
- data/lib/sparql/algebra/operator/strbefore.rb +25 -2
- data/lib/sparql/algebra/operator/strdt.rb +22 -1
- data/lib/sparql/algebra/operator/strends.rb +25 -3
- data/lib/sparql/algebra/operator/strlang.rb +25 -6
- data/lib/sparql/algebra/operator/strlen.rb +23 -2
- data/lib/sparql/algebra/operator/strstarts.rb +25 -2
- data/lib/sparql/algebra/operator/struuid.rb +29 -9
- data/lib/sparql/algebra/operator/subject.rb +32 -0
- data/lib/sparql/algebra/operator/substr.rb +23 -2
- data/lib/sparql/algebra/operator/subtract.rb +28 -2
- data/lib/sparql/algebra/operator/sum.rb +17 -1
- data/lib/sparql/algebra/operator/table.rb +42 -4
- data/lib/sparql/algebra/operator/timezone.rb +23 -5
- data/lib/sparql/algebra/operator/tz.rb +22 -5
- data/lib/sparql/algebra/operator/ucase.rb +23 -2
- data/lib/sparql/algebra/operator/union.rb +29 -6
- data/lib/sparql/algebra/operator/update.rb +25 -4
- data/lib/sparql/algebra/operator/using.rb +32 -2
- data/lib/sparql/algebra/operator/uuid.rb +27 -8
- data/lib/sparql/algebra/operator/with.rb +38 -4
- data/lib/sparql/algebra/operator/year.rb +23 -5
- data/lib/sparql/algebra/operator.rb +99 -6
- data/lib/sparql/algebra/sxp_extensions.rb +3 -3
- data/lib/sparql/grammar/parser11.rb +4 -4
- metadata +22 -35
- 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
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
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
|
-
#
|
7
|
-
#
|
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
|
-
#
|
7
|
-
#
|
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
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'STRUUID' NIL
|
7
7
|
#
|
8
|
-
# @example
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
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
|
-
#
|
7
|
-
#
|
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
|
-
#
|
6
|
-
#
|
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
|
-
#
|
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
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
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
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
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
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
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
|
-
#
|
7
|
-
#
|
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
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
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
|
-
#
|
7
|
-
#
|
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
|
-
#
|
10
|
-
#
|
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
|
-
#
|
10
|
-
#
|
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
|