sparql 3.1.6 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -22
- data/VERSION +1 -1
- data/bin/sparql +14 -4
- data/lib/sparql/algebra/aggregate.rb +1 -1
- data/lib/sparql/algebra/evaluatable.rb +4 -4
- data/lib/sparql/algebra/expression.rb +28 -3
- data/lib/sparql/algebra/extensions.rb +109 -45
- data/lib/sparql/algebra/operator/abs.rb +23 -3
- 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 +20 -2
- 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 +34 -11
- data/lib/sparql/algebra/operator/bound.rb +22 -1
- data/lib/sparql/algebra/operator/ceil.rb +26 -3
- 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 +48 -40
- 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 +25 -3
- data/lib/sparql/algebra/operator/copy.rb +19 -2
- data/lib/sparql/algebra/operator/count.rb +53 -7
- data/lib/sparql/algebra/operator/create.rb +20 -2
- data/lib/sparql/algebra/operator/dataset.rb +27 -2
- data/lib/sparql/algebra/operator/datatype.rb +26 -7
- data/lib/sparql/algebra/operator/day.rb +24 -6
- 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 +27 -3
- data/lib/sparql/algebra/operator/drop.rb +27 -3
- data/lib/sparql/algebra/operator/encode_for_uri.rb +23 -3
- data/lib/sparql/algebra/operator/equal.rb +13 -3
- 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 +64 -6
- data/lib/sparql/algebra/operator/filter.rb +27 -5
- data/lib/sparql/algebra/operator/floor.rb +26 -3
- 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 +14 -4
- data/lib/sparql/algebra/operator/greater_than_or_equal.rb +14 -4
- data/lib/sparql/algebra/operator/group.rb +105 -8
- data/lib/sparql/algebra/operator/group_concat.rb +44 -8
- data/lib/sparql/algebra/operator/hours.rb +24 -6
- 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 +22 -5
- data/lib/sparql/algebra/operator/is_blank.rb +21 -4
- data/lib/sparql/algebra/operator/is_iri.rb +21 -4
- data/lib/sparql/algebra/operator/is_literal.rb +21 -4
- data/lib/sparql/algebra/operator/is_numeric.rb +23 -6
- data/lib/sparql/algebra/operator/is_triple.rb +33 -1
- data/lib/sparql/algebra/operator/join.rb +56 -1
- data/lib/sparql/algebra/operator/lang.rb +26 -1
- data/lib/sparql/algebra/operator/lang_matches.rb +23 -2
- data/lib/sparql/algebra/operator/lcase.rb +23 -3
- data/lib/sparql/algebra/operator/left_join.rb +42 -1
- data/lib/sparql/algebra/operator/less_than.rb +14 -4
- data/lib/sparql/algebra/operator/less_than_or_equal.rb +14 -4
- data/lib/sparql/algebra/operator/load.rb +25 -2
- data/lib/sparql/algebra/operator/max.rb +20 -2
- data/lib/sparql/algebra/operator/md5.rb +23 -6
- data/lib/sparql/algebra/operator/min.rb +22 -4
- data/lib/sparql/algebra/operator/minus.rb +65 -7
- data/lib/sparql/algebra/operator/minutes.rb +24 -6
- data/lib/sparql/algebra/operator/modify.rb +41 -5
- data/lib/sparql/algebra/operator/month.rb +24 -6
- data/lib/sparql/algebra/operator/move.rb +20 -2
- data/lib/sparql/algebra/operator/multiply.rb +27 -4
- data/lib/sparql/algebra/operator/negate.rb +24 -4
- data/lib/sparql/algebra/operator/not.rb +25 -4
- data/lib/sparql/algebra/operator/not_equal.rb +16 -1
- 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 +25 -6
- data/lib/sparql/algebra/operator/object.rb +33 -1
- data/lib/sparql/algebra/operator/or.rb +26 -3
- data/lib/sparql/algebra/operator/order.rb +71 -2
- 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 +43 -4
- data/lib/sparql/algebra/operator/predicate.rb +33 -1
- data/lib/sparql/algebra/operator/prefix.rb +24 -3
- data/lib/sparql/algebra/operator/project.rb +69 -5
- data/lib/sparql/algebra/operator/rand.rb +31 -3
- data/lib/sparql/algebra/operator/reduced.rb +20 -3
- data/lib/sparql/algebra/operator/regex.rb +27 -19
- data/lib/sparql/algebra/operator/replace.rb +27 -7
- data/lib/sparql/algebra/operator/reverse.rb +31 -2
- data/lib/sparql/algebra/operator/round.rb +26 -3
- data/lib/sparql/algebra/operator/same_term.rb +25 -7
- data/lib/sparql/algebra/operator/sample.rb +33 -9
- data/lib/sparql/algebra/operator/seconds.rb +24 -6
- data/lib/sparql/algebra/operator/seq.rb +20 -2
- data/lib/sparql/algebra/operator/sequence.rb +4 -11
- data/lib/sparql/algebra/operator/sha1.rb +19 -2
- data/lib/sparql/algebra/operator/sha256.rb +19 -2
- data/lib/sparql/algebra/operator/sha384.rb +19 -2
- data/lib/sparql/algebra/operator/sha512.rb +19 -2
- data/lib/sparql/algebra/operator/slice.rb +27 -5
- data/lib/sparql/algebra/operator/str.rb +22 -2
- data/lib/sparql/algebra/operator/strafter.rb +26 -3
- data/lib/sparql/algebra/operator/strbefore.rb +26 -3
- data/lib/sparql/algebra/operator/strdt.rb +23 -2
- data/lib/sparql/algebra/operator/strends.rb +26 -4
- data/lib/sparql/algebra/operator/strlang.rb +25 -7
- data/lib/sparql/algebra/operator/strlen.rb +24 -3
- data/lib/sparql/algebra/operator/strstarts.rb +26 -3
- data/lib/sparql/algebra/operator/struuid.rb +30 -10
- data/lib/sparql/algebra/operator/subject.rb +33 -1
- data/lib/sparql/algebra/operator/substr.rb +24 -3
- data/lib/sparql/algebra/operator/subtract.rb +29 -3
- data/lib/sparql/algebra/operator/sum.rb +25 -7
- data/lib/sparql/algebra/operator/table.rb +76 -4
- data/lib/sparql/algebra/operator/timezone.rb +24 -6
- data/lib/sparql/algebra/operator/tz.rb +23 -6
- data/lib/sparql/algebra/operator/ucase.rb +24 -3
- 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 +28 -9
- data/lib/sparql/algebra/operator/with.rb +38 -4
- data/lib/sparql/algebra/operator/year.rb +24 -6
- data/lib/sparql/algebra/operator.rb +135 -14
- data/lib/sparql/algebra/sxp_extensions.rb +3 -3
- data/lib/sparql/algebra.rb +20 -3
- data/lib/sparql/grammar/meta.rb +1103 -907
- data/lib/sparql/grammar/parser11.rb +63 -56
- metadata +43 -29
- data/lib/sparql/algebra/operator/triple.rb +0 -27
@@ -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
|
@@ -31,9 +44,20 @@ module SPARQL; module Algebra
|
|
31
44
|
# enum of evaluated operand
|
32
45
|
# @return [RDF::Term] An arbitrary term
|
33
46
|
# @raise [TypeError] If enum is empty
|
34
|
-
def apply(enum)
|
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
|
@@ -24,10 +33,19 @@ module SPARQL; module Algebra
|
|
24
33
|
# the operand
|
25
34
|
# @return [RDF::Literal]
|
26
35
|
# @raise [TypeError] if the operand is not a simple literal
|
27
|
-
def apply(operand)
|
36
|
+
def apply(operand, **options)
|
28
37
|
raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
|
29
38
|
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
|
@@ -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
|
@@ -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
|
|
@@ -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)))
|
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
|
|
26
34
|
# the operand
|
27
35
|
# @return [RDF::Literal]
|
28
36
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
37
|
+
def apply(operand, **options)
|
30
38
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
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)))
|
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
|
|
26
34
|
# the operand
|
27
35
|
# @return [RDF::Literal]
|
28
36
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
37
|
+
def apply(operand, **options)
|
30
38
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
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)))
|
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
|
|
26
34
|
# the operand
|
27
35
|
# @return [RDF::Literal]
|
28
36
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
37
|
+
def apply(operand, **options)
|
30
38
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
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)))
|
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
|
|
26
34
|
# the operand
|
27
35
|
# @return [RDF::Literal]
|
28
36
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
37
|
+
def apply(operand, **options)
|
30
38
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
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
|
@@ -3,7 +3,18 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `str` operator.
|
5
5
|
#
|
6
|
-
#
|
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)
|
@@ -23,13 +34,22 @@ module SPARQL; module Algebra
|
|
23
34
|
# a literal or IRI
|
24
35
|
# @return [RDF::Literal] a simple literal
|
25
36
|
# @raise [TypeError] if the operand is not a literal or IRI
|
26
|
-
def apply(term)
|
37
|
+
def apply(term, **options)
|
27
38
|
case term
|
28
39
|
when RDF::Literal then RDF::Literal(term.value)
|
29
40
|
when RDF::URI then RDF::Literal(term.to_s)
|
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
|
-
#
|
7
|
-
#
|
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
|
@@ -37,7 +51,7 @@ module SPARQL; module Algebra
|
|
37
51
|
# a literal
|
38
52
|
# @return [RDF::Literal]
|
39
53
|
# @raise [TypeError] if operands are not compatible
|
40
|
-
def apply(left, right)
|
54
|
+
def apply(left, right, **options)
|
41
55
|
case
|
42
56
|
when !left.compatible?(right)
|
43
57
|
raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
|
@@ -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
|
-
#
|
7
|
-
#
|
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
|
@@ -37,7 +51,7 @@ module SPARQL; module Algebra
|
|
37
51
|
# a literal
|
38
52
|
# @return [RDF::Literal]
|
39
53
|
# @raise [TypeError] if operands are not compatible
|
40
|
-
def apply(left, right)
|
54
|
+
def apply(left, right, **options)
|
41
55
|
case
|
42
56
|
when !left.plain? || !right.plain?
|
43
57
|
raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
|
@@ -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
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'STRDT' '(' Expression ',' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
11
|
+
# SELECT ?s (STRDT(?str,xsd:string) AS ?str1) WHERE {
|
12
|
+
# ?s :str ?str
|
13
|
+
# FILTER(LANGMATCHES(LANG(?str), "en"))
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix
|
18
|
+
# ((: <http://example.org/>) (xsd: <http://www.w3.org/2001/XMLSchema#>))
|
7
19
|
# (project (?s ?str1)
|
8
20
|
# (extend ((?str1 (strdt ?str xsd:string)))
|
9
21
|
# (filter (langMatches (lang ?str) "en")
|
@@ -24,10 +36,19 @@ module SPARQL; module Algebra
|
|
24
36
|
# datatype
|
25
37
|
# @return [RDF::Literal] a datatyped literal
|
26
38
|
# @see https://www.w3.org/TR/sparql11-query/#func-strdt
|
27
|
-
def apply(value, datatypeIRI)
|
39
|
+
def apply(value, datatypeIRI, **options)
|
28
40
|
raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
|
29
41
|
RDF::Literal.new(value.to_s, datatype: datatypeIRI)
|
30
42
|
end
|
43
|
+
|
44
|
+
##
|
45
|
+
#
|
46
|
+
# Returns a partial SPARQL grammar for this operator.
|
47
|
+
#
|
48
|
+
# @return [String]
|
49
|
+
def to_sparql(**options)
|
50
|
+
"STRDT(" + operands.to_sparql(delimiter: ', ', **options) + ")"
|
51
|
+
end
|
31
52
|
end # StrDT
|
32
53
|
end # Operator
|
33
54
|
end; end # SPARQL::Algebra
|
@@ -1,10 +1,23 @@
|
|
1
1
|
module SPARQL; module Algebra
|
2
2
|
class Operator
|
3
3
|
##
|
4
|
-
# A SPARQL `
|
4
|
+
# A SPARQL `strends` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'STRENDS' '(' Expression ',' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# SELECT ?s ?str WHERE {
|
11
|
+
# ?s :str ?str
|
12
|
+
# FILTER STRENDS(?str, "a")
|
13
|
+
# }
|
14
|
+
#
|
15
|
+
# @example SSE
|
16
|
+
# (prefix
|
17
|
+
# ((: <http://example.org/>))
|
18
|
+
# (project (?s ?str)
|
19
|
+
# (filter (strends ?str "a")
|
20
|
+
# (bgp (triple ?s :str ?str)))))
|
8
21
|
#
|
9
22
|
# @see https://www.w3.org/TR/sparql11-query/#func-strends
|
10
23
|
# @see https://wwww.w3.org/TR/xpath-functions/#func-ends-with
|
@@ -33,7 +46,7 @@ module SPARQL; module Algebra
|
|
33
46
|
# a literal
|
34
47
|
# @return [RDF::Literal::Boolean]
|
35
48
|
# @raise [TypeError] if operands are not compatible
|
36
|
-
def apply(left, right)
|
49
|
+
def apply(left, right, **options)
|
37
50
|
case
|
38
51
|
when !left.compatible?(right)
|
39
52
|
raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
|
@@ -41,6 +54,15 @@ module SPARQL; module Algebra
|
|
41
54
|
else RDF::Literal::FALSE
|
42
55
|
end
|
43
56
|
end
|
57
|
+
|
58
|
+
##
|
59
|
+
#
|
60
|
+
# Returns a partial SPARQL grammar for this operator.
|
61
|
+
#
|
62
|
+
# @return [String]
|
63
|
+
def to_sparql(**options)
|
64
|
+
"STRENDS(" + operands.to_sparql(delimiter: ', ', **options) + ")"
|
65
|
+
end
|
44
66
|
end # StrEnds
|
45
67
|
end # Operator
|
46
68
|
end; end # SPARQL::Algebra
|
@@ -3,12 +3,21 @@ 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 ((: <http://example.org/>))
|
17
|
+
# (project (?s ?s2)
|
18
|
+
# (extend ((?s2 (strlang ?str "en-US")))
|
19
|
+
# (filter (langMatches (lang ?str) "en")
|
20
|
+
# (bgp (triple ?s :str ?str))))))
|
12
21
|
#
|
13
22
|
# @see https://www.w3.org/TR/sparql11-query/#func-strlang
|
14
23
|
class StrLang < Operator::Binary
|
@@ -25,10 +34,19 @@ module SPARQL; module Algebra
|
|
25
34
|
# datatype
|
26
35
|
# @return [RDF::Literal] a datatyped literal
|
27
36
|
# @see https://www.w3.org/TR/sparql11-query/#func-strlang
|
28
|
-
def apply(value, langTag)
|
37
|
+
def apply(value, langTag, **options)
|
29
38
|
raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
|
30
39
|
RDF::Literal.new(value.to_s, language: langTag.to_s)
|
31
40
|
end
|
41
|
+
|
42
|
+
##
|
43
|
+
#
|
44
|
+
# Returns a partial SPARQL grammar for this operator.
|
45
|
+
#
|
46
|
+
# @return [String]
|
47
|
+
def to_sparql(**options)
|
48
|
+
"STRLANG(" + operands.to_sparql(delimiter: ', ', **options) + ")"
|
49
|
+
end
|
32
50
|
end # StrLang
|
33
51
|
end # Operator
|
34
52
|
end; end # SPARQL::Algebra
|