sparql 1.1.9.1 → 1.99.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f7b62f9060fc3abb46b979c2bce03fc815fcf5a
4
- data.tar.gz: e90b9a87808f7ef03d982c037aad31f07aa3fe32
3
+ metadata.gz: 2e189418bc1c955e9fe52f7f43c5ae7cbb6f4ece
4
+ data.tar.gz: 24ea48aaf680166acce769a030f83313bd6c9bc8
5
5
  SHA512:
6
- metadata.gz: 5f52c7e1ccba444cd171219a950f4a2622c9a75998104aeb16dada9a5fe543203210d6dda485e34cf3f5035287171cf59cb51d8f940e9f0b9f5c7c8a5448519d
7
- data.tar.gz: bc73deb551eadb6d1569e7211de0d841deafc8152ae38e2df1963a6a234cb7ba368318529356a1864b77fbd435bee54a382017015fd2b315deb412a6e0238ab7
6
+ metadata.gz: 3490effdaf0bb46eb1f85b2971b92dd3b94167073f962abc430dde19dfe0e25bca03f05d9fcb9cacc08bc00a0752cd4ed32d3678f61f816b2fcd6fc4f453bb22
7
+ data.tar.gz: f28f4674050da2bb575f5134e479eaf86472153dac106d1908c281e9df72e94144916b4bde0aeafa10ba29c93a712ae166ae0e316a1972bcbe50c5416a5a0feb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.9.1
1
+ 1.99.0
@@ -60,16 +60,16 @@ module Sinatra
60
60
 
61
61
  # Contexts
62
62
  if repository.is_a?(RDF::Enumerable)
63
- contexts = {}
63
+ graph_names = {}
64
64
  repository.each do |statement|
65
- contexts[statement.context] ||= 0
66
- contexts[statement.context] += 1
65
+ graph_names[statement.graph_name] ||= 0
66
+ graph_names[statement.graph_name] += 1
67
67
  end
68
68
 
69
- contexts.each do |name, count|
69
+ graph_names.each do |name, count|
70
70
  bn = RDF::Node.new
71
71
  if name
72
- # Add named contexts as namedGraphs
72
+ # Add named graphs as namedGraphs
73
73
  g << [ds, sd.join("#namedGraph"), bn]
74
74
  g << [bn, RDF.type, sd.join("#NamedGraph")]
75
75
  g << [bn, sd.join("#name"), name]
@@ -264,7 +264,7 @@ module SPARQL; module Algebra
264
264
  # Returns `false`.
265
265
  #
266
266
  # @return [Boolean]
267
- def has_blank_nodes?
267
+ def node?
268
268
  false
269
269
  end
270
270
 
@@ -86,8 +86,8 @@ class Array
86
86
  # Does this contain any nodes?
87
87
  #
88
88
  # @return [Boolean]
89
- def has_blank_nodes?
90
- any?(&:has_blank_nodes?)
89
+ def node?
90
+ any?(&:node?)
91
91
  end
92
92
  def evaluatable?; true; end
93
93
  def executable?; false; end
@@ -197,40 +197,6 @@ module RDF::Term
197
197
 
198
198
  def aggregate?; false; end
199
199
 
200
- # Term compatibility according to SPARQL
201
- #
202
- # Compatibility of two arguments is defined as:
203
- # * The arguments are simple literals or literals typed as xsd:string
204
- # * The arguments are plain literals with identical language tags
205
- # * The first argument is a plain literal with language tag and the second argument is a simple literal or literal typed as xsd:string
206
- #
207
- # @example
208
- # compatible?("abc" "b") #=> true
209
- # compatible?("abc" "b"^^xsd:string) #=> true
210
- # compatible?("abc"^^xsd:string "b") #=> true
211
- # compatible?("abc"^^xsd:string "b"^^xsd:string) #=> true
212
- # compatible?("abc"@en "b") #=> true
213
- # compatible?("abc"@en "b"^^xsd:string) #=> true
214
- # compatible?("abc"@en "b"@en) #=> true
215
- # compatible?("abc"@fr "b"@ja) #=> false
216
- # compatible?("abc" "b"@ja) #=> false
217
- # compatible?("abc" "b"@en) #=> false
218
- # compatible?("abc"^^xsd:string "b"@en) #=> false
219
- #
220
- # @see http://www.w3.org/TR/sparql11-query/#func-arg-compatibility
221
- def compatible?(other)
222
- return false unless literal? && other.literal? && plain? && other.plain?
223
-
224
- dtr = other.datatype
225
-
226
- # * The arguments are simple literals or literals typed as xsd:string
227
- # * The arguments are plain literals with identical language tags
228
- # * The first argument is a plain literal with language tag and the second argument is a simple literal or literal typed as xsd:string
229
- has_language? ?
230
- (language == other.language || dtr == RDF::XSD.string) :
231
- dtr == RDF::XSD.string
232
- end
233
-
234
200
  ##
235
201
  # Return the non-destinguished variables contained within this operator
236
202
  # @return [Array<RDF::Query::Variable>]
@@ -299,8 +265,8 @@ class RDF::Statement
299
265
  # Transform Statement Pattern into an SXP
300
266
  # @return [Array]
301
267
  def to_sxp_bin
302
- if has_context?
303
- [:quad, subject, predicate, object, context]
268
+ if has_graph?
269
+ [:quad, subject, predicate, object, graph_name]
304
270
  else
305
271
  [:triple, subject, predicate, object]
306
272
  end
@@ -313,7 +279,8 @@ class RDF::Query
313
279
  # Same Context
314
280
  # @return [Boolean]
315
281
  def ==(other)
316
- other.is_a?(RDF::Query) && patterns == other.patterns && context == context
282
+ # FIXME: this should be graph_name == other.graph_name
283
+ other.is_a?(RDF::Query) && patterns == other.patterns && graph_name == graph_name
317
284
  end
318
285
 
319
286
  ##
@@ -332,10 +299,10 @@ class RDF::Query
332
299
  # @return [Array]
333
300
  def to_sxp_bin
334
301
  if options[:as_container]
335
- [:graph, context] + [patterns.map(&:to_sxp_bin)]
302
+ [:graph, graph_name] + [patterns.map(&:to_sxp_bin)]
336
303
  else
337
304
  res = [:bgp] + patterns.map(&:to_sxp_bin)
338
- (context ? [:graph, context, res] : res)
305
+ (graph_name ? [:graph, graph_name, res] : res)
339
306
  end
340
307
  end
341
308
 
@@ -376,8 +343,8 @@ class RDF::Query::Pattern
376
343
  # Transform Query Pattern into an SXP
377
344
  # @return [Array]
378
345
  def to_sxp_bin
379
- if has_context?
380
- [:quad, subject, predicate, object, context]
346
+ if has_graph?
347
+ [:quad, subject, predicate, object, graph_name]
381
348
  else
382
349
  [:triple, subject, predicate, object]
383
350
  end
@@ -45,7 +45,7 @@ module SPARQL; module Algebra
45
45
  else
46
46
  src.each do |statement|
47
47
  statement = statement.dup
48
- statement.context = (dest_name unless dest_name == :default)
48
+ statement.graph_name = (dest_name unless dest_name == :default)
49
49
  queryable << statement
50
50
  end
51
51
  end
@@ -3,7 +3,7 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `bgp` operator.
5
5
  #
6
- # Query with `context` set to false.
6
+ # Query with `graph_name` set to false.
7
7
  #
8
8
  # @example
9
9
  # (prefix ((: <http://example/>))
@@ -13,7 +13,7 @@ module SPARQL; module Algebra
13
13
  class BGP < Operator
14
14
  NAME = [:bgp]
15
15
  ##
16
- # A `graph` is an RDF::Query with a context.
16
+ # A `graph` is an RDF::Query with a graph_name.
17
17
  #
18
18
  # @overload self.new(*patterns)
19
19
  # @param [Array<RDF::Query::Pattern>] patterns
@@ -23,7 +23,7 @@ module SPARQL; module Algebra
23
23
  # @yieldreturn [void] ignored
24
24
  # @return [RDF::Query]
25
25
  def self.new(*patterns, &block)
26
- RDF::Query.new(*(patterns + [{context: false}]), &block)
26
+ RDF::Query.new(*(patterns + [{graph_name: false}]), &block)
27
27
  end
28
28
  end # BGP
29
29
  end # Operator
@@ -38,16 +38,16 @@ module SPARQL; module Algebra
38
38
  case operands.last
39
39
  when :default
40
40
  queryable.each_graph do |g|
41
- g.clear! unless g.context
41
+ g.clear! unless g.graph_name
42
42
  end
43
43
  when :named
44
44
  queryable.each_graph do |g|
45
- g.clear! if g.context
45
+ g.clear! if g.graph_name
46
46
  end
47
47
  when :all
48
48
  queryable.clear!
49
49
  when RDF::URI
50
- if g = queryable.each_graph.detect {|c| c.context == operands.last}
50
+ if g = queryable.each_graph.detect {|c| c.graph_name == operands.last}
51
51
  g.clear!
52
52
  else
53
53
  raise IOError, "clear operation graph does not exist" unless silent
@@ -50,10 +50,10 @@ module SPARQL; module Algebra
50
50
  # Clear destination first
51
51
  dest.clear! if dest
52
52
 
53
- # Copy statements using destination context
53
+ # Copy statements using destination graph_name
54
54
  src.each do |statement|
55
55
  statement = statement.dup
56
- statement.context = (dest_name unless dest_name == :default)
56
+ statement.graph_name = (dest_name unless dest_name == :default)
57
57
  queryable << statement
58
58
  end
59
59
  end
@@ -38,7 +38,7 @@ module SPARQL; module Algebra
38
38
 
39
39
  iri = operands.first
40
40
  raise ArgumentError, "clear expected a single IRI" if operands.length != 1 || !iri.is_a?(RDF::URI)
41
- if queryable.has_context?(iri)
41
+ if queryable.has_graph?(iri)
42
42
  raise IOError, "create operation graph #{iri.to_ntriples} exists" unless silent
43
43
  end
44
44
  queryable
@@ -141,8 +141,8 @@ module SPARQL; module Algebra
141
141
  debug(options) {"=> default data source #{uri}"}
142
142
  default_datasets << uri
143
143
  end
144
- load_opts = {debug: options.fetch(:debug, nil), context: uri, base_uri: uri}
145
- unless queryable.has_context?(uri)
144
+ load_opts = {debug: options.fetch(:debug, nil), graph_name: uri, base_uri: uri}
145
+ unless queryable.has_graph?(uri)
146
146
  debug(options) {"=> load #{uri}"}
147
147
  queryable.load(uri.to_s, load_opts)
148
148
  end
@@ -154,8 +154,8 @@ module SPARQL; module Algebra
154
154
 
155
155
  # Create an aggregate based on queryable having just the bits we want
156
156
  aggregate = RDF::AggregateRepo.new(queryable)
157
- named_datasets.each {|name| aggregate.named(name) if queryable.has_context?(name)}
158
- aggregate.default(*default_datasets.select {|name| queryable.has_context?(name)})
157
+ named_datasets.each {|name| aggregate.named(name) if queryable.has_graph?(name)}
158
+ aggregate.default(*default_datasets.select {|name| queryable.has_graph?(name)})
159
159
  aggregate.query(operands.last, options.merge(depth: options[:depth].to_i + 1), &base)
160
160
  end
161
161
 
@@ -41,16 +41,16 @@ module SPARQL; module Algebra
41
41
  case operands.last
42
42
  when :default
43
43
  queryable.each_graph do |g|
44
- g.clear! unless g.context
44
+ g.clear! unless g.graph_name
45
45
  end
46
46
  when :named
47
47
  queryable.each_graph do |g|
48
- g.clear! if g.context
48
+ g.clear! if g.graph_name
49
49
  end
50
50
  when :all
51
51
  queryable.clear!
52
52
  when RDF::URI
53
- if g = queryable.each_graph.detect {|c| c.context == operands.last}
53
+ if g = queryable.each_graph.detect {|c| c.graph_name == operands.last}
54
54
  g.clear!
55
55
  else
56
56
  raise IOError, "drop operation graph does not exist" unless silent
@@ -64,7 +64,7 @@ module SPARQL; module Algebra
64
64
  def validate!
65
65
  unless (join = operands.last).is_a?(Join) &&
66
66
  join.operands.all? {|op| op.is_a?(RDF::Query)} &&
67
- join.operands.map(&:context).uniq.length == 1
67
+ join.operands.map(&:graph_name).uniq.length == 1
68
68
  operands.last.validate!
69
69
  end
70
70
  self
@@ -1,10 +1,9 @@
1
- # FIXME: This depends on an update to RDF::Query#execute to be able to pass the context as an option.
2
1
  module SPARQL; module Algebra
3
2
  class Operator
4
3
  ##
5
4
  # The SPARQL GraphPattern `graph` operator.
6
5
  #
7
- # This is a wrapper to add a `context` to the query, or an array of statements.
6
+ # This is a wrapper to add a `graph_name` to the query, or an array of statements.
8
7
  #
9
8
  # @example of a query
10
9
  # (prefix ((: <http://example/>))
@@ -22,7 +21,7 @@ module SPARQL; module Algebra
22
21
 
23
22
  NAME = [:graph]
24
23
  ##
25
- # A `graph` is an RDF::Query with a context. It can also be used as a container of statements or patterns, or other queryable operators (see GraphGraphPattern)
24
+ # A `graph` is an RDF::Query with a graph_name. It can also be used as a container of statements or patterns, or other queryable operators (see GraphGraphPattern)
26
25
  #
27
26
  # @overload self.new(name, bgp)
28
27
  # @param [RDF::Resource] name
@@ -41,18 +40,18 @@ module SPARQL; module Algebra
41
40
  case patterns
42
41
  when RDF::Query
43
42
  # Record that the argument as a (bgp) for re-serialization back to SSE
44
- RDF::Query.new(*(patterns.patterns + [{context: name,}]), &block)
43
+ RDF::Query.new(*(patterns.patterns + [{graph_name: name,}]), &block)
45
44
  when Operator
46
45
  super
47
46
  else
48
- RDF::Query.new(*(patterns + [{context: name, as_container: true}]), &block)
47
+ RDF::Query.new(*(patterns + [{graph_name: name, as_container: true}]), &block)
49
48
  end
50
49
  end
51
50
 
52
51
  ##
53
52
  # If the second operand is a Query operator:
54
53
  # Executes this query on the given `queryable` graph or repository.
55
- # Applies the given `context` to the query, limiting the scope of the query to the specified `context`, which may be an `RDF::URI` or `RDF::Query::Variable`.
54
+ # Applies the given `graph_name` to the query, limiting the scope of the query to the specified `graph`, which may be an `RDF::URI` or `RDF::Query::Variable`.
56
55
  #
57
56
  # @param [RDF::Queryable] queryable
58
57
  # the graph or repository to query
@@ -67,8 +66,8 @@ module SPARQL; module Algebra
67
66
  # @see http://www.w3.org/TR/rdf-sparql-query/#sparqlAlgebra
68
67
  def execute(queryable, options = {}, &block)
69
68
  debug(options) {"Graph #{operands.first}"}
70
- context, query = operands.first, operands.last
71
- @solutions = queryable.query(query, options.merge(context: context), &block)
69
+ graph_name, query = operands.first, operands.last
70
+ @solutions = queryable.query(query, options.merge(graph_name: graph_name), &block)
72
71
  end
73
72
 
74
73
  ##
@@ -37,7 +37,7 @@ module SPARQL; module Algebra
37
37
  raise ArgumentError, "load expected one or two operands, got #{operands.length}" unless [1,2].include?(operands.length)
38
38
 
39
39
  location, name = operands
40
- queryable.load(location, context: name)
40
+ queryable.load(location, graph_name: name)
41
41
  rescue IOError, Errno::ENOENT
42
42
  raise unless silent
43
43
  ensure
@@ -50,10 +50,10 @@ module SPARQL; module Algebra
50
50
  # Clear destination first
51
51
  dest.clear! if dest
52
52
 
53
- # Copy statements using destination context
53
+ # Copy statements using destination graph
54
54
  src.each do |statement|
55
55
  statement = statement.dup
56
- statement.context = (dest_name unless dest_name == :default)
56
+ statement.graph_name = (dest_name unless dest_name == :default)
57
57
  queryable << statement
58
58
  end
59
59
 
@@ -34,7 +34,7 @@ module SPARQL; module Algebra
34
34
  path_op.execute(queryable, options.merge(
35
35
  subject: subject,
36
36
  object: object,
37
- context: options.fetch(:context, false),
37
+ graph_name: options.fetch(:graph_name, false),
38
38
  depth: options[:depth].to_i + 1)
39
39
  ) do |solution|
40
40
  @solutions << solution
@@ -20,7 +20,7 @@ module SPARQL; module Algebra
20
20
  ##
21
21
  # Executes this upate on the given `writable` graph or repository.
22
22
  #
23
- # Effectively filters results by setting a default `__context__` variable so that it is used when binding to perform update operations on the appropriate triples.
23
+ # Effectively filters results by setting a default `__graph_name__` variable so that it is used when binding to perform update operations on the appropriate triples.
24
24
  #
25
25
  # @param [RDF::Queryable] queryable
26
26
  # the graph or repository to write
@@ -38,20 +38,20 @@ module SPARQL; module Algebra
38
38
  # Bound variable
39
39
  name = operands.shift
40
40
 
41
- unless queryable.has_context?(name)
41
+ unless queryable.has_graph?(name)
42
42
  debug(options) {"=> default data source #{name}"}
43
43
  load_opts = {debug: options.fetch(:debug, nil), base_uri: name}
44
44
  debug(options) {"=> load #{name}"}
45
45
  queryable.load(name.to_s, load_opts)
46
46
  end
47
47
 
48
- # Set name for RDF::Graph descendants having no context to the name variable
48
+ # Set name for RDF::Graph descendants having no graph_name to the name variable
49
49
  each_descendant do |op|
50
50
  case op
51
51
  when RDF::Query, RDF::Query::Pattern
52
- unless op.context
53
- debug(options) {"set context on #{op.to_sse}"}
54
- op.context = RDF::Query::Variable.new(:__context__, name)
52
+ unless op.graph_name
53
+ debug(options) {"set graph_name on #{op.to_sse}"}
54
+ op.graph_name = RDF::Query::Variable.new(:__graph_name__, name)
55
55
  end
56
56
  end
57
57
  end
@@ -442,9 +442,9 @@ module SPARQL; module Algebra
442
442
  # otherwise.
443
443
  #
444
444
  # @return [Boolean]
445
- def has_blank_nodes?
445
+ def node?
446
446
  operands.any? do |operand|
447
- operand.respond_to?(:has_blank_nodes?) ? operand.has_blank_nodes? : operand.node?
447
+ operand.respond_to?(:node?) ? operand.node? : operand.node?
448
448
  end
449
449
  end
450
450
 
@@ -40,7 +40,7 @@ module SPARQL; module Algebra
40
40
  # any additional keyword options
41
41
  # @option options [Boolean] debug
42
42
  # Query execution debugging
43
- # @option options [RDF::Term, RDF::Query::Variable] :context
43
+ # @option options [RDF::Term, RDF::Query::Variable] :graph_name
44
44
  # @yield [solution]
45
45
  # each matching solution, statement or boolean
46
46
  # @yieldparam [RDF::Statement, RDF::Query::Solution, Boolean] solution
@@ -54,12 +54,12 @@ module SPARQL; module Algebra
54
54
  raise NotImplementedError, "#{self.class}#execute(#{queryable})"
55
55
  end
56
56
 
57
- # Add context to sub-items, unless they already have a context
57
+ # Add graph_name to sub-items, unless they already have a graph_name
58
58
  # @param [RDF::URI, RDF::Query::Variable] value
59
59
  # @return [RDF::URI, RDF::Query::Variable]
60
- def context=(value)
60
+ def graph_name=(value)
61
61
  operands.each do |operand|
62
- operand.context = value if operand.respond_to?(:context) && operand.context != false
62
+ operand.graph_name = value if operand.respond_to?(:graph_name) && operand.graph_name != false
63
63
  end
64
64
  value
65
65
  end
@@ -43,12 +43,12 @@ module SPARQL; module Algebra
43
43
  raise NotImplementedError, "#{self.class}#execute(#{queryable})"
44
44
  end
45
45
 
46
- # Add context to sub-items, unless they already have a context
46
+ # Add graph_name to sub-items, unless they already have a graph_name
47
47
  # @param [RDF::URI, RDF::Query::Variable] value
48
48
  # @return [RDF::URI, RDF::Query::Variable]
49
- def context=(value)
49
+ def graph_name=(value)
50
50
  operands.each do |operand|
51
- operand.context = value if operand.respond_to?(:context) && operand.context != false
51
+ operand.graph_name = value if operand.respond_to?(:graph_name) && operand.graph_name != false
52
52
  end
53
53
  value
54
54
  end
@@ -476,28 +476,39 @@ module SPARQL::Grammar
476
476
  end
477
477
 
478
478
  # [38] InsertData ::= "INSERT DATA" QuadData
479
+ start_production(:InsertData) do |input, data, callback|
480
+ # Freeze existing bnodes, so that if an attempt is made to re-use such a node, and error is raised
481
+ self.freeze_bnodes
482
+ end
479
483
  production(:InsertData) do |input, data, callback|
480
484
  input[:update_op] = SPARQL::Algebra::Expression(:insertData, data[:pattern])
481
485
  end
482
486
 
483
487
  # [39] DeleteData ::= "DELETE DATA" QuadData
488
+ start_production(:DeleteData) do |input, data, callback|
489
+ # Generate BNodes instead of non-distinguished variables. BNodes are not legal, but this will generate them rather than non-distinguished variables so they can be detected.
490
+ self.gen_bnodes
491
+ end
484
492
  production(:DeleteData) do |input, data, callback|
485
- raise Error, "DeleteData contains BNode operands: #{data[:pattern].to_sse}" if data[:pattern].first.has_blank_nodes?
493
+ raise Error, "DeleteData contains BNode operands: #{data[:pattern].to_sse}" if data[:pattern].first.node?
486
494
  input[:update_op] = SPARQL::Algebra::Expression(:deleteData, data[:pattern])
487
495
  end
488
496
 
489
497
  # [40] DeleteWhere ::= "DELETE WHERE" QuadPattern
490
498
  start_production(:DeleteWhere) do |input, data, callback|
491
499
  # Generate BNodes instead of non-distinguished variables. BNodes are not legal, but this will generate them rather than non-distinguished variables so they can be detected.
492
- self.clear_bnode_cache
500
+ self.gen_bnodes
493
501
  end
494
502
  production(:DeleteWhere) do |input, data, callback|
495
- raise Error, "DeleteWhere contains BNode operands: #{data[:pattern].to_sse}" if data[:pattern].first.has_blank_nodes?
496
- self.nd_var_gen = "0"
503
+ raise Error, "DeleteWhere contains BNode operands: #{data[:pattern].to_sse}" if data[:pattern].first.node?
504
+ self.gen_bnodes(false)
497
505
  input[:update_op] = SPARQL::Algebra::Expression(:deleteWhere, data[:pattern])
498
506
  end
499
507
 
500
508
  # [41] Modify ::= ("WITH" iri)? ( DeleteClause InsertClause? | InsertClause) UsingClause* "WHERE" GroupGraphPattern
509
+ start_production(:Modify) do |input, data, callback|
510
+ self.clear_bnode_cache
511
+ end
501
512
  production(:Modify) do |input, data, callback|
502
513
  query = data[:query].first if data[:query]
503
514
  query = SPARQL::Algebra::Expression.for(:using, data[:using], query) if data[:using]
@@ -509,16 +520,21 @@ module SPARQL::Grammar
509
520
  # [42] DeleteClause ::= "DELETE" QuadPattern
510
521
  start_production(:DeleteClause) do |input, data, callback|
511
522
  # Generate BNodes instead of non-distinguished variables. BNodes are not legal, but this will generate them rather than non-distinguished variables so they can be detected.
512
- self.clear_bnode_cache
523
+ self.gen_bnodes
513
524
  end
514
525
  production(:DeleteClause) do |input, data, callback|
515
- raise Error, "DeleteClause contains BNode operands: #{data[:pattern].to_sse}" if data[:pattern].first.has_blank_nodes?
516
- self.nd_var_gen = "0"
526
+ raise Error, "DeleteClause contains BNode operands: #{data[:pattern].to_sse}" if data[:pattern].first.node?
527
+ self.gen_bnodes(false)
517
528
  input[:delete] = SPARQL::Algebra::Expression(:delete, data[:pattern])
518
529
  end
519
530
 
520
531
  # [43] InsertClause ::= "INSERT" QuadPattern
532
+ start_production(:InsertClause) do |input, data, callback|
533
+ # Generate BNodes instead of non-distinguished variables.
534
+ self.gen_bnodes
535
+ end
521
536
  production(:InsertClause) do |input, data, callback|
537
+ self.gen_bnodes(false)
522
538
  input[:insert] = SPARQL::Algebra::Expression(:insert, data[:pattern])
523
539
  end
524
540
 
@@ -548,13 +564,13 @@ module SPARQL::Grammar
548
564
  # QuadData is like QuadPattern, except without BNodes
549
565
  start_production(:QuadData) do |input, data, callback|
550
566
  # Generate BNodes instead of non-distinguished variables
551
- self.clear_bnode_cache
567
+ self.gen_bnodes
552
568
  end
553
569
  production(:QuadData) do |input, data, callback|
554
570
  # Transform using statements instead of patterns, and verify there are no variables
555
571
  raise Error, "QuadData empty" unless data[:pattern]
556
572
  raise Error, "QuadData contains variable operands: #{data[:pattern].to_sse}" if data[:pattern].first.variable?
557
- self.nd_var_gen = "0"
573
+ self.gen_bnodes(false)
558
574
  input[:pattern] = data[:pattern]
559
575
  end
560
576
 
@@ -783,11 +799,11 @@ module SPARQL::Grammar
783
799
  # [73] ConstructTemplate ::= '{' ConstructTriples? '}'
784
800
  start_production(:ConstructTemplate) do |input, data, callback|
785
801
  # Generate BNodes instead of non-distinguished variables
786
- self.clear_bnode_cache
802
+ self.gen_bnodes
787
803
  end
788
804
  production(:ConstructTemplate) do |input, data, callback|
789
805
  # Generate BNodes instead of non-distinguished variables
790
- self.nd_var_gen = "0"
806
+ self.gen_bnodes(false)
791
807
  add_prod_datum(:ConstructTemplate, data[:pattern])
792
808
  add_prod_datum(:ConstructTemplate, data[:ConstructTemplate])
793
809
  end
@@ -1637,12 +1653,26 @@ module SPARQL::Grammar
1637
1653
  # Used for generating BNode labels
1638
1654
  attr_accessor :nd_var_gen
1639
1655
 
1640
- # Reset the bnode cache, always generating new nodes, and start generating BNodes instead of non-distinguished variables
1656
+ # Generate BNodes, not non-distinguished variables
1657
+ # @param [Boolean] value
1658
+ # @return [void]
1659
+ def gen_bnodes(value = true)
1660
+ @nd_var_gen = value ? false : "0"
1661
+ end
1662
+
1663
+ # Clear cached BNodes
1664
+ # @return [void]
1641
1665
  def clear_bnode_cache
1642
- @nd_var_gen = false
1643
1666
  @bnode_cache = {}
1644
1667
  end
1645
1668
 
1669
+ # Freeze BNodes, which allows us to detect if they're re-used
1670
+ # @return [void]
1671
+ def freeze_bnodes
1672
+ @bnode_cache ||= {}
1673
+ @bnode_cache.each_value(&:freeze)
1674
+ end
1675
+
1646
1676
  # Generate a BNode identifier
1647
1677
  def bnode(id = nil)
1648
1678
  if @nd_var_gen
@@ -1653,7 +1683,9 @@ module SPARQL::Grammar
1653
1683
  id = @options[:anon_base]
1654
1684
  @options[:anon_base] = @options[:anon_base].succ
1655
1685
  end
1656
- (@bnode_cache ||= {})[id.to_s] ||= RDF::Node.new(id)
1686
+ @bnode_cache ||= {}
1687
+ raise Error, "Illegal attempt to reuse a BNode" if @bnode_cache[id] && @bnode_cache[id].frozen?
1688
+ @bnode_cache[id] ||= RDF::Node.new(id)
1657
1689
  end
1658
1690
  end
1659
1691
 
data/lib/sparql.rb CHANGED
@@ -55,11 +55,11 @@ module SPARQL
55
55
  # @param [Hash{Symbol => Object}] options
56
56
  # @option options [RDF::Queryable] :queryable
57
57
  # @option options [RDF::URI, String, Array<RDF::URI, String>] :load_datasets
58
- # One or more URIs used to initialize a new instance of `queryable` in the default context.
58
+ # One or more URIs used to initialize a new instance of `queryable` in the default graph.
59
59
  # @option options [RDF::URI, String, Array<RDF::URI, String>] :default_graph_uri
60
- # One or more URIs used to initialize a new instance of `queryable` in the default context.
60
+ # One or more URIs used to initialize a new instance of `queryable` in the default graph.
61
61
  # @option options [RDF::URI, String, Array<RDF::URI, String>] :named_graph_uri
62
- # One or more URIs used to initialize the `queryable` as a named context.
62
+ # One or more URIs used to initialize the `queryable` as a named graph.
63
63
  # @yield [solution]
64
64
  # each matching solution, statement or boolean
65
65
  # @yieldparam [RDF::Statement, RDF::Query::Solution, Boolean] solution
@@ -84,7 +84,7 @@ module SPARQL
84
84
  queryable.load(uri)
85
85
  end
86
86
  [options[:named_graph_uri]].flatten.each do |uri|
87
- queryable.load(uri, context: uri)
87
+ queryable.load(uri, graph_name: uri)
88
88
  end
89
89
  end
90
90
  query.execute(queryable, &block)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.9.1
4
+ version: 1.99.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg Kellogg
@@ -9,19 +9,13 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-09 00:00:00.000000000 Z
12
+ date: 2015-10-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdf
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - "~>"
19
- - !ruby/object:Gem::Version
20
- version: '1.1'
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.1.13
24
- - - "<"
25
19
  - !ruby/object:Gem::Version
26
20
  version: '1.99'
27
21
  type: :runtime
@@ -29,12 +23,6 @@ dependencies:
29
23
  version_requirements: !ruby/object:Gem::Requirement
30
24
  requirements:
31
25
  - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.1'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 1.1.13
37
- - - "<"
38
26
  - !ruby/object:Gem::Version
39
27
  version: '1.99'
40
28
  - !ruby/object:Gem::Dependency
@@ -42,12 +30,6 @@ dependencies:
42
30
  requirement: !ruby/object:Gem::Requirement
43
31
  requirements:
44
32
  - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '1.1'
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 1.1.0
50
- - - "<"
51
33
  - !ruby/object:Gem::Version
52
34
  version: '1.99'
53
35
  type: :runtime
@@ -55,12 +37,6 @@ dependencies:
55
37
  version_requirements: !ruby/object:Gem::Requirement
56
38
  requirements:
57
39
  - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '1.1'
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: 1.1.0
63
- - - "<"
64
40
  - !ruby/object:Gem::Version
65
41
  version: '1.99'
66
42
  - !ruby/object:Gem::Dependency
@@ -112,9 +88,6 @@ dependencies:
112
88
  - - "~>"
113
89
  - !ruby/object:Gem::Version
114
90
  version: '1.1'
115
- - - "<"
116
- - !ruby/object:Gem::Version
117
- version: '1.99'
118
91
  type: :runtime
119
92
  prerelease: false
120
93
  version_requirements: !ruby/object:Gem::Requirement
@@ -122,9 +95,6 @@ dependencies:
122
95
  - - "~>"
123
96
  - !ruby/object:Gem::Version
124
97
  version: '1.1'
125
- - - "<"
126
- - !ruby/object:Gem::Version
127
- version: '1.99'
128
98
  - !ruby/object:Gem::Dependency
129
99
  name: rdf-xsd
130
100
  requirement: !ruby/object:Gem::Requirement
@@ -132,9 +102,6 @@ dependencies:
132
102
  - - "~>"
133
103
  - !ruby/object:Gem::Version
134
104
  version: '1.1'
135
- - - "<"
136
- - !ruby/object:Gem::Version
137
- version: '1.99'
138
105
  type: :runtime
139
106
  prerelease: false
140
107
  version_requirements: !ruby/object:Gem::Requirement
@@ -142,9 +109,6 @@ dependencies:
142
109
  - - "~>"
143
110
  - !ruby/object:Gem::Version
144
111
  version: '1.1'
145
- - - "<"
146
- - !ruby/object:Gem::Version
147
- version: '1.99'
148
112
  - !ruby/object:Gem::Dependency
149
113
  name: sinatra
150
114
  requirement: !ruby/object:Gem::Requirement
@@ -200,9 +164,6 @@ dependencies:
200
164
  - - "~>"
201
165
  - !ruby/object:Gem::Version
202
166
  version: '1.1'
203
- - - "<"
204
- - !ruby/object:Gem::Version
205
- version: '1.99'
206
167
  type: :development
207
168
  prerelease: false
208
169
  version_requirements: !ruby/object:Gem::Requirement
@@ -210,17 +171,11 @@ dependencies:
210
171
  - - "~>"
211
172
  - !ruby/object:Gem::Version
212
173
  version: '1.1'
213
- - - "<"
214
- - !ruby/object:Gem::Version
215
- version: '1.99'
216
174
  - !ruby/object:Gem::Dependency
217
175
  name: rdf-spec
218
176
  requirement: !ruby/object:Gem::Requirement
219
177
  requirements:
220
178
  - - "~>"
221
- - !ruby/object:Gem::Version
222
- version: '1.1'
223
- - - "<"
224
179
  - !ruby/object:Gem::Version
225
180
  version: '1.99'
226
181
  type: :development
@@ -228,9 +183,6 @@ dependencies:
228
183
  version_requirements: !ruby/object:Gem::Requirement
229
184
  requirements:
230
185
  - - "~>"
231
- - !ruby/object:Gem::Version
232
- version: '1.1'
233
- - - "<"
234
186
  - !ruby/object:Gem::Version
235
187
  version: '1.99'
236
188
  - !ruby/object:Gem::Dependency