sparql 3.1.8 → 3.2.3
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.
- checksums.yaml +4 -4
- data/README.md +88 -60
- data/VERSION +1 -1
- data/bin/sparql +15 -35
- data/lib/rack/sparql/conneg.rb +22 -1
- data/lib/sinatra/sparql/extensions.rb +1 -1
- data/lib/sinatra/sparql.rb +57 -12
- data/lib/sparql/algebra/expression.rb +63 -10
- data/lib/sparql/algebra/extensions.rb +110 -46
- data/lib/sparql/algebra/operator/abs.rb +22 -2
- data/lib/sparql/algebra/operator/add.rb +21 -2
- data/lib/sparql/algebra/operator/adjust.rb +69 -0
- 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 +19 -1
- data/lib/sparql/algebra/operator/base.rb +18 -1
- data/lib/sparql/algebra/operator/bgp.rb +13 -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 +26 -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 +52 -6
- data/lib/sparql/algebra/operator/create.rb +20 -2
- data/lib/sparql/algebra/operator/dataset.rb +37 -2
- data/lib/sparql/algebra/operator/datatype.rb +25 -6
- data/lib/sparql/algebra/operator/day.rb +25 -7
- data/lib/sparql/algebra/operator/delete.rb +29 -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 +20 -3
- data/lib/sparql/algebra/operator/divide.rb +26 -2
- data/lib/sparql/algebra/operator/drop.rb +27 -3
- data/lib/sparql/algebra/operator/encode_for_uri.rb +22 -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 +15 -2
- data/lib/sparql/algebra/operator/extend.rb +95 -7
- data/lib/sparql/algebra/operator/filter.rb +27 -5
- data/lib/sparql/algebra/operator/floor.rb +25 -2
- data/lib/sparql/algebra/operator/function_call.rb +64 -0
- data/lib/sparql/algebra/operator/graph.rb +69 -6
- 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 +133 -8
- data/lib/sparql/algebra/operator/group_concat.rb +43 -7
- data/lib/sparql/algebra/operator/hours.rb +25 -7
- data/lib/sparql/algebra/operator/if.rb +20 -3
- data/lib/sparql/algebra/operator/in.rb +18 -1
- data/lib/sparql/algebra/operator/insert.rb +24 -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 +20 -3
- data/lib/sparql/algebra/operator/is_iri.rb +20 -3
- data/lib/sparql/algebra/operator/is_literal.rb +20 -3
- data/lib/sparql/algebra/operator/is_numeric.rb +22 -5
- data/lib/sparql/algebra/operator/is_triple.rb +32 -0
- data/lib/sparql/algebra/operator/join.rb +58 -3
- 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 +22 -2
- data/lib/sparql/algebra/operator/left_join.rb +44 -3
- 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 +19 -1
- data/lib/sparql/algebra/operator/md5.rb +22 -5
- data/lib/sparql/algebra/operator/min.rb +21 -3
- data/lib/sparql/algebra/operator/minus.rb +65 -7
- data/lib/sparql/algebra/operator/minutes.rb +25 -7
- data/lib/sparql/algebra/operator/modify.rb +62 -5
- data/lib/sparql/algebra/operator/month.rb +25 -7
- 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 +21 -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 +64 -1
- data/lib/sparql/algebra/operator/path.rb +29 -2
- data/lib/sparql/algebra/operator/path_opt.rb +28 -65
- data/lib/sparql/algebra/operator/path_plus.rb +37 -10
- data/lib/sparql/algebra/operator/path_range.rb +178 -0
- data/lib/sparql/algebra/operator/path_star.rb +25 -4
- data/lib/sparql/algebra/operator/path_zero.rb +110 -0
- data/lib/sparql/algebra/operator/plus.rb +49 -8
- 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 +111 -6
- data/lib/sparql/algebra/operator/rand.rb +30 -2
- data/lib/sparql/algebra/operator/reduced.rb +20 -3
- 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 +31 -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 +32 -8
- data/lib/sparql/algebra/operator/seconds.rb +25 -7
- data/lib/sparql/algebra/operator/seq.rb +23 -5
- data/lib/sparql/algebra/operator/sequence.rb +14 -11
- 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 +24 -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 +37 -7
- data/lib/sparql/algebra/operator/sum.rb +24 -6
- data/lib/sparql/algebra/operator/table.rb +85 -4
- data/lib/sparql/algebra/operator/timezone.rb +25 -7
- data/lib/sparql/algebra/operator/triple.rb +24 -0
- data/lib/sparql/algebra/operator/tz.rb +24 -7
- 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 +46 -4
- data/lib/sparql/algebra/operator/using.rb +49 -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 +25 -7
- data/lib/sparql/algebra/operator.rb +150 -12
- data/lib/sparql/algebra/query.rb +5 -3
- data/lib/sparql/algebra/sxp_extensions.rb +3 -3
- data/lib/sparql/algebra.rb +42 -6
- data/lib/sparql/grammar/meta.rb +1367 -267
- data/lib/sparql/grammar/parser11.rb +829 -331
- data/lib/sparql/grammar/terminals11.rb +2 -2
- data/lib/sparql/grammar.rb +6 -4
- data/lib/sparql/results.rb +3 -2
- data/lib/sparql/server.rb +93 -0
- data/lib/sparql.rb +8 -5
- metadata +57 -35
@@ -3,9 +3,17 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL GraphPattern `reduced` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
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 REDUCED ?v
|
12
|
+
# WHERE { ?x ?p ?v }
|
13
|
+
#
|
14
|
+
# @example SSE
|
15
|
+
# (prefix ((: <http://example.org/>)
|
16
|
+
# (xsd: <http://www.w3.org/2001/XMLSchema#>))
|
9
17
|
# (reduced
|
10
18
|
# (project (?v)
|
11
19
|
# (bgp (triple ?x ?p ?v)))))
|
@@ -37,6 +45,15 @@ module SPARQL; module Algebra
|
|
37
45
|
@solutions.each(&block) if block_given?
|
38
46
|
@solutions
|
39
47
|
end
|
48
|
+
|
49
|
+
##
|
50
|
+
#
|
51
|
+
# Returns a partial SPARQL grammar for this operator.
|
52
|
+
#
|
53
|
+
# @return [String]
|
54
|
+
def to_sparql(**options)
|
55
|
+
operands.first.to_sparql(reduced: true, **options)
|
56
|
+
end
|
40
57
|
end # Reduced
|
41
58
|
end # Operator
|
42
59
|
end; end # SPARQL::Algebra
|
@@ -3,33 +3,31 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `regex` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [122] RegexExpression ::= 'REGEX' '(' Expression ',' Expression ( ',' Expression )? ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX ex: <http://example.com/#>
|
10
|
+
# PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
|
11
|
+
# SELECT ?val
|
12
|
+
# WHERE {
|
13
|
+
# ex:foo rdf:value ?val .
|
14
|
+
# FILTER regex(?val, "GHI")
|
15
|
+
# }
|
16
|
+
#
|
17
|
+
# @example SSE
|
7
18
|
# (prefix ((ex: <http://example.com/#>)
|
8
19
|
# (rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>))
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
20
|
+
# (project (?val)
|
21
|
+
# (filter (regex ?val "GHI")
|
22
|
+
# (bgp (triple ex:foo rdf:value ?val)))))
|
12
23
|
#
|
13
24
|
# @see https://www.w3.org/TR/sparql11-query/#funcex-regex
|
14
25
|
# @see https://www.w3.org/TR/xpath-functions/#func-matches
|
15
|
-
class Regex < Operator
|
26
|
+
class Regex < Operator
|
16
27
|
include Evaluatable
|
17
28
|
|
18
29
|
NAME = :regex
|
19
30
|
|
20
|
-
##
|
21
|
-
# Initializes a new operator instance.
|
22
|
-
#
|
23
|
-
# @param [RDF::Term] text
|
24
|
-
# @param [RDF::Term] pattern
|
25
|
-
# @param [RDF::Term] flags
|
26
|
-
# @param [Hash{Symbol => Object}] options
|
27
|
-
# any additional options (see {Operator#initialize})
|
28
|
-
# @raise [TypeError] if any operand is invalid
|
29
|
-
def initialize(text, pattern, flags = RDF::Literal(''), **options)
|
30
|
-
super
|
31
|
-
end
|
32
|
-
|
33
31
|
##
|
34
32
|
# Matches `text` against a regular expression `pattern`.
|
35
33
|
#
|
@@ -65,6 +63,16 @@ module SPARQL; module Algebra
|
|
65
63
|
options |= Regexp::EXTENDED if flags.include?(?x)
|
66
64
|
RDF::Literal(Regexp.new(pattern, options) === text)
|
67
65
|
end
|
66
|
+
|
67
|
+
##
|
68
|
+
#
|
69
|
+
# Returns a partial SPARQL grammar for this operator.
|
70
|
+
#
|
71
|
+
# @return [String]
|
72
|
+
def to_sparql(**options)
|
73
|
+
ops = operands.last.to_s.empty? ? operands[0..-2] : operands
|
74
|
+
"regex(" + ops.to_sparql(delimiter: ', ', **options) + ")"
|
75
|
+
end
|
68
76
|
end # Regex
|
69
77
|
end # Operator
|
70
78
|
end; end # SPARQL::Algebra
|
@@ -3,12 +3,22 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `replace` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
6
|
+
# [124] StrReplaceExpression ::= 'REPLACE' '(' Expression ',' Expression ',' Expression ( ',' Expression )? ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
11
|
+
# SELECT ?s (REPLACE(?str,"[^a-z0-9]", "-") AS ?new)
|
12
|
+
# WHERE {
|
13
|
+
# ?s :str ?str
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix ((: <http://example.org/>)
|
18
|
+
# (xsd: <http://www.w3.org/2001/XMLSchema#>))
|
19
|
+
# (project (?s ?new)
|
20
|
+
# (extend ((?new (replace ?str "[^a-z0-9]" "-")))
|
21
|
+
# (bgp (triple ?s :str ?str)))))
|
12
22
|
#
|
13
23
|
# @see https://www.w3.org/TR/sparql11-query/#funcex-replace
|
14
24
|
# @see https://www.w3.org/TR/xpath-functions/#func-replace
|
@@ -76,6 +86,16 @@ module SPARQL; module Algebra
|
|
76
86
|
def to_sxp_bin
|
77
87
|
[NAME] + operands.reject {|o| o.to_s == ""}
|
78
88
|
end
|
89
|
+
|
90
|
+
##
|
91
|
+
#
|
92
|
+
# Returns a partial SPARQL grammar for this operator.
|
93
|
+
#
|
94
|
+
# @return [String]
|
95
|
+
def to_sparql(**options)
|
96
|
+
ops = operands.last.to_s.empty? ? operands[0..-2] : operands
|
97
|
+
"REPLACE(" + ops.to_sparql(delimiter: ', ', **options) + ")"
|
98
|
+
end
|
79
99
|
end # Replace
|
80
100
|
end # Operator
|
81
101
|
end; end # SPARQL::Algebra
|
@@ -3,8 +3,28 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL Property Path `reverse` (NegatedPropertySet) operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
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)))
|
17
|
+
#
|
18
|
+
# @example SPARQL Grammar
|
19
|
+
# prefix ex: <http://www.example.org/schema#>
|
20
|
+
# prefix in: <http://www.example.org/instance#>
|
21
|
+
#
|
22
|
+
# select * where { in:c ^(ex:p1/ex:p2) ?x }
|
23
|
+
#
|
24
|
+
# @example SSE
|
25
|
+
# (prefix ((ex: <http://www.example.org/schema#>)
|
26
|
+
# (in: <http://www.example.org/instance#>))
|
27
|
+
# (path in:c (reverse (seq ex:p1 ex:p2)) ?x))
|
8
28
|
#
|
9
29
|
# @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_inverse
|
10
30
|
class Reverse < Operator::Unary
|
@@ -49,6 +69,15 @@ module SPARQL; module Algebra
|
|
49
69
|
), &block)
|
50
70
|
|
51
71
|
end
|
72
|
+
|
73
|
+
##
|
74
|
+
#
|
75
|
+
# Returns a partial SPARQL grammar for this operator.
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
def to_sparql(**options)
|
79
|
+
"^(" + operands.first.to_sparql(**options) + ')'
|
80
|
+
end
|
52
81
|
end # Reverse
|
53
82
|
end # Operator
|
54
83
|
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
|
-
#
|
9
|
-
#
|
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
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
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
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
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,17 @@ 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
|
-
|
50
|
+
|
51
|
+
##
|
52
|
+
#
|
53
|
+
# Returns a partial SPARQL grammar for this operator.
|
54
|
+
#
|
55
|
+
# @return [String]
|
56
|
+
def to_sparql(**options)
|
57
|
+
distinct = operands.first == :distinct
|
58
|
+
args = distinct ? operands[1..-1] : operands
|
59
|
+
"SAMPLE(#{'DISTINCT ' if distinct}#{args.to_sparql(**options)})"
|
60
|
+
end
|
61
|
+
end # Sample
|
38
62
|
end # Operator
|
39
63
|
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
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
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
|
@@ -22,12 +31,21 @@ module SPARQL; module Algebra
|
|
22
31
|
#
|
23
32
|
# @param [RDF::Literal] operand
|
24
33
|
# the operand
|
25
|
-
# @return [RDF::Literal]
|
34
|
+
# @return [RDF::Literal::Temporal]
|
26
35
|
# @raise [TypeError] if the operand is not a simple literal
|
27
36
|
def apply(operand, **options)
|
28
|
-
raise TypeError, "expected an RDF::Literal::
|
37
|
+
raise TypeError, "expected an RDF::Literal::Temporal, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::Temporal)
|
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
|
-
#
|
7
|
-
#
|
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
|
@@ -50,10 +59,10 @@ module SPARQL; module Algebra
|
|
50
59
|
end
|
51
60
|
|
52
61
|
left = queryable.query(q1, **options.merge(object: v, depth: options[:depth].to_i + 1))
|
53
|
-
debug(options) {"(seq)=>(left) #{left.map(&:to_h).to_sse}"}
|
62
|
+
#debug(options) {"(seq)=>(left) #{left.map(&:to_h).to_sse}"}
|
54
63
|
|
55
64
|
right = queryable.query(q2, **options.merge(subject: v, depth: options[:depth].to_i + 1))
|
56
|
-
debug(options) {"(seq)=>(right) #{right.map(&:to_h).to_sse}"}
|
65
|
+
#debug(options) {"(seq)=>(right) #{right.map(&:to_h).to_sse}"}
|
57
66
|
|
58
67
|
@solutions = RDF::Query::Solutions(left.map do |s1|
|
59
68
|
right.map do |s2|
|
@@ -63,10 +72,19 @@ module SPARQL; module Algebra
|
|
63
72
|
solution.bindings.delete(v.to_sym)
|
64
73
|
solution
|
65
74
|
end
|
66
|
-
debug(options) {"(seq)=> #{@solutions.
|
75
|
+
debug(options) {"(seq)=> #{@solutions.to_sxp}"}
|
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
|
@@ -4,18 +4,11 @@ module SPARQL; module Algebra
|
|
4
4
|
##
|
5
5
|
# The SPARQL UPDATE `sequence` operator.
|
6
6
|
#
|
7
|
-
# Sequences through each operand
|
7
|
+
# Sequences through each operand.
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
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"))
|
9
|
+
# [103] CollectionPath ::= '(' GraphNodePath+ ')'
|
10
|
+
#
|
11
|
+
# @see https://www.w3.org/TR/sparql11-query/#collections
|
19
12
|
class Sequence < Operator
|
20
13
|
include SPARQL::Algebra::Update
|
21
14
|
|
@@ -58,6 +51,16 @@ module SPARQL; module Algebra
|
|
58
51
|
@solutions.each(&block) if block_given?
|
59
52
|
@solutions
|
60
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 = "{\n" + operands.to_sparql(top_level: false, **options) + "\n}"
|
62
|
+
Operator.to_sparql(str, **options)
|
63
|
+
end
|
61
64
|
end # Sequence
|
62
65
|
end # Operator
|
63
66
|
end; end # SPARQL::Algebra
|
@@ -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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
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
|