rdf 1.1.17.1 → 1.99.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README +9 -9
- data/VERSION +1 -1
- data/lib/rdf/cli.rb +10 -10
- data/lib/rdf/format.rb +9 -9
- data/lib/rdf/mixin/enumerable.rb +66 -38
- data/lib/rdf/mixin/mutable.rb +11 -5
- data/lib/rdf/mixin/queryable.rb +2 -2
- data/lib/rdf/model/graph.rb +60 -40
- data/lib/rdf/model/list.rb +9 -9
- data/lib/rdf/model/literal/boolean.rb +1 -1
- data/lib/rdf/model/literal/date.rb +1 -1
- data/lib/rdf/model/literal/datetime.rb +5 -5
- data/lib/rdf/model/literal/decimal.rb +1 -1
- data/lib/rdf/model/literal/double.rb +3 -1
- data/lib/rdf/model/literal/integer.rb +1 -1
- data/lib/rdf/model/literal/time.rb +5 -5
- data/lib/rdf/model/literal/token.rb +1 -1
- data/lib/rdf/model/literal.rb +40 -6
- data/lib/rdf/model/node.rb +1 -1
- data/lib/rdf/model/statement.rb +88 -30
- data/lib/rdf/model/term.rb +10 -1
- data/lib/rdf/model/uri.rb +24 -25
- data/lib/rdf/nquads.rb +13 -22
- data/lib/rdf/ntriples/format.rb +4 -5
- data/lib/rdf/ntriples/reader.rb +10 -10
- data/lib/rdf/ntriples/writer.rb +6 -6
- data/lib/rdf/query/pattern.rb +49 -35
- data/lib/rdf/query/solution.rb +1 -1
- data/lib/rdf/query/solutions.rb +4 -4
- data/lib/rdf/query.rb +81 -40
- data/lib/rdf/reader.rb +22 -5
- data/lib/rdf/repository.rb +86 -37
- data/lib/rdf/transaction.rb +41 -20
- data/lib/rdf/util/file.rb +35 -18
- data/lib/rdf/vocab/schema.rb +5129 -5127
- data/lib/rdf/vocabulary.rb +43 -60
- data/lib/rdf/writer.rb +22 -12
- data/lib/rdf.rb +19 -4
- metadata +19 -5
data/lib/rdf/model/statement.rb
CHANGED
@@ -4,19 +4,19 @@ module RDF
|
|
4
4
|
#
|
5
5
|
# @example Creating an RDF statement
|
6
6
|
# s = RDF::URI.new("http://rubygems.org/gems/rdf")
|
7
|
-
# p = RDF::DC.creator
|
7
|
+
# p = RDF::Vocab::DC.creator
|
8
8
|
# o = RDF::URI.new("http://ar.to/#self")
|
9
9
|
# RDF::Statement(s, p, o)
|
10
10
|
#
|
11
|
-
# @example Creating an RDF statement with a
|
11
|
+
# @example Creating an RDF statement with a graph_name
|
12
12
|
# uri = RDF::URI("http://example/")
|
13
|
-
# RDF::Statement(s, p, o, :
|
13
|
+
# RDF::Statement(s, p, o, graph_name: uri)
|
14
14
|
#
|
15
15
|
# @example Creating an RDF statement from a `Hash`
|
16
16
|
# RDF::Statement({
|
17
|
-
# :
|
18
|
-
# :
|
19
|
-
# :
|
17
|
+
# subject: RDF::URI.new("http://rubygems.org/gems/rdf"),
|
18
|
+
# predicate: RDF::Vocab::DC.creator,
|
19
|
+
# object: RDF::URI.new("http://ar.to/#self"),
|
20
20
|
# })
|
21
21
|
#
|
22
22
|
# @example Creating an RDF statement with interned nodes
|
@@ -34,8 +34,8 @@ module RDF
|
|
34
34
|
def self.from(statement, options = {})
|
35
35
|
case statement
|
36
36
|
when Array, Query::Pattern
|
37
|
-
|
38
|
-
self.new(statement[0], statement[1], statement[2], options.merge(:
|
37
|
+
graph_name = statement[3] == false ? nil : statement[3]
|
38
|
+
self.new(statement[0], statement[1], statement[2], options.merge(graph_name: graph_name))
|
39
39
|
when Statement then statement
|
40
40
|
when Hash then self.new(options.merge(statement))
|
41
41
|
else raise ArgumentError, "expected RDF::Statement, Hash, or Array, but got #{statement.inspect}"
|
@@ -46,7 +46,29 @@ module RDF
|
|
46
46
|
attr_accessor :id
|
47
47
|
|
48
48
|
# @return [RDF::Resource]
|
49
|
-
attr_accessor :
|
49
|
+
attr_accessor :graph_name
|
50
|
+
|
51
|
+
##
|
52
|
+
# Name of this graph, if it is part of an {RDF::Repository}
|
53
|
+
# @!attribute [rw] graph_name
|
54
|
+
# @return [RDF::Resource]
|
55
|
+
# @since 1.1.0
|
56
|
+
# @deprecated Use {#graph_name} instead.
|
57
|
+
def context
|
58
|
+
warn "[DEPRECATION] Statement#context is being replaced with Statement@graph_name in RDF.rb 2.0. Called from #{Gem.location_of_caller.join(':')}"
|
59
|
+
graph_name
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Name of this graph, if it is part of an {RDF::Repository}
|
64
|
+
# @!attribute [rw] graph_name
|
65
|
+
# @return [RDF::Resource]
|
66
|
+
# @since 1.1.0
|
67
|
+
# @deprecated Use {#graph_name=} instead.
|
68
|
+
def context=(value)
|
69
|
+
warn "[DEPRECATION] Statement#context= is being replaced with Statement@graph_name= in RDF.rb 2.0. Called from #{Gem.location_of_caller.join(':')}"
|
70
|
+
self.graph_name = value
|
71
|
+
end
|
50
72
|
|
51
73
|
# @return [RDF::Resource]
|
52
74
|
attr_accessor :subject
|
@@ -66,7 +88,9 @@ module RDF
|
|
66
88
|
# @option options [RDF::Resource] :object (nil)
|
67
89
|
# if not a {Resource}, it is coerced to {Literal} or {Node} depending on if it is a symbol or something other than a {Term}.
|
68
90
|
# @option options [RDF::Term] :context (nil)
|
69
|
-
#
|
91
|
+
# Alias for :graph_name, :context is deprecated in RDF.rb.
|
92
|
+
# @option options [RDF::Term] :graph_name (nil)
|
93
|
+
# Note, in RDF 1.1, a graph name MUST be an {Resource}.
|
70
94
|
# @return [RDF::Statement]
|
71
95
|
#
|
72
96
|
# @overload initialize(subject, predicate, object, options = {})
|
@@ -77,6 +101,9 @@ module RDF
|
|
77
101
|
# if not a {Resource}, it is coerced to {Literal} or {Node} depending on if it is a symbol or something other than a {Term}.
|
78
102
|
# @param [Hash{Symbol => Object}] options
|
79
103
|
# @option options [RDF::Term] :context (nil)
|
104
|
+
# Alias for :graph_name, :context is deprecated in RDF.rb.
|
105
|
+
# @option options [RDF::Term] :graph_name (nil)
|
106
|
+
# Note, in RDF 1.1, a graph name MUST be an {Resource}.
|
80
107
|
# @return [RDF::Statement]
|
81
108
|
def initialize(subject = nil, predicate = nil, object = nil, options = {})
|
82
109
|
if subject.is_a?(Hash)
|
@@ -90,15 +117,19 @@ module RDF
|
|
90
117
|
@predicate = predicate
|
91
118
|
@object = object
|
92
119
|
end
|
93
|
-
|
94
|
-
|
120
|
+
if @options.has_key?(:context)
|
121
|
+
warn "[DEPRECATION] the :contexts option to Mutable#load is deprecated in RDF.rb 2.0, use :graph_name instead. Called from #{Gem.location_of_caller.join(':')}"
|
122
|
+
@options[:graph_name] ||= @options.delete(:context)
|
123
|
+
end
|
124
|
+
@id = @options.delete(:id) if @options.has_key?(:id)
|
125
|
+
@graph_name = @options.delete(:graph_name)
|
95
126
|
initialize!
|
96
127
|
end
|
97
128
|
|
98
129
|
##
|
99
130
|
# @private
|
100
131
|
def initialize!
|
101
|
-
@
|
132
|
+
@graph_name = Node.intern(@graph_name) if @graph_name.is_a?(Symbol)
|
102
133
|
@subject = if @subject.is_a?(Value)
|
103
134
|
@subject.to_term
|
104
135
|
elsif @subject.is_a?(Symbol)
|
@@ -137,7 +168,7 @@ module RDF
|
|
137
168
|
!(has_subject? && subject.resource? &&
|
138
169
|
has_predicate? && predicate.resource? &&
|
139
170
|
has_object? && (object.resource? || object.literal?) &&
|
140
|
-
(
|
171
|
+
(has_graph? ? graph_name.resource? : true ))
|
141
172
|
end
|
142
173
|
|
143
174
|
##
|
@@ -152,7 +183,7 @@ module RDF
|
|
152
183
|
has_subject? && subject.resource? && subject.valid? &&
|
153
184
|
has_predicate? && predicate.uri? && predicate.valid? &&
|
154
185
|
has_object? && object.term? && object.valid? &&
|
155
|
-
(
|
186
|
+
(has_graph? ? graph_name.resource? && graph_name.valid? : true )
|
156
187
|
end
|
157
188
|
|
158
189
|
##
|
@@ -173,16 +204,37 @@ module RDF
|
|
173
204
|
false
|
174
205
|
end
|
175
206
|
|
207
|
+
##
|
208
|
+
# Determines if the statement is incomplete, vs. invalid. An incomplete statement is one in which any of `subject`, `predicate`, or `object`, are nil.
|
209
|
+
#
|
210
|
+
# @return [Boolean]
|
211
|
+
# @since 3.0
|
212
|
+
def incomplete?
|
213
|
+
to_triple.any?(&:nil?)
|
214
|
+
end
|
215
|
+
|
216
|
+
##
|
217
|
+
# Determines if the statement is complete, vs. invalid. A complete statement is one in which none of `subject`, `predicate`, or `object`, are nil.
|
218
|
+
#
|
219
|
+
# @return [Boolean]
|
220
|
+
# @since 3.0
|
221
|
+
def complete?
|
222
|
+
!incomplete?
|
223
|
+
end
|
224
|
+
|
176
225
|
##
|
177
226
|
# @return [Boolean]
|
178
227
|
def has_graph?
|
179
|
-
|
228
|
+
!!graph_name
|
180
229
|
end
|
230
|
+
alias_method :has_name?, :has_graph?
|
181
231
|
|
182
232
|
##
|
183
233
|
# @return [Boolean]
|
234
|
+
# @deprecated Use {#has_graph?} instead.
|
184
235
|
def has_context?
|
185
|
-
|
236
|
+
warn "[DEPRECATION] Statement#has_context? is being replaced with Statement#has_grap in RDF.rb 2.0. Called from #{Gem.location_of_caller.join(':')}"
|
237
|
+
!!context
|
186
238
|
end
|
187
239
|
|
188
240
|
##
|
@@ -207,15 +259,17 @@ module RDF
|
|
207
259
|
# Returns `true` if any resource of this statement is a blank node.
|
208
260
|
#
|
209
261
|
# @return [Boolean]
|
210
|
-
|
262
|
+
# @since 2.0
|
263
|
+
def node?
|
211
264
|
to_quad.compact.any?(&:node?)
|
212
265
|
end
|
266
|
+
alias_method :has_blank_nodes?, :node?
|
213
267
|
|
214
268
|
##
|
215
269
|
# @param [Statement] other
|
216
270
|
# @return [Boolean]
|
217
271
|
def eql?(other)
|
218
|
-
other.is_a?(Statement) && self == other && (self.
|
272
|
+
other.is_a?(Statement) && self == other && (self.graph_name || false) == (other.graph_name || false)
|
219
273
|
end
|
220
274
|
|
221
275
|
##
|
@@ -229,10 +283,10 @@ module RDF
|
|
229
283
|
# @param [Statement] other
|
230
284
|
# @return [Boolean]
|
231
285
|
def ===(other)
|
232
|
-
return false if has_context? && !context.eql?(other.context)
|
233
|
-
return false if has_subject? && !subject.eql?(other.subject)
|
234
|
-
return false if has_predicate? && !predicate.eql?(other.predicate)
|
235
286
|
return false if has_object? && !object.eql?(other.object)
|
287
|
+
return false if has_predicate? && !predicate.eql?(other.predicate)
|
288
|
+
return false if has_subject? && !subject.eql?(other.subject)
|
289
|
+
return false if has_graph? && !graph_name.eql?(other.graph_name)
|
236
290
|
return true
|
237
291
|
end
|
238
292
|
|
@@ -244,7 +298,7 @@ module RDF
|
|
244
298
|
when 0 then self.subject
|
245
299
|
when 1 then self.predicate
|
246
300
|
when 2 then self.object
|
247
|
-
when 3 then self.
|
301
|
+
when 3 then self.graph_name
|
248
302
|
else nil
|
249
303
|
end
|
250
304
|
end
|
@@ -258,7 +312,7 @@ module RDF
|
|
258
312
|
when 0 then self.subject = value
|
259
313
|
when 1 then self.predicate = value
|
260
314
|
when 2 then self.object = value
|
261
|
-
when 3 then self.
|
315
|
+
when 3 then self.graph_name = value
|
262
316
|
else nil
|
263
317
|
end
|
264
318
|
end
|
@@ -266,7 +320,7 @@ module RDF
|
|
266
320
|
##
|
267
321
|
# @return [Array(RDF::Term)]
|
268
322
|
def to_quad
|
269
|
-
[subject, predicate, object,
|
323
|
+
[subject, predicate, object, graph_name]
|
270
324
|
end
|
271
325
|
|
272
326
|
##
|
@@ -288,7 +342,7 @@ module RDF
|
|
288
342
|
self.subject.canonicalize! if has_subject? && !self.subject.frozen?
|
289
343
|
self.predicate.canonicalize! if has_predicate? && !self.predicate.frozen?
|
290
344
|
self.object.canonicalize! if has_object? && !self.object.frozen?
|
291
|
-
self.
|
345
|
+
self.graph_name.canonicalize! if has_graph? && !self.graph_name.frozen?
|
292
346
|
self.validate!
|
293
347
|
self
|
294
348
|
end
|
@@ -311,8 +365,8 @@ module RDF
|
|
311
365
|
# @param [Symbol] predicate_key
|
312
366
|
# @param [Symbol] object_key
|
313
367
|
# @return [Hash{Symbol => RDF::Term}]
|
314
|
-
def to_hash(subject_key = :subject, predicate_key = :predicate, object_key = :object,
|
315
|
-
{subject_key => subject, predicate_key => predicate, object_key => object,
|
368
|
+
def to_hash(subject_key = :subject, predicate_key = :predicate, object_key = :object, graph_key = :graph_name)
|
369
|
+
{subject_key => subject, predicate_key => predicate, object_key => object, graph_key => graph_name}
|
316
370
|
end
|
317
371
|
|
318
372
|
##
|
@@ -320,7 +374,7 @@ module RDF
|
|
320
374
|
#
|
321
375
|
# @return [String]
|
322
376
|
def to_s
|
323
|
-
(
|
377
|
+
(graph_name ? to_quad : to_triple).map do |term|
|
324
378
|
term.respond_to?(:to_base) ? term.to_base : term.inspect
|
325
379
|
end.join(" ") + " ."
|
326
380
|
end
|
@@ -332,7 +386,11 @@ module RDF
|
|
332
386
|
# @return [RDF::Graph]
|
333
387
|
# @see http://www.w3.org/TR/rdf-primer/#reification
|
334
388
|
def reified(options = {})
|
335
|
-
|
389
|
+
if options.has_key?(:context)
|
390
|
+
warn "[DEPRECATION] the :contexts option to Mutable#load is deprecated in RDF.rb 2.0, use :graph_name instead. Called from #{Gem.location_of_caller.join(':')}"
|
391
|
+
options[:graph_name] ||= options.delete(:context)
|
392
|
+
end
|
393
|
+
RDF::Graph.new(options[:graph_name]) do |graph|
|
336
394
|
subject = options[:subject] || RDF::Node.new(options[:id])
|
337
395
|
graph << [subject, RDF.type, RDF[:Statement]]
|
338
396
|
graph << [subject, RDF.subject, self.subject]
|
data/lib/rdf/model/term.rb
CHANGED
@@ -2,7 +2,7 @@ module RDF
|
|
2
2
|
##
|
3
3
|
# An RDF term.
|
4
4
|
#
|
5
|
-
# Terms can be used as subjects, predicates, objects, and
|
5
|
+
# Terms can be used as subjects, predicates, objects, and graph names of
|
6
6
|
# statements.
|
7
7
|
#
|
8
8
|
# @since 0.3.0
|
@@ -80,6 +80,15 @@ module RDF
|
|
80
80
|
self
|
81
81
|
end
|
82
82
|
|
83
|
+
##
|
84
|
+
# Term compatibility according to SPARQL
|
85
|
+
#
|
86
|
+
# @see http://www.w3.org/TR/sparql11-query/#func-arg-compatibility
|
87
|
+
# @since 2.0
|
88
|
+
def compatible?(other)
|
89
|
+
false
|
90
|
+
end
|
91
|
+
|
83
92
|
protected
|
84
93
|
##
|
85
94
|
# Escape a term using standard character escapes
|
data/lib/rdf/model/uri.rb
CHANGED
@@ -10,7 +10,7 @@ module RDF
|
|
10
10
|
# uri = RDF::URI.new("http://rubygems.org/gems/rdf")
|
11
11
|
#
|
12
12
|
# @example Creating a URI reference (2)
|
13
|
-
# uri = RDF::URI.new(:
|
13
|
+
# uri = RDF::URI.new(scheme: 'http', host: 'rubygems.org', path: '/rdf')
|
14
14
|
# #=> RDF::URI.new("http://rubygems.org/gems/rdf")
|
15
15
|
#
|
16
16
|
# @example Creating an interned URI reference
|
@@ -377,11 +377,11 @@ module RDF
|
|
377
377
|
# @since 0.3.0
|
378
378
|
def canonicalize!
|
379
379
|
@object = {
|
380
|
-
:
|
381
|
-
:
|
382
|
-
:
|
383
|
-
:
|
384
|
-
:
|
380
|
+
scheme: normalized_scheme,
|
381
|
+
authority: normalized_authority,
|
382
|
+
path: normalized_path.sub(/\/+/, '/'),
|
383
|
+
query: normalized_query,
|
384
|
+
fragment: normalized_fragment
|
385
385
|
}
|
386
386
|
@value = nil
|
387
387
|
self
|
@@ -421,7 +421,7 @@ module RDF
|
|
421
421
|
|
422
422
|
case
|
423
423
|
when uri.scheme
|
424
|
-
joined_parts = uri.object.merge(:
|
424
|
+
joined_parts = uri.object.merge(path: self.class.normalize_path(uri.path))
|
425
425
|
when uri.authority
|
426
426
|
joined_parts[:authority] = uri.authority
|
427
427
|
joined_parts[:path] = self.class.normalize_path(uri.path)
|
@@ -572,7 +572,7 @@ module RDF
|
|
572
572
|
self
|
573
573
|
else
|
574
574
|
RDF::URI.new(
|
575
|
-
object.merge(:
|
575
|
+
object.merge(path: '/').
|
576
576
|
keep_if {|k, v| [:scheme, :authority, :path].include?(k)})
|
577
577
|
end
|
578
578
|
end
|
@@ -616,9 +616,9 @@ module RDF
|
|
616
616
|
# Returns a qualified name (QName) for this URI based on available vocabularies, if possible.
|
617
617
|
#
|
618
618
|
# @example
|
619
|
-
# RDF::URI('http://
|
620
|
-
# RDF::URI('http://
|
621
|
-
# RDF::
|
619
|
+
# RDF::URI('http://www.w3.org/2000/01/rdf-schema#').qname #=> [:rdfs, nil]
|
620
|
+
# RDF::URI('http://www.w3.org/2000/01/rdf-schema#label').qname #=> [:rdfs, :label]
|
621
|
+
# RDF::RDFS.label.qname #=> [:rdfs, :label]
|
622
622
|
#
|
623
623
|
# @return [Array(Symbol, Symbol)] or `nil` if no QName found
|
624
624
|
def qname
|
@@ -710,9 +710,9 @@ module RDF
|
|
710
710
|
# Checks whether this URI the same term as `other`.
|
711
711
|
#
|
712
712
|
# @example
|
713
|
-
# RDF::URI('http://t.co/').eql?(RDF::URI('http://t.co/'))
|
714
|
-
# RDF::URI('http://t.co/').eql?('http://t.co/')
|
715
|
-
# RDF::URI('http://
|
713
|
+
# RDF::URI('http://t.co/').eql?(RDF::URI('http://t.co/')) #=> true
|
714
|
+
# RDF::URI('http://t.co/').eql?('http://t.co/') #=> false
|
715
|
+
# RDF::URI('http://www.w3.org/2000/01/rdf-schema#').eql?(RDF::RDFS) #=> false
|
716
716
|
#
|
717
717
|
# @param [RDF::URI] other
|
718
718
|
# @return [Boolean] `true` or `false`
|
@@ -728,7 +728,7 @@ module RDF
|
|
728
728
|
# @example
|
729
729
|
# RDF::URI('http://t.co/') == RDF::URI('http://t.co/') #=> true
|
730
730
|
# RDF::URI('http://t.co/') == 'http://t.co/' #=> true
|
731
|
-
# RDF::URI('http://
|
731
|
+
# RDF::URI('http://www.w3.org/2000/01/rdf-schema#') == RDF::RDFS #=> true
|
732
732
|
#
|
733
733
|
# @param [Object] other
|
734
734
|
# @return [Boolean] `true` or `false`
|
@@ -752,7 +752,7 @@ module RDF
|
|
752
752
|
# RDF::URI('http://example.org/') === /foobar/ #=> false
|
753
753
|
# RDF::URI('http://t.co/') === RDF::URI('http://t.co/') #=> true
|
754
754
|
# RDF::URI('http://t.co/') === 'http://t.co/' #=> true
|
755
|
-
# RDF::URI('http://
|
755
|
+
# RDF::URI('http://www.w3.org/2000/01/rdf-schema#') === RDF::RDFS #=> true
|
756
756
|
#
|
757
757
|
# @param [Object] other
|
758
758
|
# @return [Boolean] `true` or `false`
|
@@ -834,7 +834,7 @@ module RDF
|
|
834
834
|
#
|
835
835
|
# @return [Fixnum]
|
836
836
|
def hash
|
837
|
-
|
837
|
+
@hash ||= (value.hash * -1)
|
838
838
|
end
|
839
839
|
|
840
840
|
##
|
@@ -842,9 +842,7 @@ module RDF
|
|
842
842
|
#
|
843
843
|
# @return [Hash{Symbol => String}]
|
844
844
|
def object
|
845
|
-
@object ||=
|
846
|
-
parse @value
|
847
|
-
end
|
845
|
+
@object ||= parse(@value)
|
848
846
|
end
|
849
847
|
alias_method :to_hash, :object
|
850
848
|
|
@@ -1045,18 +1043,19 @@ module RDF
|
|
1045
1043
|
when authority
|
1046
1044
|
# ipath-abempty
|
1047
1045
|
segments.map {|s| normalize_segment(s, ISEGMENT)}
|
1048
|
-
when segments.
|
1046
|
+
when segments[0].nil?
|
1049
1047
|
# ipath-absolute
|
1050
1048
|
res = [nil]
|
1051
1049
|
res << normalize_segment(segments[1], ISEGMENT_NZ) if segments.length > 1
|
1052
1050
|
res += segments[2..-1].map {|s| normalize_segment(s, ISEGMENT)} if segments.length > 2
|
1053
1051
|
res
|
1054
|
-
when segments.
|
1052
|
+
when segments[0].to_s.index(':')
|
1055
1053
|
# ipath-noscheme
|
1056
1054
|
res = []
|
1057
|
-
res << normalize_segment(segments[
|
1055
|
+
res << normalize_segment(segments[0], ISEGMENT_NZ_NC)
|
1058
1056
|
res += segments[1..-1].map {|s| normalize_segment(s, ISEGMENT)} if segments.length > 1
|
1059
|
-
|
1057
|
+
res
|
1058
|
+
when segments[0]
|
1060
1059
|
# ipath-rootless
|
1061
1060
|
# ipath-noscheme
|
1062
1061
|
res = []
|
@@ -1218,7 +1217,7 @@ module RDF
|
|
1218
1217
|
# An empty Hash or Array will result in an empty query string.
|
1219
1218
|
#
|
1220
1219
|
# @example
|
1221
|
-
# uri.query_values = {:
|
1220
|
+
# uri.query_values = {a: "a", b: ["c", "d", "e"]}
|
1222
1221
|
# uri.query
|
1223
1222
|
# # => "a=a&b=c&b=d&b=e"
|
1224
1223
|
# uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']]
|
data/lib/rdf/nquads.rb
CHANGED
@@ -13,15 +13,14 @@ module RDF
|
|
13
13
|
# @example Obtaining an NQuads format class
|
14
14
|
# RDF::Format.for(:nquads) #=> RDF::NQuads::Format
|
15
15
|
# RDF::Format.for("etc/doap.nq")
|
16
|
-
# RDF::Format.for(:
|
17
|
-
# RDF::Format.for(:
|
18
|
-
# RDF::Format.for(:
|
19
|
-
# RDF::Format.for(:content_type => "text/x-nquads")
|
16
|
+
# RDF::Format.for(file_name: "etc/doap.nq")
|
17
|
+
# RDF::Format.for(file_extension: "nq")
|
18
|
+
# RDF::Format.for(content_type: "application/n-quads")
|
20
19
|
#
|
21
20
|
# @see http://www.w3.org/TR/n-quads/
|
22
21
|
# @since 0.4.0
|
23
22
|
class Format < RDF::Format
|
24
|
-
content_type 'application/n-quads', :
|
23
|
+
content_type 'application/n-quads', extension: :nq, alias: ['text/x-nquads']
|
25
24
|
content_encoding 'utf-8'
|
26
25
|
|
27
26
|
reader { RDF::NQuads::Reader }
|
@@ -58,15 +57,7 @@ module RDF
|
|
58
57
|
|
59
58
|
class Reader < NTriples::Reader
|
60
59
|
##
|
61
|
-
#
|
62
|
-
# @return [RDF::Term]
|
63
|
-
# @since 0.4.0
|
64
|
-
def self.parse_context(input)
|
65
|
-
parse_uri(input) || parse_node(input) || parse_literal(input)
|
66
|
-
end
|
67
|
-
|
68
|
-
##
|
69
|
-
# Read a Quad, where the context is optional
|
60
|
+
# Read a Quad, where the graph_name is optional
|
70
61
|
#
|
71
62
|
# @return [Array]
|
72
63
|
# @see http://sw.deri.org/2008/07/n-quads/#grammar
|
@@ -79,13 +70,13 @@ module RDF
|
|
79
70
|
begin
|
80
71
|
unless blank? || read_comment
|
81
72
|
subject = read_uriref || read_node || fail_subject
|
82
|
-
predicate = read_uriref(:
|
73
|
+
predicate = read_uriref(intern: true) || fail_predicate
|
83
74
|
object = read_uriref || read_node || read_literal || fail_object
|
84
|
-
|
75
|
+
graph_name = read_uriref || read_node
|
85
76
|
if validate? && !read_eos
|
86
77
|
raise RDF::ReaderError.new("ERROR [line #{lineno}] Expected end of statement (found: #{current_line.inspect})")
|
87
78
|
end
|
88
|
-
return [subject, predicate, object, {:
|
79
|
+
return [subject, predicate, object, {graph_name: graph_name}]
|
89
80
|
end
|
90
81
|
rescue RDF::ReaderError => e
|
91
82
|
@line = line # this allows #read_value to work
|
@@ -113,8 +104,8 @@ module RDF
|
|
113
104
|
# @param [RDF::URI] predicate
|
114
105
|
# @param [RDF::Term] object
|
115
106
|
# @return [void]
|
116
|
-
def write_quad(subject, predicate, object,
|
117
|
-
puts format_quad(subject, predicate, object,
|
107
|
+
def write_quad(subject, predicate, object, graph_name)
|
108
|
+
puts format_quad(subject, predicate, object, graph_name, @options)
|
118
109
|
end
|
119
110
|
|
120
111
|
##
|
@@ -134,12 +125,12 @@ module RDF
|
|
134
125
|
# @param [RDF::Resource] subject
|
135
126
|
# @param [RDF::URI] predicate
|
136
127
|
# @param [RDF::Term] object
|
137
|
-
# @param [RDF::Term]
|
128
|
+
# @param [RDF::Term] graph_name
|
138
129
|
# @param [Hash{Symbol => Object}] options = ({})
|
139
130
|
# @return [String]
|
140
|
-
def format_quad(subject, predicate, object,
|
131
|
+
def format_quad(subject, predicate, object, graph_name, options = {})
|
141
132
|
s = "%s %s %s " % [subject, predicate, object].map { |value| format_term(value, options) }
|
142
|
-
s += format_term(
|
133
|
+
s += format_term(graph_name, options) + " " if graph_name
|
143
134
|
s + "."
|
144
135
|
end
|
145
136
|
end # Writer
|
data/lib/rdf/ntriples/format.rb
CHANGED
@@ -9,15 +9,14 @@ module RDF::NTriples
|
|
9
9
|
# @example Obtaining an NTriples format class
|
10
10
|
# RDF::Format.for(:ntriples) #=> RDF::NTriples::Format
|
11
11
|
# RDF::Format.for("etc/doap.nt")
|
12
|
-
# RDF::Format.for(:
|
13
|
-
# RDF::Format.for(:
|
14
|
-
# RDF::Format.for(:
|
15
|
-
# RDF::Format.for(:content_type => "text/plain")
|
12
|
+
# RDF::Format.for(file_name: "etc/doap.nt")
|
13
|
+
# RDF::Format.for(file_extension: "nt")
|
14
|
+
# RDF::Format.for(content_type: "application/n-triples")
|
16
15
|
#
|
17
16
|
# @see http://www.w3.org/TR/rdf-testcases/#ntriples
|
18
17
|
# @see http://www.w3.org/TR/n-triples/
|
19
18
|
class Format < RDF::Format
|
20
|
-
content_type 'application/n-triples', :
|
19
|
+
content_type 'application/n-triples', extension: :nt, alias: ['text/plain']
|
21
20
|
content_encoding 'utf-8'
|
22
21
|
|
23
22
|
reader { RDF::NTriples::Reader }
|
data/lib/rdf/ntriples/reader.rb
CHANGED
@@ -6,9 +6,9 @@ module RDF::NTriples
|
|
6
6
|
# @example Obtaining an NTriples reader class
|
7
7
|
# RDF::Reader.for(:ntriples) #=> RDF::NTriples::Reader
|
8
8
|
# RDF::Reader.for("etc/doap.nt")
|
9
|
-
# RDF::Reader.for(:
|
10
|
-
# RDF::Reader.for(:
|
11
|
-
# RDF::Reader.for(:
|
9
|
+
# RDF::Reader.for(file_name: "etc/doap.nt")
|
10
|
+
# RDF::Reader.for(file_extension: "nt")
|
11
|
+
# RDF::Reader.for(content_type: "application/n-triples")
|
12
12
|
#
|
13
13
|
# @example Parsing RDF statements from an NTriples file
|
14
14
|
# RDF::NTriples::Reader.open("etc/doap.nt") do |reader|
|
@@ -110,7 +110,7 @@ module RDF::NTriples
|
|
110
110
|
# @param [String] input
|
111
111
|
# @return [RDF::URI]
|
112
112
|
def self.parse_predicate(input)
|
113
|
-
parse_uri(input, :
|
113
|
+
parse_uri(input, intern: true)
|
114
114
|
end
|
115
115
|
|
116
116
|
##
|
@@ -144,9 +144,9 @@ module RDF::NTriples
|
|
144
144
|
def self.parse_literal(input)
|
145
145
|
case input
|
146
146
|
when LITERAL_WITH_LANGUAGE
|
147
|
-
RDF::Literal.new(unescape($1), :
|
147
|
+
RDF::Literal.new(unescape($1), language: $4)
|
148
148
|
when LITERAL_WITH_DATATYPE
|
149
|
-
RDF::Literal.new(unescape($1), :
|
149
|
+
RDF::Literal.new(unescape($1), datatype: $4)
|
150
150
|
when LITERAL_PLAIN
|
151
151
|
RDF::Literal.new(unescape($1))
|
152
152
|
end
|
@@ -169,7 +169,7 @@ module RDF::NTriples
|
|
169
169
|
while
|
170
170
|
(string.sub!(ESCAPE_SURROGATE) do
|
171
171
|
if ESCAPE_SURROGATE1.include?($1.hex) && ESCAPE_SURROGATE2.include?($2.hex)
|
172
|
-
warn "[DEPRECATION] Surrogate pairs support deprecated. Support will be removed in
|
172
|
+
warn "[DEPRECATION] Surrogate pairs support deprecated. Support will be removed in RDF.rb 2.0. Called from #{Gem.location_of_caller.join(':')}"
|
173
173
|
s = [$1, $2].pack('H*H*')
|
174
174
|
s.force_encoding(Encoding::UTF_16BE).encode!(Encoding::UTF_8)
|
175
175
|
else
|
@@ -207,7 +207,7 @@ module RDF::NTriples
|
|
207
207
|
begin
|
208
208
|
unless blank? || read_comment
|
209
209
|
subject = read_uriref || read_node || fail_subject
|
210
|
-
predicate = read_uriref(:
|
210
|
+
predicate = read_uriref(intern: true) || fail_predicate
|
211
211
|
object = read_uriref || read_node || read_literal || fail_object
|
212
212
|
|
213
213
|
if validate? && !read_eos
|
@@ -263,9 +263,9 @@ module RDF::NTriples
|
|
263
263
|
literal_str = self.class.unescape(literal_str)
|
264
264
|
literal = case
|
265
265
|
when language = match(LANGTAG)
|
266
|
-
RDF::Literal.new(literal_str, :
|
266
|
+
RDF::Literal.new(literal_str, language: language)
|
267
267
|
when datatype = match(/^(\^\^)/) # FIXME
|
268
|
-
RDF::Literal.new(literal_str, :
|
268
|
+
RDF::Literal.new(literal_str, datatype: read_uriref || fail_object)
|
269
269
|
else
|
270
270
|
RDF::Literal.new(literal_str) # plain string literal
|
271
271
|
end
|
data/lib/rdf/ntriples/writer.rb
CHANGED
@@ -4,15 +4,15 @@ module RDF::NTriples
|
|
4
4
|
# N-Triples serializer.
|
5
5
|
#
|
6
6
|
# Output is serialized for UTF-8, to serialize as ASCII
|
7
|
-
# (with) unicode escapes, set :
|
7
|
+
# (with) unicode escapes, set encoding: Encoding::ASCII as
|
8
8
|
# an option to {RDF::NTriples::Writer#initialize}.
|
9
9
|
#
|
10
10
|
# @example Obtaining an NTriples writer class
|
11
11
|
# RDF::Writer.for(:ntriples) #=> RDF::NTriples::Writer
|
12
12
|
# RDF::Writer.for("etc/test.nt")
|
13
|
-
# RDF::Writer.for(:
|
14
|
-
# RDF::Writer.for(:
|
15
|
-
# RDF::Writer.for(:
|
13
|
+
# RDF::Writer.for(file_name: "etc/test.nt")
|
14
|
+
# RDF::Writer.for(file_extension: "nt")
|
15
|
+
# RDF::Writer.for(content_type: "application/n-triples")
|
16
16
|
#
|
17
17
|
# @example Serializing RDF statements into an NTriples file
|
18
18
|
# RDF::NTriples::Writer.open("etc/test.nt") do |writer|
|
@@ -29,7 +29,7 @@ module RDF::NTriples
|
|
29
29
|
# end
|
30
30
|
#
|
31
31
|
# @example Serializing RDF statements into an NTriples string with escaped UTF-8
|
32
|
-
# RDF::NTriples::Writer.buffer(:
|
32
|
+
# RDF::NTriples::Writer.buffer(encoding: Encoding::ASCII) do |writer|
|
33
33
|
# graph.each_statement do |statement|
|
34
34
|
# writer << statement
|
35
35
|
# end
|
@@ -187,7 +187,7 @@ module RDF::NTriples
|
|
187
187
|
# @yieldparam [RDF::Writer] writer
|
188
188
|
# @yieldreturn [void]
|
189
189
|
def initialize(output = $stdout, options = {}, &block)
|
190
|
-
options = {:
|
190
|
+
options = {validate: true}.merge(options)
|
191
191
|
super
|
192
192
|
end
|
193
193
|
|