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,11 +3,20 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL logical `hours` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'HOURS' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# SELECT ?s (HOURS(?date) AS ?x) WHERE {
|
11
|
+
# ?s :date ?date
|
12
|
+
# }
|
13
|
+
#
|
14
|
+
# @example SSE
|
15
|
+
# (prefix
|
16
|
+
# ((: <http://example.org/>))
|
17
|
+
# (project (?s ?x)
|
18
|
+
# (extend ((?x (hours ?date)))
|
19
|
+
# (bgp (triple ?s :date ?date)))))
|
11
20
|
#
|
12
21
|
# @see https://www.w3.org/TR/sparql11-query/#func-hours
|
13
22
|
class Hours < Operator::Unary
|
@@ -26,6 +35,15 @@ module SPARQL; module Algebra
|
|
26
35
|
raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
|
27
36
|
RDF::Literal(operand.object.hour)
|
28
37
|
end
|
38
|
+
|
39
|
+
##
|
40
|
+
#
|
41
|
+
# Returns a partial SPARQL grammar for this operator.
|
42
|
+
#
|
43
|
+
# @return [String]
|
44
|
+
def to_sparql(**options)
|
45
|
+
"HOURS(#{operands.last.to_sparql(**options)})"
|
46
|
+
end
|
29
47
|
end # Hours
|
30
48
|
end # Operator
|
31
49
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,15 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `if` function.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'IF' '(' Expression ',' Expression ',' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# BASE <http://example.org/>
|
10
|
+
# PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
|
11
|
+
# SELECT ?o (IF(lang(?o) = "ja", true, false) AS ?integer)
|
12
|
+
# WHERE { ?s ?p ?o }
|
13
|
+
#
|
14
|
+
# @example SSE
|
7
15
|
# (base <http://example.org/>
|
8
16
|
# (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>))
|
9
17
|
# (project (?o ?integer)
|
@@ -37,9 +45,18 @@ module SPARQL; module Algebra
|
|
37
45
|
operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options) == RDF::Literal::TRUE ?
|
38
46
|
operand(1).evaluate(bindings, depth: options[:depth].to_i + 1, **options) :
|
39
47
|
operand(2).evaluate(bindings, depth: options[:depth].to_i + 1, **options)
|
40
|
-
|
41
|
-
|
48
|
+
rescue
|
49
|
+
raise TypeError
|
42
50
|
end
|
43
51
|
end # If
|
44
|
-
|
52
|
+
|
53
|
+
##
|
54
|
+
#
|
55
|
+
# Returns a partial SPARQL grammar for this operator.
|
56
|
+
#
|
57
|
+
# @return [String]
|
58
|
+
def to_sparql(**options)
|
59
|
+
"IF(" + operands.to_sparql(delimiter: ', ', **options) + ")"
|
60
|
+
end
|
61
|
+
end # If
|
45
62
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,12 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL GraphPattern `in` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [114] RelationalExpression ::= NumericExpression ('IN' ExpressionList)?
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# ASK { FILTER(2 IN (1, 2, 3)) }
|
10
|
+
#
|
11
|
+
# @example SSE
|
7
12
|
# (ask (filter (in 2 1 2 3) (bgp)))
|
8
13
|
#
|
9
14
|
# @see https://www.w3.org/TR/sparql11-query/#func-in
|
@@ -54,6 +59,18 @@ module SPARQL; module Algebra
|
|
54
59
|
else RDF::Literal::FALSE
|
55
60
|
end
|
56
61
|
end
|
62
|
+
|
63
|
+
##
|
64
|
+
#
|
65
|
+
# Returns a partial SPARQL grammar for this operator.
|
66
|
+
#
|
67
|
+
# @return [String]
|
68
|
+
def to_sparql(**options)
|
69
|
+
"(" + operands.first.to_sparql(**options) +
|
70
|
+
" IN (" +
|
71
|
+
operands[1..-1].map {|e| e.to_sparql(**options)}.join(", ") +
|
72
|
+
"))"
|
73
|
+
end
|
57
74
|
end # In
|
58
75
|
end # Operator
|
59
76
|
end; end # SPARQL::Algebra
|
@@ -6,8 +6,19 @@ module SPARQL; module Algebra
|
|
6
6
|
#
|
7
7
|
# The INSERT operation is a form of the DELETE/INSERT operation having no DELETE section
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# [43] InsertClause ::= 'INSERT' QuadPattern
|
10
|
+
#
|
11
|
+
# @example SPARQL Grammar
|
12
|
+
# PREFIX : <http://example.org/>
|
13
|
+
# INSERT { ?s ?p "q" }
|
14
|
+
# WHERE { ?s ?p ?o }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix
|
18
|
+
# ((: <http://example.org/>))
|
19
|
+
# (update
|
20
|
+
# (modify (bgp (triple ?s ?p ?o))
|
21
|
+
# (insert ((triple ?s ?p "q"))))))
|
11
22
|
#
|
12
23
|
# @see https://www.w3.org/TR/sparql11-update/#insert
|
13
24
|
class Insert < Operator::Unary
|
@@ -51,6 +62,15 @@ module SPARQL; module Algebra
|
|
51
62
|
end
|
52
63
|
queryable
|
53
64
|
end
|
65
|
+
|
66
|
+
##
|
67
|
+
#
|
68
|
+
# Returns a partial SPARQL grammar for this term.
|
69
|
+
#
|
70
|
+
# @return [String]
|
71
|
+
def to_sparql(**options)
|
72
|
+
"INSERT {\n" + operands.first.to_sparql(as_statement: true, **options) + "\n}"
|
73
|
+
end
|
54
74
|
end # Insert
|
55
75
|
end # Operator
|
56
76
|
end; end # SPARQL::Algebra
|
@@ -6,8 +6,18 @@ module SPARQL; module Algebra
|
|
6
6
|
#
|
7
7
|
# The INSERT DATA operation adds some triples, given inline in the request, into the Graph Store
|
8
8
|
#
|
9
|
-
#
|
10
|
-
#
|
9
|
+
# [38] InsertData ::= 'INSERT DATA' QuadData
|
10
|
+
#
|
11
|
+
# @example SPARQL Grammar
|
12
|
+
# PREFIX : <http://example.org/ns#>
|
13
|
+
# INSERT DATA { GRAPH <http://example.org/g1> { :s :p :o } }
|
14
|
+
#
|
15
|
+
# @example SSE
|
16
|
+
# (prefix
|
17
|
+
# ((: <http://example.org/ns#>))
|
18
|
+
# (update
|
19
|
+
# (insertData (
|
20
|
+
# (graph <http://example.org/g1> ((triple :s :p :o)))))))
|
11
21
|
#
|
12
22
|
# @see https://www.w3.org/TR/sparql11-update/#insertData
|
13
23
|
class InsertData < Operator::Unary
|
@@ -36,6 +46,17 @@ module SPARQL; module Algebra
|
|
36
46
|
end
|
37
47
|
queryable
|
38
48
|
end
|
49
|
+
|
50
|
+
##
|
51
|
+
#
|
52
|
+
# Returns a partial SPARQL grammar for this term.
|
53
|
+
#
|
54
|
+
# @return [String]
|
55
|
+
def to_sparql(**options)
|
56
|
+
"INSERT DATA {\n" +
|
57
|
+
operands.first.to_sparql(as_statement: true, top_level: false, delimiter: "\n", **options) +
|
58
|
+
"\n}"
|
59
|
+
end
|
39
60
|
end # InsertData
|
40
61
|
end # Operator
|
41
62
|
end; end # SPARQL::Algebra
|
@@ -3,10 +3,18 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `iri` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'IRI' '(' Expression ')' | 'URI' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# BASE <http://example.org/>
|
10
|
+
# SELECT (URI("uri") AS ?uri) (IRI("iri") AS ?iri)
|
11
|
+
# WHERE {}
|
12
|
+
#
|
13
|
+
# @example SSE
|
14
|
+
# (base <http://example.org/>
|
15
|
+
# (project (?uri ?iri)
|
16
|
+
# (extend ((?uri (iri "uri")) (?iri (iri "iri")))
|
17
|
+
# (bgp))))
|
10
18
|
#
|
11
19
|
# @see https://www.w3.org/TR/sparql11-query/#func-iri
|
12
20
|
class IRI < Operator::Unary
|
@@ -35,6 +43,15 @@ module SPARQL; module Algebra
|
|
35
43
|
base.join(literal.to_s)
|
36
44
|
end
|
37
45
|
|
46
|
+
##
|
47
|
+
#
|
48
|
+
# Returns a partial SPARQL grammar for this operator.
|
49
|
+
#
|
50
|
+
# @return [String]
|
51
|
+
def to_sparql(**options)
|
52
|
+
"IRI(" + operands.last.to_sparql(**options) + ")"
|
53
|
+
end
|
54
|
+
|
38
55
|
Operator::URI = IRI
|
39
56
|
end # IRI
|
40
57
|
end # Operator
|
@@ -3,7 +3,16 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `isBlank` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'isBlank' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/things#>
|
10
|
+
# SELECT ?x ?v WHERE {
|
11
|
+
# ?x :p ?v .
|
12
|
+
# FILTER isBlank(?v) .
|
13
|
+
# }
|
14
|
+
#
|
15
|
+
# @example SSE
|
7
16
|
# (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
|
8
17
|
# (: <http://example.org/things#>))
|
9
18
|
# (project (?x ?v)
|
@@ -30,6 +39,15 @@ module SPARQL; module Algebra
|
|
30
39
|
else raise TypeError, "expected an RDF::Term, but got #{term.inspect}"
|
31
40
|
end
|
32
41
|
end
|
42
|
+
|
43
|
+
##
|
44
|
+
#
|
45
|
+
# Returns a partial SPARQL grammar for this operator.
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
def to_sparql(**options)
|
49
|
+
"isBlank(" + operands.first.to_sparql(**options) + ")"
|
50
|
+
end
|
33
51
|
end # IsBlank
|
34
52
|
end # Operator
|
35
53
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,16 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `isIRI`/`isURI` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'isIRI' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/things#>
|
10
|
+
# SELECT ?x ?v WHERE {
|
11
|
+
# ?x :p ?v .
|
12
|
+
# FILTER isIRI(?v) .
|
13
|
+
# }
|
14
|
+
#
|
15
|
+
# @example SSE
|
7
16
|
# (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
|
8
17
|
# (: <http://example.org/things#>))
|
9
18
|
# (project (?x ?v)
|
@@ -32,6 +41,15 @@ module SPARQL; module Algebra
|
|
32
41
|
end
|
33
42
|
|
34
43
|
Operator::IsURI = IsIRI
|
44
|
+
|
45
|
+
##
|
46
|
+
#
|
47
|
+
# Returns a partial SPARQL grammar for this operator.
|
48
|
+
#
|
49
|
+
# @return [String]
|
50
|
+
def to_sparql(**options)
|
51
|
+
"isIRI(" + operands.first.to_sparql(**options) + ")"
|
52
|
+
end
|
35
53
|
end # IsIRI
|
36
54
|
end # Operator
|
37
55
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,16 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `isLiteral` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'isLiteral' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/things#>
|
10
|
+
# SELECT ?x ?v WHERE {
|
11
|
+
# ?x :p ?v .
|
12
|
+
# FILTER isLiteral(?v) .
|
13
|
+
# }
|
14
|
+
#
|
15
|
+
# @example SSE
|
7
16
|
# (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
|
8
17
|
# (: <http://example.org/things#>))
|
9
18
|
# (project (?x ?v)
|
@@ -31,6 +40,15 @@ module SPARQL; module Algebra
|
|
31
40
|
else raise TypeError, "expected an RDF::Term, but got #{term.inspect}"
|
32
41
|
end
|
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
|
+
"isLiteral(" + operands.first.to_sparql(**options) + ")"
|
51
|
+
end
|
34
52
|
end # IsLiteral
|
35
53
|
end # Operator
|
36
54
|
end; end # SPARQL::Algebra
|
@@ -3,9 +3,18 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `isNumeric` operator.
|
5
5
|
#
|
6
|
-
# Note numeric denotes typed literals with datatypes xsd:integer
|
6
|
+
# Note numeric denotes typed literals with datatypes `xsd:integer`, `xsd:decimal`, `xsd:float`, and `xsd:double`, not derived types.
|
7
7
|
#
|
8
|
-
#
|
8
|
+
# [121] BuiltInCall ::= ... | 'isNumeric' '(' Expression ')'
|
9
|
+
#
|
10
|
+
# @example SPARQL Grammar
|
11
|
+
# PREFIX : <http://example.org/things#>
|
12
|
+
# SELECT ?x ?v WHERE {
|
13
|
+
# ?x :p ?v .
|
14
|
+
# FILTER isNumeric(?v) .
|
15
|
+
# }
|
16
|
+
#
|
17
|
+
# @example SSE
|
9
18
|
# (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
|
10
19
|
# (: <http://example.org/things#>))
|
11
20
|
# (project (?x ?v)
|
@@ -16,7 +25,7 @@ module SPARQL; module Algebra
|
|
16
25
|
class IsNumeric < Operator::Unary
|
17
26
|
include Evaluatable
|
18
27
|
|
19
|
-
NAME = :
|
28
|
+
NAME = :isNumeric
|
20
29
|
|
21
30
|
##
|
22
31
|
# Returns `true` if the operand is an `RDF::Literal::Numeric`, `false`
|
@@ -36,6 +45,15 @@ module SPARQL; module Algebra
|
|
36
45
|
else raise TypeError, "expected an RDF::Term, but got #{term.inspect}"
|
37
46
|
end
|
38
47
|
end
|
48
|
+
|
49
|
+
##
|
50
|
+
#
|
51
|
+
# Returns a partial SPARQL grammar for this operator.
|
52
|
+
#
|
53
|
+
# @return [String]
|
54
|
+
def to_sparql(**options)
|
55
|
+
"isNumeric(" + operands.first.to_sparql(**options) + ")"
|
56
|
+
end
|
39
57
|
end # IsNumeric
|
40
58
|
end # Operator
|
41
59
|
end; end # SPARQL::Algebra
|
@@ -5,6 +5,29 @@ module SPARQL; module Algebra
|
|
5
5
|
#
|
6
6
|
# Returns true if term is an RDF-star triple. Returns false otherwise.
|
7
7
|
#
|
8
|
+
# [121] BuiltInCall ::= ... | 'isTreiple' '(' Expression ')'
|
9
|
+
#
|
10
|
+
# @example SPARQL Grammar
|
11
|
+
# PREFIX : <http://example.com/ns#>
|
12
|
+
# SELECT * {
|
13
|
+
# ?t :source :g
|
14
|
+
# FILTER(isTriple(?t))
|
15
|
+
# FILTER(SUBJECT(?t) = :s)
|
16
|
+
# FILTER(PREDICATE(?t) = :p)
|
17
|
+
# FILTER(OBJECT(?t) = :o)
|
18
|
+
# }
|
19
|
+
#
|
20
|
+
# @example SSE
|
21
|
+
# (prefix
|
22
|
+
# ((: <http://example.com/ns#>))
|
23
|
+
# (filter
|
24
|
+
# (exprlist
|
25
|
+
# (isTRIPLE ?t)
|
26
|
+
# (= (subject ?t) :s)
|
27
|
+
# (= (predicate ?t) :p)
|
28
|
+
# (= (object ?t) :o))
|
29
|
+
# (bgp (triple ?t :source :g))) )
|
30
|
+
#
|
8
31
|
# @see https://w3c.github.io/rdf-star/rdf-star-cg-spec.html#istriple
|
9
32
|
class IsTriple < Operator::Unary
|
10
33
|
include Evaluatable
|
@@ -25,6 +48,15 @@ module SPARQL; module Algebra
|
|
25
48
|
else raise TypeError, "expected an RDF::Term, but got #{term.inspect}"
|
26
49
|
end
|
27
50
|
end
|
51
|
+
|
52
|
+
##
|
53
|
+
#
|
54
|
+
# Returns a partial SPARQL grammar for this operator.
|
55
|
+
#
|
56
|
+
# @return [String]
|
57
|
+
def to_sparql(**options)
|
58
|
+
"isTRIPLE(" + operands.first.to_sparql(**options) + ")"
|
59
|
+
end
|
28
60
|
end # IsTriple
|
29
61
|
end # Operator
|
30
62
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,16 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL GraphPattern `join` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [54] GroupGraphPatternSub ::= TriplesBlock? (GraphPatternNotTriples "."? TriplesBlock? )*
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example/>
|
10
|
+
# SELECT * {
|
11
|
+
# ?s ?p ?o
|
12
|
+
# GRAPH ?g { ?s ?q ?v }
|
13
|
+
# }
|
14
|
+
#
|
15
|
+
# @example SSE
|
7
16
|
# (prefix ((: <http://example/>))
|
8
17
|
# (join
|
9
18
|
# (bgp (triple ?s ?p ?o))
|
@@ -82,6 +91,18 @@ module SPARQL; module Algebra
|
|
82
91
|
@operands = ops
|
83
92
|
self
|
84
93
|
end
|
94
|
+
|
95
|
+
##
|
96
|
+
#
|
97
|
+
# Returns a partial SPARQL grammar for this operator.
|
98
|
+
#
|
99
|
+
# @param [Boolean] top_level (true)
|
100
|
+
# Treat this as a top-level, generating SELECT ... WHERE {}
|
101
|
+
# @return [String]
|
102
|
+
def to_sparql(top_level: true, **options)
|
103
|
+
str = operands.to_sparql(top_level: false, delimiter: "\n", **options)
|
104
|
+
top_level ? Operator.to_sparql(str, **options) : str
|
105
|
+
end
|
85
106
|
end # Join
|
86
107
|
end # Operator
|
87
108
|
end; end # SPARQL::Algebra
|
@@ -3,6 +3,22 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `lang` operator.
|
5
5
|
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'LANG' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example/>
|
10
|
+
#
|
11
|
+
# SELECT ?x
|
12
|
+
# { ?x :p ?v .
|
13
|
+
# FILTER ( lang(?v) != '@NotALangTag@' )
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
# @example SSE
|
17
|
+
# (prefix ((: <http://example/>))
|
18
|
+
# (project (?x)
|
19
|
+
# (filter (!= (lang ?v) "@NotALangTag@")
|
20
|
+
# (bgp (triple ?x :p ?v)))))
|
21
|
+
#
|
6
22
|
# @see https://www.w3.org/TR/sparql11-query/#func-lang
|
7
23
|
class Lang < Operator::Unary
|
8
24
|
include Evaluatable
|
@@ -24,6 +40,15 @@ module SPARQL; module Algebra
|
|
24
40
|
else raise TypeError, "expected an RDF::Literal, but got #{literal.inspect}"
|
25
41
|
end
|
26
42
|
end
|
43
|
+
|
44
|
+
##
|
45
|
+
#
|
46
|
+
# Returns a partial SPARQL grammar for this operator.
|
47
|
+
#
|
48
|
+
# @return [String]
|
49
|
+
def to_sparql(**options)
|
50
|
+
"lang(" + operands.first.to_sparql(**options) + ")"
|
51
|
+
end
|
27
52
|
end # Lang
|
28
53
|
end # Operator
|
29
54
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,15 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL `langMatches` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'LANGMATCHES' '(' Expression ',' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/#>
|
10
|
+
#
|
11
|
+
# SELECT *
|
12
|
+
# { :x ?p ?v . FILTER langMatches(lang(?v), "en-GB") . }
|
13
|
+
#
|
14
|
+
# @example SSE
|
7
15
|
# (prefix ((: <http://example.org/#>))
|
8
16
|
# (filter (langMatches (lang ?v) "en-GB")
|
9
17
|
# (bgp (triple :x ?p ?v))))
|
@@ -48,6 +56,19 @@ module SPARQL; module Algebra
|
|
48
56
|
RDF::Literal(language_tag.start_with?(language_range + '-'))
|
49
57
|
end
|
50
58
|
end
|
59
|
+
|
60
|
+
##
|
61
|
+
#
|
62
|
+
# Returns a partial SPARQL grammar for this operator.
|
63
|
+
#
|
64
|
+
# @return [String]
|
65
|
+
def to_sparql(**options)
|
66
|
+
"langMatches(" +
|
67
|
+
operands.first.to_sparql(**options) +
|
68
|
+
", " +
|
69
|
+
operands.last.to_sparql(**options) +
|
70
|
+
")"
|
71
|
+
end
|
51
72
|
end # LangMatches
|
52
73
|
end # Operator
|
53
74
|
end; end # SPARQL::Algebra
|
@@ -3,8 +3,20 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL logical `lcase` operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# [121] BuiltInCall ::= ... | 'LCASE' '(' Expression ')'
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example.org/>
|
10
|
+
# SELECT ?s (LCASE(?str) AS ?lstr) WHERE {
|
11
|
+
# ?s :str ?str
|
12
|
+
# }
|
13
|
+
#
|
14
|
+
# @example SSE
|
15
|
+
# (prefix
|
16
|
+
# ((: <http://example.org/>))
|
17
|
+
# (project (?str ?lstr)
|
18
|
+
# (extend ((?lstr (lcase ?str)))
|
19
|
+
# (bgp (triple ?s :str ?str)))))
|
8
20
|
#
|
9
21
|
# @see https://www.w3.org/TR/sparql11-query/#func-lcase
|
10
22
|
# @see https://www.w3.org/TR/xpath-functions/#func-lcase
|
@@ -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
|
+
"LCASE(" + operands.last.to_sparql(**options) + ")"
|
49
|
+
end
|
29
50
|
end # LCase
|
30
51
|
end # Operator
|
31
52
|
end; end # SPARQL::Algebra
|
@@ -3,7 +3,19 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL GraphPattern `leftjoin` operator.
|
5
5
|
#
|
6
|
-
#
|
6
|
+
# [57] OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern
|
7
|
+
#
|
8
|
+
# @example SPARQL Grammar
|
9
|
+
# PREFIX : <http://example/>
|
10
|
+
# SELECT * {
|
11
|
+
# ?x :p ?v .
|
12
|
+
# OPTIONAL {
|
13
|
+
# ?y :q ?w .
|
14
|
+
# FILTER(?v=2)
|
15
|
+
# }
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
# @example SSE
|
7
19
|
# (prefix ((: <http://example/>))
|
8
20
|
# (leftjoin
|
9
21
|
# (bgp (triple ?x :p ?v))
|
@@ -112,6 +124,22 @@ module SPARQL; module Algebra
|
|
112
124
|
expr ? LeftJoin.new(ops[0], ops[1], expr) : LeftJoin.new(ops[0], ops[1])
|
113
125
|
end
|
114
126
|
end
|
127
|
+
|
128
|
+
##
|
129
|
+
#
|
130
|
+
# Returns a partial SPARQL grammar for this operator.
|
131
|
+
#
|
132
|
+
# @param [Boolean] top_level (true)
|
133
|
+
# Treat this as a top-level, generating SELECT ... WHERE {}
|
134
|
+
# @return [String]
|
135
|
+
def to_sparql(top_level: true, **options)
|
136
|
+
str = operands[0].to_sparql(top_level: false, **options) +
|
137
|
+
"\nOPTIONAL { \n" +
|
138
|
+
operands[1].to_sparql(top_level: false, **options) + "\n"
|
139
|
+
str << 'FILTER (' + operands[2].to_sparql(**options) + ") \n" if operands[2]
|
140
|
+
str << '}'
|
141
|
+
top_level ? Operator.to_sparql(str, **options) : str
|
142
|
+
end
|
115
143
|
end # LeftJoin
|
116
144
|
end # Operator
|
117
145
|
end; end # SPARQL::Algebra
|
@@ -3,8 +3,18 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL relational `<` (less than) comparison operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
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 # LessThan
|
@@ -3,8 +3,18 @@ module SPARQL; module Algebra
|
|
3
3
|
##
|
4
4
|
# The SPARQL relational `<=` (less than or equal) comparison operator.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
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
|