sparql 3.1.2 → 3.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -12
- data/VERSION +1 -1
- data/bin/sparql +20 -11
- data/lib/sinatra/sparql.rb +1 -1
- data/lib/sparql.rb +5 -6
- data/lib/sparql/algebra.rb +4 -4
- data/lib/sparql/algebra/aggregate.rb +1 -1
- data/lib/sparql/algebra/evaluatable.rb +4 -4
- data/lib/sparql/algebra/expression.rb +46 -31
- data/lib/sparql/algebra/extensions.rb +52 -25
- data/lib/sparql/algebra/operator.rb +22 -17
- data/lib/sparql/algebra/operator/abs.rb +1 -1
- data/lib/sparql/algebra/operator/avg.rb +8 -1
- data/lib/sparql/algebra/operator/bgp.rb +1 -1
- data/lib/sparql/algebra/operator/bnode.rb +1 -1
- data/lib/sparql/algebra/operator/ceil.rb +1 -1
- data/lib/sparql/algebra/operator/compare.rb +39 -33
- data/lib/sparql/algebra/operator/construct.rb +2 -1
- data/lib/sparql/algebra/operator/contains.rb +1 -1
- data/lib/sparql/algebra/operator/count.rb +1 -1
- data/lib/sparql/algebra/operator/dataset.rb +1 -1
- data/lib/sparql/algebra/operator/datatype.rb +1 -1
- data/lib/sparql/algebra/operator/day.rb +1 -1
- data/lib/sparql/algebra/operator/delete.rb +2 -2
- data/lib/sparql/algebra/operator/delete_where.rb +1 -1
- data/lib/sparql/algebra/operator/divide.rb +1 -1
- data/lib/sparql/algebra/operator/encode_for_uri.rb +1 -1
- data/lib/sparql/algebra/operator/equal.rb +1 -1
- data/lib/sparql/algebra/operator/extend.rb +2 -12
- data/lib/sparql/algebra/operator/floor.rb +1 -1
- data/lib/sparql/algebra/operator/graph.rb +1 -1
- data/lib/sparql/algebra/operator/greater_than.rb +3 -2
- data/lib/sparql/algebra/operator/greater_than_or_equal.rb +2 -2
- data/lib/sparql/algebra/operator/group_concat.rb +1 -1
- data/lib/sparql/algebra/operator/hours.rb +1 -1
- data/lib/sparql/algebra/operator/insert.rb +1 -1
- data/lib/sparql/algebra/operator/iri.rb +1 -1
- data/lib/sparql/algebra/operator/is_blank.rb +1 -1
- data/lib/sparql/algebra/operator/is_iri.rb +1 -1
- data/lib/sparql/algebra/operator/is_literal.rb +1 -1
- data/lib/sparql/algebra/operator/is_numeric.rb +1 -1
- data/lib/sparql/algebra/operator/is_triple.rb +30 -0
- data/lib/sparql/algebra/operator/lang.rb +1 -1
- data/lib/sparql/algebra/operator/lang_matches.rb +1 -1
- data/lib/sparql/algebra/operator/lcase.rb +1 -1
- data/lib/sparql/algebra/operator/left_join.rb +4 -0
- data/lib/sparql/algebra/operator/less_than.rb +3 -2
- data/lib/sparql/algebra/operator/less_than_or_equal.rb +2 -2
- data/lib/sparql/algebra/operator/max.rb +8 -1
- data/lib/sparql/algebra/operator/md5.rb +1 -1
- data/lib/sparql/algebra/operator/min.rb +8 -1
- data/lib/sparql/algebra/operator/minutes.rb +1 -1
- data/lib/sparql/algebra/operator/month.rb +1 -1
- data/lib/sparql/algebra/operator/multiply.rb +1 -1
- data/lib/sparql/algebra/operator/negate.rb +1 -1
- data/lib/sparql/algebra/operator/not.rb +1 -1
- data/lib/sparql/algebra/operator/not_equal.rb +3 -1
- data/lib/sparql/algebra/operator/now.rb +1 -1
- data/lib/sparql/algebra/operator/object.rb +27 -0
- data/lib/sparql/algebra/operator/order.rb +7 -1
- data/lib/sparql/algebra/operator/plus.rb +1 -1
- data/lib/sparql/algebra/operator/predicate.rb +27 -0
- data/lib/sparql/algebra/operator/rand.rb +1 -1
- data/lib/sparql/algebra/operator/regex.rb +1 -1
- data/lib/sparql/algebra/operator/replace.rb +1 -1
- data/lib/sparql/algebra/operator/round.rb +1 -1
- data/lib/sparql/algebra/operator/same_term.rb +1 -1
- data/lib/sparql/algebra/operator/sample.rb +9 -2
- data/lib/sparql/algebra/operator/seconds.rb +1 -1
- data/lib/sparql/algebra/operator/sha1.rb +1 -1
- data/lib/sparql/algebra/operator/sha256.rb +1 -1
- data/lib/sparql/algebra/operator/sha384.rb +1 -1
- data/lib/sparql/algebra/operator/sha512.rb +1 -1
- data/lib/sparql/algebra/operator/str.rb +1 -1
- data/lib/sparql/algebra/operator/strafter.rb +1 -1
- data/lib/sparql/algebra/operator/strbefore.rb +1 -1
- data/lib/sparql/algebra/operator/strdt.rb +1 -1
- data/lib/sparql/algebra/operator/strends.rb +1 -1
- data/lib/sparql/algebra/operator/strlang.rb +1 -1
- data/lib/sparql/algebra/operator/strlen.rb +1 -1
- data/lib/sparql/algebra/operator/strstarts.rb +1 -1
- data/lib/sparql/algebra/operator/struuid.rb +1 -1
- data/lib/sparql/algebra/operator/subject.rb +29 -0
- data/lib/sparql/algebra/operator/substr.rb +1 -1
- data/lib/sparql/algebra/operator/subtract.rb +1 -1
- data/lib/sparql/algebra/operator/sum.rb +1 -1
- data/lib/sparql/algebra/operator/timezone.rb +1 -1
- data/lib/sparql/algebra/operator/triple.rb +27 -0
- data/lib/sparql/algebra/operator/tz.rb +1 -1
- data/lib/sparql/algebra/operator/ucase.rb +1 -1
- data/lib/sparql/algebra/operator/uuid.rb +1 -1
- data/lib/sparql/algebra/operator/with.rb +1 -1
- data/lib/sparql/algebra/operator/year.rb +1 -1
- data/lib/sparql/extensions.rb +6 -12
- data/lib/sparql/grammar.rb +2 -28
- data/lib/sparql/grammar/meta.rb +5739 -2365
- data/lib/sparql/grammar/parser11.rb +119 -59
- data/lib/sparql/grammar/terminals11.rb +3 -0
- data/lib/sparql/results.rb +17 -9
- metadata +31 -42
@@ -42,7 +42,7 @@ module SPARQL; module Algebra
|
|
42
42
|
# @return [RDF::Literal]
|
43
43
|
# @raise [TypeError] if any operand is unbound
|
44
44
|
# @raise [TypeError] if any operand is not a plain literal
|
45
|
-
def apply(text, pattern, replacement, flags = RDF::Literal(''))
|
45
|
+
def apply(text, pattern, replacement, flags = RDF::Literal(''), **options)
|
46
46
|
raise TypeError, "expected a plain RDF::Literal, but got #{text.inspect}" unless text.literal? && text.plain?
|
47
47
|
# TODO: validate text syntax
|
48
48
|
|
@@ -22,7 +22,7 @@ module SPARQL; module Algebra
|
|
22
22
|
# the operand
|
23
23
|
# @return [RDF::Literal] literal of same type
|
24
24
|
# @raise [TypeError] if the operand is not a numeric value
|
25
|
-
def apply(operand)
|
25
|
+
def apply(operand, **options)
|
26
26
|
case operand
|
27
27
|
when RDF::Literal::Numeric then operand.round
|
28
28
|
else raise TypeError, "expected an RDF::Literal::Numeric, but got #{operand.inspect}"
|
@@ -26,7 +26,7 @@ module SPARQL; module Algebra
|
|
26
26
|
# an RDF term
|
27
27
|
# @return [RDF::Literal::Boolean] `true` or `false`
|
28
28
|
# @raise [TypeError] if either operand is unbound
|
29
|
-
def apply(term1, term2)
|
29
|
+
def apply(term1, term2, **options)
|
30
30
|
RDF::Literal(term1.eql?(term2))
|
31
31
|
end
|
32
32
|
|
@@ -12,11 +12,18 @@ module SPARQL; module Algebra
|
|
12
12
|
# (bgp (triple ?s :dec ?o)))))))
|
13
13
|
#
|
14
14
|
# @see https://www.w3.org/TR/sparql11-query/#defn_aggSample
|
15
|
-
class Sample < Operator
|
15
|
+
class Sample < Operator
|
16
16
|
include Aggregate
|
17
17
|
|
18
18
|
NAME = :sample
|
19
19
|
|
20
|
+
def initialize(*operands, **options)
|
21
|
+
raise ArgumentError,
|
22
|
+
"sample operator accepts at most one argument with an optional :distinct" if
|
23
|
+
(operands - %i{distinct}).length != 1
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
20
27
|
##
|
21
28
|
# Sample is a set function which returns an arbitrary value from the multiset passed to it.
|
22
29
|
#
|
@@ -24,7 +31,7 @@ module SPARQL; module Algebra
|
|
24
31
|
# enum of evaluated operand
|
25
32
|
# @return [RDF::Term] An arbitrary term
|
26
33
|
# @raise [TypeError] If enum is empty
|
27
|
-
def apply(enum)
|
34
|
+
def apply(enum, **options)
|
28
35
|
enum.detect(lambda {raise TypeError, "Sampling an empty multiset"}) {|e| e.first}.first
|
29
36
|
end
|
30
37
|
end # LCase
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# the operand
|
25
25
|
# @return [RDF::Literal]
|
26
26
|
# @raise [TypeError] if the operand is not a simple literal
|
27
|
-
def apply(operand)
|
27
|
+
def apply(operand, **options)
|
28
28
|
raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
|
29
29
|
RDF::Literal(operand.object.second)
|
30
30
|
end
|
@@ -26,7 +26,7 @@ module SPARQL; module Algebra
|
|
26
26
|
# the operand
|
27
27
|
# @return [RDF::Literal]
|
28
28
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
29
|
+
def apply(operand, **options)
|
30
30
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
31
31
|
raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
|
32
32
|
RDF::Literal(Digest::SHA1.new.hexdigest(operand.to_s))
|
@@ -26,7 +26,7 @@ module SPARQL; module Algebra
|
|
26
26
|
# the operand
|
27
27
|
# @return [RDF::Literal]
|
28
28
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
29
|
+
def apply(operand, **options)
|
30
30
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
31
31
|
raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
|
32
32
|
RDF::Literal(Digest::SHA256.new.hexdigest(operand.to_s))
|
@@ -26,7 +26,7 @@ module SPARQL; module Algebra
|
|
26
26
|
# the operand
|
27
27
|
# @return [RDF::Literal]
|
28
28
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
29
|
+
def apply(operand, **options)
|
30
30
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
31
31
|
raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
|
32
32
|
RDF::Literal(Digest::SHA384.new.hexdigest(operand.to_s))
|
@@ -26,7 +26,7 @@ module SPARQL; module Algebra
|
|
26
26
|
# the operand
|
27
27
|
# @return [RDF::Literal]
|
28
28
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
29
|
+
def apply(operand, **options)
|
30
30
|
raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
|
31
31
|
raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
|
32
32
|
RDF::Literal(Digest::SHA512.new.hexdigest(operand.to_s))
|
@@ -23,7 +23,7 @@ module SPARQL; module Algebra
|
|
23
23
|
# a literal or IRI
|
24
24
|
# @return [RDF::Literal] a simple literal
|
25
25
|
# @raise [TypeError] if the operand is not a literal or IRI
|
26
|
-
def apply(term)
|
26
|
+
def apply(term, **options)
|
27
27
|
case term
|
28
28
|
when RDF::Literal then RDF::Literal(term.value)
|
29
29
|
when RDF::URI then RDF::Literal(term.to_s)
|
@@ -37,7 +37,7 @@ module SPARQL; module Algebra
|
|
37
37
|
# a literal
|
38
38
|
# @return [RDF::Literal]
|
39
39
|
# @raise [TypeError] if operands are not compatible
|
40
|
-
def apply(left, right)
|
40
|
+
def apply(left, right, **options)
|
41
41
|
case
|
42
42
|
when !left.compatible?(right)
|
43
43
|
raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
|
@@ -37,7 +37,7 @@ module SPARQL; module Algebra
|
|
37
37
|
# a literal
|
38
38
|
# @return [RDF::Literal]
|
39
39
|
# @raise [TypeError] if operands are not compatible
|
40
|
-
def apply(left, right)
|
40
|
+
def apply(left, right, **options)
|
41
41
|
case
|
42
42
|
when !left.plain? || !right.plain?
|
43
43
|
raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# datatype
|
25
25
|
# @return [RDF::Literal] a datatyped literal
|
26
26
|
# @see https://www.w3.org/TR/sparql11-query/#func-strdt
|
27
|
-
def apply(value, datatypeIRI)
|
27
|
+
def apply(value, datatypeIRI, **options)
|
28
28
|
raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
|
29
29
|
RDF::Literal.new(value.to_s, datatype: datatypeIRI)
|
30
30
|
end
|
@@ -33,7 +33,7 @@ module SPARQL; module Algebra
|
|
33
33
|
# a literal
|
34
34
|
# @return [RDF::Literal::Boolean]
|
35
35
|
# @raise [TypeError] if operands are not compatible
|
36
|
-
def apply(left, right)
|
36
|
+
def apply(left, right, **options)
|
37
37
|
case
|
38
38
|
when !left.compatible?(right)
|
39
39
|
raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
|
@@ -25,7 +25,7 @@ module SPARQL; module Algebra
|
|
25
25
|
# datatype
|
26
26
|
# @return [RDF::Literal] a datatyped literal
|
27
27
|
# @see https://www.w3.org/TR/sparql11-query/#func-strlang
|
28
|
-
def apply(value, langTag)
|
28
|
+
def apply(value, langTag, **options)
|
29
29
|
raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
|
30
30
|
RDF::Literal.new(value.to_s, language: langTag.to_s)
|
31
31
|
end
|
@@ -25,7 +25,7 @@ module SPARQL; module Algebra
|
|
25
25
|
# the operand
|
26
26
|
# @return [RDF::Literal::Integer] length of string
|
27
27
|
# @raise [TypeError] if the operand is not a numeric value
|
28
|
-
def apply(operand)
|
28
|
+
def apply(operand, **options)
|
29
29
|
raise TypeError, "expected a plain RDF::Literal, but got #{operand.inspect}" unless operand.literal? && operand.plain?
|
30
30
|
RDF::Literal(operand.to_s.length)
|
31
31
|
end
|
@@ -33,7 +33,7 @@ module SPARQL; module Algebra
|
|
33
33
|
# a literal
|
34
34
|
# @return [RDF::Literal::Boolean]
|
35
35
|
# @raise [TypeError] if operands are not compatible
|
36
|
-
def apply(left, right)
|
36
|
+
def apply(left, right, **options)
|
37
37
|
case
|
38
38
|
when !left.compatible?(right)
|
39
39
|
raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# Return a string that is the scheme specific part of UUID. That is, as a simple literal, the result of generating a UUID, converting to a simple literal and removing the initial urn:uuid:.
|
25
25
|
#
|
26
26
|
# @return [RDF::URI]
|
27
|
-
def apply
|
27
|
+
def apply(**options)
|
28
28
|
RDF::Literal(SecureRandom.uuid)
|
29
29
|
end
|
30
30
|
end # StrUUID
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module SPARQL; module Algebra
|
2
|
+
class Operator
|
3
|
+
##
|
4
|
+
# The SPARQL `SUBJECT` operator.
|
5
|
+
#
|
6
|
+
# Returns the subject part of `arg` as a term.
|
7
|
+
#
|
8
|
+
# If triple is an RDF-star triple, the function returns the subject of this triple. Passing anything other than an RDF-star triple is an error.
|
9
|
+
#
|
10
|
+
# @see https://w3c.github.io/rdf-star/rdf-star-cg-spec.html#subject
|
11
|
+
class Subject < Operator::Unary
|
12
|
+
include Evaluatable
|
13
|
+
|
14
|
+
NAME = :subject
|
15
|
+
|
16
|
+
##
|
17
|
+
# Returns the subject part of arg.
|
18
|
+
#
|
19
|
+
# @param [RDF::Statement] operand
|
20
|
+
# the operand
|
21
|
+
# @return [RDF::Literal]
|
22
|
+
# @raise [TypeError] if the operand is not a statement
|
23
|
+
def apply(operand, **options)
|
24
|
+
raise TypeError, "expected an RDF::Statement, but got #{operand.inspect}" unless operand.is_a?(RDF::Statement)
|
25
|
+
operand.subject
|
26
|
+
end
|
27
|
+
end # Subject
|
28
|
+
end # Operator
|
29
|
+
end; end # SPARQL::Algebra
|
@@ -49,7 +49,7 @@ module SPARQL; module Algebra
|
|
49
49
|
# an optional length of the substring.
|
50
50
|
# @return [RDF::Literal]
|
51
51
|
# @raise [TypeError] if operands are not compatible
|
52
|
-
def apply(source, startingLoc, length)
|
52
|
+
def apply(source, startingLoc, length, **options)
|
53
53
|
raise TypeError, "expected a plain RDF::Literal, but got #{source.inspect}" unless source.literal? && source.plain?
|
54
54
|
text = text.to_s
|
55
55
|
|
@@ -20,7 +20,7 @@ module SPARQL; module Algebra
|
|
20
20
|
# a numeric literal
|
21
21
|
# @return [RDF::Literal::Numeric]
|
22
22
|
# @raise [TypeError] if either operand is not a numeric literal
|
23
|
-
def apply(left, right)
|
23
|
+
def apply(left, right, **options)
|
24
24
|
case
|
25
25
|
when left.is_a?(RDF::Literal::Numeric) && right.is_a?(RDF::Literal::Numeric)
|
26
26
|
left - right
|
@@ -22,7 +22,7 @@ module SPARQL; module Algebra
|
|
22
22
|
# @param [Enumerable<Array<RDF::Term>>] enum
|
23
23
|
# enum of evaluated operand
|
24
24
|
# @return [RDF::Literal::Numeric] The sum of the terms
|
25
|
-
def apply(enum)
|
25
|
+
def apply(enum, **options)
|
26
26
|
# FIXME: we don't actually do anything with distinct
|
27
27
|
operands.shift if distinct = (operands.first == :distinct)
|
28
28
|
if enum.empty?
|
@@ -26,7 +26,7 @@ module SPARQL; module Algebra
|
|
26
26
|
# the operand
|
27
27
|
# @return [RDF::Literal]
|
28
28
|
# @raise [TypeError] if the operand is not a simple literal
|
29
|
-
def apply(operand)
|
29
|
+
def apply(operand, **options)
|
30
30
|
raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
|
31
31
|
raise TypeError, "literal has no timezone" unless res = operand.timezone
|
32
32
|
res
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module SPARQL; module Algebra
|
2
|
+
class Operator
|
3
|
+
##
|
4
|
+
# The SPARQL `triple` operator.
|
5
|
+
#
|
6
|
+
# If the 3-tuple (term1, term2, term3) is an RDF-star triple, the function returns this triple. If the 3-tuple is not an RDF-star triple, then the function raises an error.
|
7
|
+
#
|
8
|
+
# @see https://w3c.github.io/rdf-star/rdf-star-cg-spec.html#triple
|
9
|
+
class Triple < Operator::Ternary
|
10
|
+
include Evaluatable
|
11
|
+
|
12
|
+
NAME = :triple
|
13
|
+
|
14
|
+
##
|
15
|
+
# @param [RDF::Term] subject
|
16
|
+
# @param [RDF::Term] predicate
|
17
|
+
# @param [RDF::Term] object
|
18
|
+
# @return [RDF::URI]
|
19
|
+
# @raise [TypeError] if the operand is not a simple literal
|
20
|
+
def apply(subject, predicate, object, **options)
|
21
|
+
triple = RDF::Statement(subject, predicate, object)
|
22
|
+
raise TypeError, "valid components, but got #{triple.inspect}" unless triple.valid?
|
23
|
+
triple
|
24
|
+
end
|
25
|
+
end # Triple
|
26
|
+
end # Operator
|
27
|
+
end; end # SPARQL::Algebra
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# the operand
|
25
25
|
# @return [RDF::Literal]
|
26
26
|
# @raise [TypeError] if the operand is not a simple literal
|
27
|
-
def apply(operand)
|
27
|
+
def apply(operand, **options)
|
28
28
|
raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
|
29
29
|
operand.tz
|
30
30
|
end
|
@@ -20,7 +20,7 @@ module SPARQL; module Algebra
|
|
20
20
|
# the operand
|
21
21
|
# @return [RDF::Literal] literal of same type
|
22
22
|
# @raise [TypeError] if the operand is not a literal value
|
23
|
-
def apply(operand)
|
23
|
+
def apply(operand, **options)
|
24
24
|
case operand
|
25
25
|
when RDF::Literal then RDF::Literal(operand.to_s.upcase, datatype: operand.datatype, language: operand.language)
|
26
26
|
else raise TypeError, "expected an RDF::Literal::Numeric, but got #{operand.inspect}"
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# Return a fresh IRI from the UUID URN scheme. Each call of UUID() returns a different UUID. It must not be the "nil" UUID (all zeroes). The variant and version of the UUID is implementation dependent.
|
25
25
|
#
|
26
26
|
# @return [RDF::URI]
|
27
|
-
def apply
|
27
|
+
def apply(**options)
|
28
28
|
RDF::URI("urn:uuid:#{SecureRandom.uuid}")
|
29
29
|
end
|
30
30
|
end # UUID
|
@@ -40,7 +40,7 @@ module SPARQL; module Algebra
|
|
40
40
|
|
41
41
|
unless queryable.has_graph?(name)
|
42
42
|
debug(options) {"=> default data source #{name}"}
|
43
|
-
load_opts = {
|
43
|
+
load_opts = {logger: options.fetch(:logger, false), base_uri: name}
|
44
44
|
debug(options) {"=> load #{name}"}
|
45
45
|
queryable.load(name.to_s, **load_opts)
|
46
46
|
end
|
@@ -24,7 +24,7 @@ module SPARQL; module Algebra
|
|
24
24
|
# the operand
|
25
25
|
# @return [RDF::Literal]
|
26
26
|
# @raise [TypeError] if the operand is not a simple literal
|
27
|
-
def apply(operand)
|
27
|
+
def apply(operand, **options)
|
28
28
|
raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
|
29
29
|
RDF::Literal(operand.object.year)
|
30
30
|
end
|
data/lib/sparql/extensions.rb
CHANGED
@@ -25,11 +25,7 @@ module RDF::Queryable
|
|
25
25
|
#
|
26
26
|
# Used to implement the SPARQL `DESCRIBE` operator.
|
27
27
|
#
|
28
|
-
# @overload concise_bounded_description(*terms, &block)
|
29
|
-
# @param [Array<RDF::Term>] terms
|
30
|
-
# List of terms to include in the results.
|
31
|
-
#
|
32
|
-
# @overload concise_bounded_description(*terms, options, &block)
|
28
|
+
# @overload concise_bounded_description(*terms, **options, &block)
|
33
29
|
# @param [Array<RDF::Term>] terms
|
34
30
|
# List of terms to include in the results.
|
35
31
|
# @param [Hash{Symbol => Object}] options
|
@@ -44,16 +40,14 @@ module RDF::Queryable
|
|
44
40
|
# @return [RDF::Graph]
|
45
41
|
#
|
46
42
|
# @see https://www.w3.org/Submission/CBD/
|
47
|
-
def concise_bounded_description(*terms, &block)
|
48
|
-
options = terms.last.is_a?(Hash) ? terms.pop.dup : {}
|
49
|
-
|
43
|
+
def concise_bounded_description(*terms, **options, &block)
|
50
44
|
graph = options[:graph] || RDF::Graph.new
|
51
45
|
|
52
46
|
if options[:non_subjects]
|
53
47
|
query_terms = terms.dup
|
54
48
|
|
55
49
|
# Find terms not in self as a subject and recurse with their subjects
|
56
|
-
terms.reject {|term| self.first(subject: term)}.each do |term|
|
50
|
+
terms.reject {|term| self.first({subject: term})}.each do |term|
|
57
51
|
self.query({predicate: term}) do |statement|
|
58
52
|
query_terms << statement.subject
|
59
53
|
end
|
@@ -67,7 +61,7 @@ module RDF::Queryable
|
|
67
61
|
end
|
68
62
|
|
69
63
|
# Don't consider term if already in graph
|
70
|
-
terms.reject {|term| graph.first(subject: term)}.each do |term|
|
64
|
+
terms.reject {|term| graph.first({subject: term})}.each do |term|
|
71
65
|
# Find statements from queryiable with term as a subject
|
72
66
|
self.query({subject: term}) do |statement|
|
73
67
|
yield(statement) if block_given?
|
@@ -84,13 +78,13 @@ module RDF::Queryable
|
|
84
78
|
}, **{}).execute(self).each do |solution|
|
85
79
|
# Recurse to include this subject
|
86
80
|
recurse_opts = options.merge(non_subjects: false, graph: graph)
|
87
|
-
self.concise_bounded_description(solution[:s], recurse_opts, &block)
|
81
|
+
self.concise_bounded_description(solution[:s], **recurse_opts, &block)
|
88
82
|
end
|
89
83
|
|
90
84
|
# Recurse if object is a BNode and it is not already in subjects
|
91
85
|
if statement.object.node?
|
92
86
|
recurse_opts = options.merge(non_subjects: false, graph: graph)
|
93
|
-
self.concise_bounded_description(statement.object, recurse_opts, &block)
|
87
|
+
self.concise_bounded_description(statement.object, **recurse_opts, &block)
|
94
88
|
end
|
95
89
|
end
|
96
90
|
end
|
data/lib/sparql/grammar.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rdf' # @see https://rubygems.org/gems/rdf
|
2
2
|
require 'sparql/algebra'
|
3
3
|
require 'json'
|
4
|
-
require 'sxp'
|
5
4
|
|
6
5
|
module SPARQL
|
7
6
|
##
|
@@ -193,31 +192,6 @@ module SPARQL
|
|
193
192
|
# PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
194
193
|
# PREFIX dct: <http://purl.org/dc/elements/1.1/>
|
195
194
|
#
|
196
|
-
# SELECT ?age ?src WHERE {
|
197
|
-
# ?bob foaf:name "Bob" .
|
198
|
-
# BIND( <<?bob foaf:age ?age>> AS ?t ) .
|
199
|
-
# ?t dct:source ?src .
|
200
|
-
# }
|
201
|
-
#
|
202
|
-
# SXP:
|
203
|
-
#
|
204
|
-
# (prefix
|
205
|
-
# (
|
206
|
-
# (: <http://bigdata.com>)
|
207
|
-
# (foaf: <http://xmlns.com/foaf/0.1/>)
|
208
|
-
# (dct: <http://purl.org/dc/elements/1.1/>))
|
209
|
-
# (project
|
210
|
-
# (?age ?src)
|
211
|
-
# (join
|
212
|
-
# (extend ((?t (triple ?bob foaf:age ?age))) (bgp (triple ?bob foaf:name "Bob")))
|
213
|
-
# (bgp (triple ?t dct:source ?src))) ))
|
214
|
-
#
|
215
|
-
# SPARQL:
|
216
|
-
#
|
217
|
-
# PREFIX : <http://bigdata.com>
|
218
|
-
# PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
219
|
-
# PREFIX dct: <http://purl.org/dc/elements/1.1/>
|
220
|
-
#
|
221
195
|
# CONSTRUCT {
|
222
196
|
# ?bob foaf:name "Bob" .
|
223
197
|
# <<?bob foaf:age ?age>> dct:creator <http://example.com/crawlers#c1>;
|
@@ -293,7 +267,7 @@ module SPARQL
|
|
293
267
|
# @raise [RDF::FormatError] if no reader found for the specified format
|
294
268
|
def self.open(filename, **options, &block)
|
295
269
|
RDF::Util::File.open_file(filename, **options) do |file|
|
296
|
-
self.parse(file, options, &block)
|
270
|
+
self.parse(file, **options, &block)
|
297
271
|
end
|
298
272
|
end
|
299
273
|
|
@@ -327,7 +301,7 @@ module SPARQL
|
|
327
301
|
# @return [Lexer]
|
328
302
|
# @raise [Lexer::Error] on invalid input
|
329
303
|
def self.tokenize(query, **options, &block)
|
330
|
-
Lexer.tokenize(query, options, &block)
|
304
|
+
Lexer.tokenize(query, **options, &block)
|
331
305
|
end
|
332
306
|
end # Grammar
|
333
307
|
end # SPARQL
|