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