rdf 3.1.11 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/VERSION +1 -1
- data/lib/rdf/cli.rb +3 -2
- data/lib/rdf/mixin/enumerable.rb +13 -4
- data/lib/rdf/model/graph.rb +24 -9
- data/lib/rdf/model/literal/double.rb +1 -0
- data/lib/rdf/model/literal/numeric.rb +4 -2
- data/lib/rdf/model/literal.rb +55 -4
- data/lib/rdf/model/statement.rb +50 -15
- data/lib/rdf/model/term.rb +14 -4
- data/lib/rdf/model/uri.rb +13 -5
- data/lib/rdf/model/value.rb +53 -16
- data/lib/rdf/nquads.rb +2 -2
- data/lib/rdf/ntriples/reader.rb +6 -6
- data/lib/rdf/ntriples/writer.rb +1 -1
- data/lib/rdf/query/pattern.rb +6 -0
- data/lib/rdf/query/solution.rb +25 -7
- data/lib/rdf/query/solutions.rb +15 -6
- data/lib/rdf/query/variable.rb +19 -5
- data/lib/rdf/query.rb +15 -4
- data/lib/rdf/reader.rb +1 -1
- data/lib/rdf/repository.rb +36 -100
- data/lib/rdf/transaction.rb +82 -4
- data/lib/rdf/util/file.rb +2 -2
- data/lib/rdf/util/logger.rb +8 -5
- data/lib/rdf/vocabulary.rb +8 -7
- data/lib/rdf/writer.rb +2 -2
- metadata +20 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deb163eb0095fba5da13f3f9a03a8543cb244e4525a495f2585d49c98e72fffc
|
4
|
+
data.tar.gz: e146b2eeaf881c53cf4291362698440febbb6f45fb793c3369fc374a8909c97d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 568557c3d23702f3fb8f842d8b64a19f116403c1d21a1da6164b6ce83a8d8297556ac5d74e508916d9be6ff215de777d553591760db9ab79479d161e89a3d6a8
|
7
|
+
data.tar.gz: 7d90c6165c87710add8ed7b9359fdd38b617b1efac9c928885b88c78769d0b0a7a1898418b6a9c3d2d6e97a9eb7de61ae48047b9053e430eeb053b3ee5a75968
|
data/README.md
CHANGED
@@ -398,16 +398,16 @@ from BNode identity (i.e., they each entail the other)
|
|
398
398
|
|
399
399
|
## Dependencies
|
400
400
|
|
401
|
-
* [Ruby](https://ruby-lang.org/) (>= 2.
|
401
|
+
* [Ruby](https://ruby-lang.org/) (>= 2.6)
|
402
402
|
* [LinkHeader][] (>= 0.0.8)
|
403
|
-
* Soft dependency on [RestClient][] (>= 1
|
403
|
+
* Soft dependency on [RestClient][] (>= 2.1)
|
404
404
|
|
405
405
|
## Installation
|
406
406
|
|
407
407
|
The recommended installation method is via [RubyGems](https://rubygems.org/).
|
408
408
|
To install the latest official release of RDF.rb, do:
|
409
409
|
|
410
|
-
% [sudo] gem install rdf # Ruby 2+
|
410
|
+
% [sudo] gem install rdf # Ruby 2.6+
|
411
411
|
|
412
412
|
## Download
|
413
413
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1
|
1
|
+
3.2.1
|
data/lib/rdf/cli.rb
CHANGED
@@ -256,8 +256,7 @@ module RDF
|
|
256
256
|
lambda: ->(argv, opts) do
|
257
257
|
writer_class = RDF::Writer.for(opts[:output_format]) || RDF::NTriples::Writer
|
258
258
|
out = opts[:output]
|
259
|
-
|
260
|
-
writer_opts = opts.merge(standard_prefixes: true)
|
259
|
+
writer_opts = {prefixes: {}, standard_prefixes: true}.merge(opts)
|
261
260
|
writer_class.new(out, **writer_opts) do |writer|
|
262
261
|
writer << repository
|
263
262
|
end
|
@@ -536,6 +535,8 @@ module RDF
|
|
536
535
|
count = 0
|
537
536
|
self.parse(args, **options) do |reader|
|
538
537
|
reader.each_statement {|st| @repository << st}
|
538
|
+
# Remember prefixes from reading
|
539
|
+
options[:prefixes] ||= reader.prefixes
|
539
540
|
end
|
540
541
|
secs = Time.new - start
|
541
542
|
options[:logger].info "Parsed #{repository.count} statements with #{@readers.join(', ')} in #{secs} seconds @ #{count/secs} statements/second."
|
data/lib/rdf/mixin/enumerable.rb
CHANGED
@@ -136,8 +136,13 @@ module RDF
|
|
136
136
|
#
|
137
137
|
# @param [RDF::Statement] statement
|
138
138
|
# @return [Boolean]
|
139
|
-
def statement?(
|
140
|
-
|
139
|
+
def statement?(*args)
|
140
|
+
case args.length
|
141
|
+
when 0 then false
|
142
|
+
when 1
|
143
|
+
args.first && !enum_statement.find { |s| s.eql?(args.first) }.nil?
|
144
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
145
|
+
end
|
141
146
|
end
|
142
147
|
alias_method :has_statement?, :statement?
|
143
148
|
alias_method :include?, :statement?
|
@@ -541,8 +546,12 @@ module RDF
|
|
541
546
|
# @param [RDF::Resource] value
|
542
547
|
# @return [Boolean]
|
543
548
|
# @since 2.0
|
544
|
-
def term?(
|
545
|
-
|
549
|
+
def term?(*args)
|
550
|
+
case args.length
|
551
|
+
when 0 then super
|
552
|
+
when 1 then args.first && enum_term.include?(args.first)
|
553
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
554
|
+
end
|
546
555
|
end
|
547
556
|
alias_method :has_term?, :term?
|
548
557
|
|
data/lib/rdf/model/graph.rb
CHANGED
@@ -138,11 +138,22 @@ module RDF
|
|
138
138
|
end
|
139
139
|
|
140
140
|
##
|
141
|
-
#
|
141
|
+
# @overload graph?
|
142
|
+
# Returns `true` to indicate that this is a graph.
|
142
143
|
#
|
143
|
-
#
|
144
|
-
|
145
|
-
|
144
|
+
# @return [Boolean]
|
145
|
+
# @overload graph?(name)
|
146
|
+
# Returns `true` if `self` contains the given RDF graph_name.
|
147
|
+
#
|
148
|
+
# @param [RDF::Resource, false] graph_name
|
149
|
+
# Use value `false` to query for the default graph_name
|
150
|
+
# @return [Boolean]
|
151
|
+
def graph?(*args)
|
152
|
+
case args.length
|
153
|
+
when 0 then true
|
154
|
+
when 1 then graph_name == args.first
|
155
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
156
|
+
end
|
146
157
|
end
|
147
158
|
|
148
159
|
##
|
@@ -227,11 +238,15 @@ module RDF
|
|
227
238
|
# @param [Statement] statement
|
228
239
|
# @return [Boolean]
|
229
240
|
# @see RDF::Enumerable#statement?
|
230
|
-
def statement?(
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
241
|
+
def statement?(*args)
|
242
|
+
case args.length
|
243
|
+
when 0 then false
|
244
|
+
when 1
|
245
|
+
statement = args.first.dup
|
246
|
+
statement.graph_name = graph_name
|
247
|
+
@data.statement?(statement)
|
248
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
249
|
+
end
|
235
250
|
end
|
236
251
|
alias_method :has_statement?, :statement?
|
237
252
|
|
@@ -43,6 +43,7 @@ module RDF; class Literal
|
|
43
43
|
# Can't use simple %f transformation due to special requirements from
|
44
44
|
# N3 tests in representation
|
45
45
|
@string = case
|
46
|
+
when @object.nil? then 'NaN'
|
46
47
|
when @object.nan? then 'NaN'
|
47
48
|
when @object.infinite? then @object.to_s[0...-'inity'.length].upcase
|
48
49
|
when @object.zero? then '0.0E0'
|
@@ -11,6 +11,9 @@ module RDF; class Literal
|
|
11
11
|
# @return [Integer] `-1`, `0`, or `1`
|
12
12
|
# @since 0.3.0
|
13
13
|
def <=>(other)
|
14
|
+
# If lexically invalid, use regular literal testing
|
15
|
+
return super unless self.valid? && (!other.respond_to?(:valid?) || other.valid?)
|
16
|
+
|
14
17
|
case other
|
15
18
|
when ::Numeric
|
16
19
|
to_d <=> other
|
@@ -30,11 +33,10 @@ module RDF; class Literal
|
|
30
33
|
# @since 0.3.0
|
31
34
|
def ==(other)
|
32
35
|
# If lexically invalid, use regular literal testing
|
33
|
-
return super unless self.valid?
|
36
|
+
return super unless self.valid? && (!other.respond_to?(:valid?) || other.valid?)
|
34
37
|
|
35
38
|
case other
|
36
39
|
when Literal::Numeric
|
37
|
-
return super unless other.valid?
|
38
40
|
(cmp = (self <=> other)) ? cmp.zero? : false
|
39
41
|
when RDF::URI, RDF::Node
|
40
42
|
# Interpreting SPARQL data-r2/expr-equal/eq-2-2, numeric can't be compared with other types
|
data/lib/rdf/model/literal.rb
CHANGED
@@ -166,12 +166,12 @@ module RDF
|
|
166
166
|
@object = value.freeze
|
167
167
|
@string = lexical if lexical
|
168
168
|
@string = value if !defined?(@string) && value.is_a?(String)
|
169
|
-
@string = @string.encode(Encoding::UTF_8).freeze if
|
170
|
-
@object = @string if
|
169
|
+
@string = @string.encode(Encoding::UTF_8).freeze if instance_variable_defined?(:@string)
|
170
|
+
@object = @string if instance_variable_defined?(:@string) && @object.is_a?(String)
|
171
171
|
@language = language.to_s.downcase.to_sym if language
|
172
172
|
@datatype = RDF::URI(datatype).freeze if datatype
|
173
173
|
@datatype ||= self.class.const_get(:DATATYPE) if self.class.const_defined?(:DATATYPE)
|
174
|
-
@datatype ||= @language ? RDF.langString : RDF::URI("http://www.w3.org/2001/XMLSchema#string")
|
174
|
+
@datatype ||= instance_variable_defined?(:@language) && @language ? RDF.langString : RDF::URI("http://www.w3.org/2001/XMLSchema#string")
|
175
175
|
end
|
176
176
|
|
177
177
|
##
|
@@ -179,7 +179,7 @@ module RDF
|
|
179
179
|
#
|
180
180
|
# @return [String]
|
181
181
|
def value
|
182
|
-
@string || to_s
|
182
|
+
instance_variable_defined?(:@string) && @string || to_s
|
183
183
|
end
|
184
184
|
|
185
185
|
##
|
@@ -308,6 +308,37 @@ module RDF
|
|
308
308
|
end
|
309
309
|
alias_method :===, :==
|
310
310
|
|
311
|
+
##
|
312
|
+
# Compares `self` to `other` for sorting purposes (with type check).
|
313
|
+
#
|
314
|
+
# @param [Object] other
|
315
|
+
# @return [Integer] `-1`, `0`, or `1`
|
316
|
+
def <=>(other)
|
317
|
+
case other
|
318
|
+
when Literal
|
319
|
+
case
|
320
|
+
when self.eql?(other)
|
321
|
+
0
|
322
|
+
when self.language? && other.language?
|
323
|
+
# Literals with languages can compare if languages are identical
|
324
|
+
self.to_s <=> other.to_s
|
325
|
+
when self.simple? && other.simple?
|
326
|
+
self.to_s <=> other.to_s
|
327
|
+
when !self.valid?
|
328
|
+
type_error("#{self.inspect} is invalid") || 0
|
329
|
+
when !other.valid?
|
330
|
+
type_error("#{other.inspect} is invalid") || 0
|
331
|
+
when self.comperable_datatype2?(other)
|
332
|
+
self.object <=> other.object
|
333
|
+
else
|
334
|
+
type_error("#{self.inspect} and #{other.inspect} are not comperable") || 0
|
335
|
+
end
|
336
|
+
when String
|
337
|
+
self.simple? && self.value <=> other
|
338
|
+
else 1
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
311
342
|
##
|
312
343
|
# Returns `true` if this is a plain literal. A plain literal
|
313
344
|
# may have a language, but may not have a datatype. For
|
@@ -399,6 +430,26 @@ module RDF
|
|
399
430
|
end
|
400
431
|
end
|
401
432
|
|
433
|
+
##
|
434
|
+
# Returns `true` if the literals are comperable.
|
435
|
+
#
|
436
|
+
# Used for <=> operator.
|
437
|
+
#
|
438
|
+
# @return [Boolean]
|
439
|
+
def comperable_datatype2?(other)
|
440
|
+
case self
|
441
|
+
when RDF::Literal::Numeric, RDF::Literal::Boolean
|
442
|
+
case other
|
443
|
+
when RDF::Literal::Numeric, RDF::Literal::Boolean
|
444
|
+
true
|
445
|
+
else
|
446
|
+
false
|
447
|
+
end
|
448
|
+
else
|
449
|
+
self.datatype == other.datatype
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
402
453
|
##
|
403
454
|
# Converts this literal into its canonical lexical representation.
|
404
455
|
#
|
data/lib/rdf/model/statement.rb
CHANGED
@@ -136,23 +136,45 @@ module RDF
|
|
136
136
|
end
|
137
137
|
|
138
138
|
##
|
139
|
-
#
|
139
|
+
# @overload statement?
|
140
|
+
# Returns `true` if `self` is a {RDF::Statement}.
|
140
141
|
#
|
141
|
-
#
|
142
|
-
|
143
|
-
|
142
|
+
# @return [Boolean]
|
143
|
+
# @overload statement?(statement)
|
144
|
+
# Returns `true` if `self` contains the given {RDF::Statement}.
|
145
|
+
#
|
146
|
+
# @param [RDF::Statement] statement
|
147
|
+
# @return [Boolean]
|
148
|
+
def statement?(*args)
|
149
|
+
case args.length
|
150
|
+
when 0 then true
|
151
|
+
when 1 then self == args.first || subject.statement?(*args) || object.statement?(*args)
|
152
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
153
|
+
end
|
144
154
|
end
|
145
155
|
|
146
156
|
##
|
147
|
-
#
|
157
|
+
# @overload variable?
|
158
|
+
# Returns `true` if any element of the statement is not a
|
148
159
|
# URI, Node or Literal.
|
149
160
|
#
|
150
|
-
#
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
161
|
+
# @return [Boolean]
|
162
|
+
# @overload variable?(variables)
|
163
|
+
# Returns `true` if this statement contains any of the variables.
|
164
|
+
#
|
165
|
+
# @param [Array<Symbol, #to_sym>] variables
|
166
|
+
# @return [Boolean]
|
167
|
+
def variable?(*args)
|
168
|
+
case args.length
|
169
|
+
when 0
|
170
|
+
!(subject? && subject.constant? &&
|
171
|
+
predicate? && predicate.constant? &&
|
172
|
+
object? && object.constant? &&
|
173
|
+
(graph? ? graph_name.constant? : true))
|
174
|
+
when 1
|
175
|
+
to_quad.any? {|t| t.respond_to?(:variable?) && t.variable?(*args)}
|
176
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
177
|
+
end
|
156
178
|
end
|
157
179
|
|
158
180
|
##
|
@@ -215,9 +237,22 @@ module RDF
|
|
215
237
|
end
|
216
238
|
|
217
239
|
##
|
218
|
-
# @
|
219
|
-
|
220
|
-
|
240
|
+
# @overload graph?
|
241
|
+
# Returns `true` if the statement has a graph name.
|
242
|
+
#
|
243
|
+
# @return [Boolean]
|
244
|
+
# @overload graph?(name)
|
245
|
+
# Returns `true` if `self` contains the given RDF graph_name.
|
246
|
+
#
|
247
|
+
# @param [RDF::Resource, false] graph_name
|
248
|
+
# Use value `false` to query for the default graph_name
|
249
|
+
# @return [Boolean]
|
250
|
+
def graph?(*args)
|
251
|
+
case args.length
|
252
|
+
when 0 then !!graph_name
|
253
|
+
when 1 then graph_name == args.first
|
254
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
255
|
+
end
|
221
256
|
end
|
222
257
|
alias_method :name?, :graph?
|
223
258
|
alias_method :has_graph?, :graph?
|
@@ -266,7 +301,7 @@ module RDF
|
|
266
301
|
# @see RDF::Literal#==
|
267
302
|
# @see RDF::Query::Variable#==
|
268
303
|
def eql?(other)
|
269
|
-
other.is_a?(Statement) && self
|
304
|
+
other.is_a?(Statement) && self.to_a.eql?(other.to_a) && (self.graph_name || false) == (other.graph_name || false)
|
270
305
|
end
|
271
306
|
|
272
307
|
##
|
data/lib/rdf/model/term.rb
CHANGED
@@ -57,11 +57,21 @@ module RDF
|
|
57
57
|
end
|
58
58
|
|
59
59
|
##
|
60
|
-
#
|
60
|
+
# @overload term?
|
61
|
+
# Returns `true` if `self` is a {RDF::Term}.
|
61
62
|
#
|
62
|
-
#
|
63
|
-
|
64
|
-
|
63
|
+
# @return [Boolean]
|
64
|
+
# @overload term?(name)
|
65
|
+
# Returns `true` if `self` contains the given RDF subject term.
|
66
|
+
#
|
67
|
+
# @param [RDF::Resource] value
|
68
|
+
# @return [Boolean]
|
69
|
+
def term?(*args)
|
70
|
+
case args.length
|
71
|
+
when 0 then true
|
72
|
+
when 1 then false
|
73
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
74
|
+
end
|
65
75
|
end
|
66
76
|
|
67
77
|
##
|
data/lib/rdf/model/uri.rb
CHANGED
@@ -621,16 +621,22 @@ module RDF
|
|
621
621
|
end
|
622
622
|
|
623
623
|
##
|
624
|
-
# Returns a qualified name (QName) for this URI based on available vocabularies, if possible.
|
624
|
+
# Returns a qualified name (QName) as a tuple of `[prefix, suffix]` for this URI based on available vocabularies, if possible.
|
625
625
|
#
|
626
626
|
# @example
|
627
627
|
# RDF::URI('http://www.w3.org/2000/01/rdf-schema#').qname #=> [:rdfs, nil]
|
628
628
|
# RDF::URI('http://www.w3.org/2000/01/rdf-schema#label').qname #=> [:rdfs, :label]
|
629
629
|
# RDF::RDFS.label.qname #=> [:rdfs, :label]
|
630
630
|
#
|
631
|
+
# @param [Hash{Symbol => String}] prefixes
|
632
|
+
# Explicit set of prefixes to look for matches, defaults to loaded vocabularies.
|
631
633
|
# @return [Array(Symbol, Symbol)] or `nil` if no QName found
|
632
|
-
def qname
|
633
|
-
if
|
634
|
+
def qname(prefixes: nil)
|
635
|
+
if prefixes
|
636
|
+
prefixes.each do |prefix, uri|
|
637
|
+
return [prefix, self.to_s[uri.length..-1].to_sym] if self.start_with?(uri)
|
638
|
+
end
|
639
|
+
elsif self.to_s =~ %r([:/#]([^:/#]*)$)
|
634
640
|
local_name = $1
|
635
641
|
vocab_uri = local_name.empty? ? self.to_s : self.to_s[0...-(local_name.length)]
|
636
642
|
Vocabulary.each do |vocab|
|
@@ -655,9 +661,11 @@ module RDF
|
|
655
661
|
##
|
656
662
|
# Returns a string version of the QName or the full IRI
|
657
663
|
#
|
664
|
+
# @param [Hash{Symbol => String}] prefixes
|
665
|
+
# Explicit set of prefixes to look for matches, defaults to loaded vocabularies.
|
658
666
|
# @return [String] or `nil`
|
659
|
-
def pname
|
660
|
-
(q = self.qname) ? q.join(":") : to_s
|
667
|
+
def pname(prefixes: nil)
|
668
|
+
(q = self.qname(prefixes: prefixes)) ? q.join(":") : to_s
|
661
669
|
end
|
662
670
|
|
663
671
|
##
|
data/lib/rdf/model/value.rb
CHANGED
@@ -29,19 +29,38 @@ module RDF
|
|
29
29
|
# @see RDF::Statement
|
30
30
|
module Value
|
31
31
|
##
|
32
|
-
#
|
32
|
+
# @overload graph?
|
33
|
+
# Returns `true` if `self` is a {RDF::Graph}.
|
33
34
|
#
|
34
|
-
#
|
35
|
-
|
36
|
-
|
35
|
+
# @return [Boolean]
|
36
|
+
# @overload graph?(name)
|
37
|
+
# Returns `true` if `self` contains the given RDF graph_name.
|
38
|
+
#
|
39
|
+
# @param [RDF::Resource, false] graph_name
|
40
|
+
# Use value `false` to query for the default graph_name
|
41
|
+
# @return [Boolean]
|
42
|
+
def graph?(*args)
|
43
|
+
case args.length
|
44
|
+
when 0, 1 then false
|
45
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
46
|
+
end
|
37
47
|
end
|
38
48
|
|
39
49
|
##
|
40
|
-
#
|
50
|
+
# @overload statement?
|
51
|
+
# Returns `true` if `self` is a {RDF::Statement}.
|
41
52
|
#
|
42
|
-
#
|
43
|
-
|
44
|
-
|
53
|
+
# @return [Boolean]
|
54
|
+
# @overload statement?(statement)
|
55
|
+
# Returns `true` if `self` contains the given {RDF::Statement}.
|
56
|
+
#
|
57
|
+
# @param [RDF::Statement] statement
|
58
|
+
# @return [Boolean]
|
59
|
+
def statement?(*args)
|
60
|
+
case args.length
|
61
|
+
when 0, 1 then false
|
62
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
63
|
+
end
|
45
64
|
end
|
46
65
|
|
47
66
|
##
|
@@ -53,11 +72,20 @@ module RDF
|
|
53
72
|
end
|
54
73
|
|
55
74
|
##
|
56
|
-
#
|
75
|
+
# @overload term?
|
76
|
+
# Returns `true` if `self` is a {RDF::Term}.
|
57
77
|
#
|
58
|
-
#
|
59
|
-
|
60
|
-
|
78
|
+
# @return [Boolean]
|
79
|
+
# @overload term?(name)
|
80
|
+
# Returns `true` if `self` contains the given RDF subject term.
|
81
|
+
#
|
82
|
+
# @param [RDF::Resource] value
|
83
|
+
# @return [Boolean]
|
84
|
+
def term?(*args)
|
85
|
+
case args.length
|
86
|
+
when 0, 1 then false
|
87
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
88
|
+
end
|
61
89
|
end
|
62
90
|
|
63
91
|
##
|
@@ -103,12 +131,21 @@ module RDF
|
|
103
131
|
end
|
104
132
|
|
105
133
|
##
|
106
|
-
#
|
134
|
+
# @overload variable?
|
135
|
+
# Returns `true` if `self` is a {RDF::Query::Variable}, or does it contain a variable?
|
107
136
|
#
|
108
|
-
#
|
137
|
+
# @return [Boolean]
|
138
|
+
# @overload variable?(variable)
|
139
|
+
# Returns `true` if `self` contains the given variable.
|
140
|
+
#
|
141
|
+
# @param [RDF::Resource] value
|
142
|
+
# @return [Boolean]
|
109
143
|
# @since 0.1.7
|
110
|
-
def variable?
|
111
|
-
|
144
|
+
def variable?(*args)
|
145
|
+
case args.length
|
146
|
+
when 0, 1 then false
|
147
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
148
|
+
end
|
112
149
|
end
|
113
150
|
|
114
151
|
##
|
data/lib/rdf/nquads.rb
CHANGED
@@ -69,9 +69,9 @@ module RDF
|
|
69
69
|
|
70
70
|
begin
|
71
71
|
unless blank? || read_comment
|
72
|
-
subject = read_uriref || read_node ||
|
72
|
+
subject = read_uriref || read_node || read_quotedTriple || fail_subject
|
73
73
|
predicate = read_uriref(intern: true) || fail_predicate
|
74
|
-
object = read_uriref || read_node || read_literal ||
|
74
|
+
object = read_uriref || read_node || read_literal || read_quotedTriple || fail_object
|
75
75
|
graph_name = read_uriref || read_node
|
76
76
|
if validate? && !read_eos
|
77
77
|
log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError)
|
data/lib/rdf/ntriples/reader.rb
CHANGED
@@ -213,7 +213,7 @@ module RDF::NTriples
|
|
213
213
|
begin
|
214
214
|
read_statement
|
215
215
|
rescue RDF::ReaderError
|
216
|
-
value = read_uriref || read_node || read_literal ||
|
216
|
+
value = read_uriref || read_node || read_literal || read_quotedTriple
|
217
217
|
log_recover
|
218
218
|
value
|
219
219
|
end
|
@@ -229,9 +229,9 @@ module RDF::NTriples
|
|
229
229
|
|
230
230
|
begin
|
231
231
|
unless blank? || read_comment
|
232
|
-
subject = read_uriref || read_node ||
|
232
|
+
subject = read_uriref || read_node || read_quotedTriple || fail_subject
|
233
233
|
predicate = read_uriref(intern: true) || fail_predicate
|
234
|
-
object = read_uriref || read_node || read_literal ||
|
234
|
+
object = read_uriref || read_node || read_literal || read_quotedTriple || fail_object
|
235
235
|
|
236
236
|
if validate? && !read_eos
|
237
237
|
log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError)
|
@@ -247,11 +247,11 @@ module RDF::NTriples
|
|
247
247
|
|
248
248
|
##
|
249
249
|
# @return [RDF::Statement]
|
250
|
-
def
|
250
|
+
def read_quotedTriple
|
251
251
|
if @options[:rdfstar] && match(ST_START)
|
252
|
-
subject = read_uriref || read_node ||
|
252
|
+
subject = read_uriref || read_node || read_quotedTriple || fail_subject
|
253
253
|
predicate = read_uriref(intern: true) || fail_predicate
|
254
|
-
object = read_uriref || read_node || read_literal ||
|
254
|
+
object = read_uriref || read_node || read_literal || read_quotedTriple || fail_object
|
255
255
|
if !match(ST_END)
|
256
256
|
log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError)
|
257
257
|
end
|
data/lib/rdf/ntriples/writer.rb
CHANGED
@@ -227,7 +227,7 @@ module RDF::NTriples
|
|
227
227
|
# @param [RDF::Statement] statement
|
228
228
|
# @param [Hash{Symbol => Object}] options ({})
|
229
229
|
# @return [String]
|
230
|
-
def
|
230
|
+
def format_quotedTriple(statement, **options)
|
231
231
|
"<<%s %s %s>>" % statement.to_a.map { |value| format_term(value, **options) }
|
232
232
|
end
|
233
233
|
##
|
data/lib/rdf/query/pattern.rb
CHANGED
@@ -59,6 +59,12 @@ module RDF; class Query
|
|
59
59
|
super
|
60
60
|
end
|
61
61
|
|
62
|
+
##
|
63
|
+
# Create a new pattern from the quads, recursivly dupping sub-patterns.
|
64
|
+
def dup
|
65
|
+
self.class.from(self.to_quad.map {|t| t.is_a?(RDF::Query::Pattern) ? t.dup : t})
|
66
|
+
end
|
67
|
+
|
62
68
|
##
|
63
69
|
# Any additional options for this pattern.
|
64
70
|
#
|
data/lib/rdf/query/solution.rb
CHANGED
@@ -23,10 +23,13 @@ class RDF::Query
|
|
23
23
|
class Solution
|
24
24
|
# Undefine all superfluous instance methods:
|
25
25
|
alias_method :__send, :send
|
26
|
+
|
27
|
+
# Temporarily remember instance method for deprecation message in `method_missing`.
|
28
|
+
INSTANCE_METHODS = instance_methods
|
26
29
|
undef_method(*instance_methods.
|
27
30
|
map(&:to_s).
|
28
31
|
select {|m| m.match?(/^\w+$/)}.
|
29
|
-
reject {|m| %w(object_id dup instance_eval inspect to_s private_methods class
|
32
|
+
reject {|m| %w(object_id dup instance_eval inspect to_s private_methods public_methods class method pretty_print).include?(m) || m[0,2] == '__'}.
|
30
33
|
map(&:to_sym))
|
31
34
|
|
32
35
|
include Enumerable
|
@@ -114,15 +117,24 @@ class RDF::Query
|
|
114
117
|
end
|
115
118
|
|
116
119
|
##
|
117
|
-
#
|
120
|
+
# @overload variable?
|
121
|
+
# Returns `false`.
|
122
|
+
#
|
123
|
+
# @return [Boolean]
|
124
|
+
# @overload variable?(variables)
|
125
|
+
# Returns `true` if this solution contains bindings for any of the given
|
118
126
|
# `variables`.
|
119
127
|
#
|
120
|
-
#
|
121
|
-
#
|
122
|
-
# @return [Boolean] `true` or `false`
|
128
|
+
# @param [Array<Symbol, #to_sym>] variables
|
129
|
+
# @return [Boolean]
|
123
130
|
# @since 0.3.0
|
124
|
-
def variable?(
|
125
|
-
|
131
|
+
def variable?(*args)
|
132
|
+
case args.length
|
133
|
+
when 0 then false
|
134
|
+
when 1
|
135
|
+
args.first.any? { |variable| bound?(variable) }
|
136
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
137
|
+
end
|
126
138
|
end
|
127
139
|
alias_method :variables?, :variable?
|
128
140
|
alias_method :has_variables?, :variable?
|
@@ -335,6 +347,12 @@ class RDF::Query
|
|
335
347
|
# @return [RDF::Term]
|
336
348
|
def method_missing(name, *args, &block)
|
337
349
|
if args.empty? && @bindings.key?(name.to_sym)
|
350
|
+
if INSTANCE_METHODS.include?(name)
|
351
|
+
warn "[DEPRECATION] RDF::Query::Solution##{name} is an overridden instance method.\n" +
|
352
|
+
"Its use as a solution accessor is deprecated and will be removed in a future version.\n" +
|
353
|
+
"Use #[] for safe access.\n" +
|
354
|
+
"Called from #{Gem.location_of_caller.join(':')}"
|
355
|
+
end
|
338
356
|
@bindings[name.to_sym]
|
339
357
|
else
|
340
358
|
super # raises NoMethodError
|