openlogic-rdf 0.3.6
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.
- data/AUTHORS +3 -0
- data/CREDITS +9 -0
- data/README +361 -0
- data/UNLICENSE +24 -0
- data/VERSION +1 -0
- data/bin/rdf +18 -0
- data/etc/doap.nt +62 -0
- data/lib/df.rb +1 -0
- data/lib/rdf/cli.rb +200 -0
- data/lib/rdf/format.rb +383 -0
- data/lib/rdf/mixin/countable.rb +39 -0
- data/lib/rdf/mixin/durable.rb +31 -0
- data/lib/rdf/mixin/enumerable.rb +637 -0
- data/lib/rdf/mixin/indexable.rb +26 -0
- data/lib/rdf/mixin/inferable.rb +5 -0
- data/lib/rdf/mixin/mutable.rb +191 -0
- data/lib/rdf/mixin/queryable.rb +265 -0
- data/lib/rdf/mixin/readable.rb +15 -0
- data/lib/rdf/mixin/type_check.rb +21 -0
- data/lib/rdf/mixin/writable.rb +152 -0
- data/lib/rdf/model/graph.rb +263 -0
- data/lib/rdf/model/list.rb +731 -0
- data/lib/rdf/model/literal/boolean.rb +121 -0
- data/lib/rdf/model/literal/date.rb +73 -0
- data/lib/rdf/model/literal/datetime.rb +72 -0
- data/lib/rdf/model/literal/decimal.rb +86 -0
- data/lib/rdf/model/literal/double.rb +189 -0
- data/lib/rdf/model/literal/integer.rb +126 -0
- data/lib/rdf/model/literal/numeric.rb +184 -0
- data/lib/rdf/model/literal/time.rb +87 -0
- data/lib/rdf/model/literal/token.rb +47 -0
- data/lib/rdf/model/literal/xml.rb +39 -0
- data/lib/rdf/model/literal.rb +373 -0
- data/lib/rdf/model/node.rb +156 -0
- data/lib/rdf/model/resource.rb +28 -0
- data/lib/rdf/model/statement.rb +296 -0
- data/lib/rdf/model/term.rb +77 -0
- data/lib/rdf/model/uri.rb +570 -0
- data/lib/rdf/model/value.rb +133 -0
- data/lib/rdf/nquads.rb +152 -0
- data/lib/rdf/ntriples/format.rb +48 -0
- data/lib/rdf/ntriples/reader.rb +239 -0
- data/lib/rdf/ntriples/writer.rb +219 -0
- data/lib/rdf/ntriples.rb +104 -0
- data/lib/rdf/query/pattern.rb +329 -0
- data/lib/rdf/query/solution.rb +252 -0
- data/lib/rdf/query/solutions.rb +237 -0
- data/lib/rdf/query/variable.rb +221 -0
- data/lib/rdf/query.rb +404 -0
- data/lib/rdf/reader.rb +511 -0
- data/lib/rdf/repository.rb +389 -0
- data/lib/rdf/transaction.rb +161 -0
- data/lib/rdf/util/aliasing.rb +63 -0
- data/lib/rdf/util/cache.rb +139 -0
- data/lib/rdf/util/file.rb +38 -0
- data/lib/rdf/util/uuid.rb +36 -0
- data/lib/rdf/util.rb +6 -0
- data/lib/rdf/version.rb +19 -0
- data/lib/rdf/vocab/cc.rb +18 -0
- data/lib/rdf/vocab/cert.rb +13 -0
- data/lib/rdf/vocab/dc.rb +63 -0
- data/lib/rdf/vocab/dc11.rb +23 -0
- data/lib/rdf/vocab/doap.rb +45 -0
- data/lib/rdf/vocab/exif.rb +168 -0
- data/lib/rdf/vocab/foaf.rb +69 -0
- data/lib/rdf/vocab/geo.rb +13 -0
- data/lib/rdf/vocab/http.rb +26 -0
- data/lib/rdf/vocab/owl.rb +59 -0
- data/lib/rdf/vocab/rdfs.rb +17 -0
- data/lib/rdf/vocab/rsa.rb +12 -0
- data/lib/rdf/vocab/rss.rb +14 -0
- data/lib/rdf/vocab/sioc.rb +93 -0
- data/lib/rdf/vocab/skos.rb +36 -0
- data/lib/rdf/vocab/wot.rb +21 -0
- data/lib/rdf/vocab/xhtml.rb +9 -0
- data/lib/rdf/vocab/xsd.rb +58 -0
- data/lib/rdf/vocab.rb +215 -0
- data/lib/rdf/writer.rb +475 -0
- data/lib/rdf.rb +192 -0
- metadata +173 -0
data/lib/rdf/writer.rb
ADDED
@@ -0,0 +1,475 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# The base class for RDF serializers.
|
4
|
+
#
|
5
|
+
# @example Loading an RDF writer implementation
|
6
|
+
# require 'rdf/ntriples'
|
7
|
+
#
|
8
|
+
# @example Iterating over known RDF writer classes
|
9
|
+
# RDF::Writer.each { |klass| puts klass.name }
|
10
|
+
#
|
11
|
+
# @example Obtaining an RDF writer class
|
12
|
+
# RDF::Writer.for(:ntriples) #=> RDF::NTriples::Writer
|
13
|
+
# RDF::Writer.for("spec/data/output.nt")
|
14
|
+
# RDF::Writer.for(:file_name => "spec/data/output.nt")
|
15
|
+
# RDF::Writer.for(:file_extension => "nt")
|
16
|
+
# RDF::Writer.for(:content_type => "text/plain")
|
17
|
+
#
|
18
|
+
# @example Instantiating an RDF writer class
|
19
|
+
# RDF::Writer.for(:ntriples).new($stdout) { |writer| ... }
|
20
|
+
#
|
21
|
+
# @example Serializing RDF statements into a file
|
22
|
+
# RDF::Writer.open("spec/data/output.nt") do |writer|
|
23
|
+
# graph.each_statement do |statement|
|
24
|
+
# writer << statement
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# @example Serializing RDF statements into a string
|
29
|
+
# RDF::Writer.for(:ntriples).buffer do |writer|
|
30
|
+
# graph.each_statement do |statement|
|
31
|
+
# writer << statement
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# @abstract
|
36
|
+
# @see RDF::Format
|
37
|
+
# @see RDF::Reader
|
38
|
+
class Writer
|
39
|
+
extend ::Enumerable
|
40
|
+
extend RDF::Util::Aliasing::LateBound
|
41
|
+
include RDF::Writable
|
42
|
+
|
43
|
+
##
|
44
|
+
# Enumerates known RDF writer classes.
|
45
|
+
#
|
46
|
+
# @yield [klass]
|
47
|
+
# @yieldparam [Class] klass
|
48
|
+
# @yieldreturn [void] ignored
|
49
|
+
# @return [Enumerator]
|
50
|
+
def self.each(&block)
|
51
|
+
@@subclasses.each(&block)
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# Finds an RDF writer class based on the given criteria.
|
56
|
+
#
|
57
|
+
# @overload for(format)
|
58
|
+
# Finds an RDF writer class based on a symbolic name.
|
59
|
+
#
|
60
|
+
# @param [Symbol] format
|
61
|
+
# @return [Class]
|
62
|
+
#
|
63
|
+
# @overload for(filename)
|
64
|
+
# Finds an RDF writer class based on a file name.
|
65
|
+
#
|
66
|
+
# @param [String] filename
|
67
|
+
# @return [Class]
|
68
|
+
#
|
69
|
+
# @overload for(options = {})
|
70
|
+
# Finds an RDF writer class based on various options.
|
71
|
+
#
|
72
|
+
# @param [Hash{Symbol => Object}] options
|
73
|
+
# @option options [String, #to_s] :file_name (nil)
|
74
|
+
# @option options [Symbol, #to_sym] :file_extension (nil)
|
75
|
+
# @option options [String, #to_s] :content_type (nil)
|
76
|
+
# @return [Class]
|
77
|
+
#
|
78
|
+
# @return [Class]
|
79
|
+
def self.for(options = {})
|
80
|
+
options = options.merge(:has_writer => true) if options.is_a?(Hash)
|
81
|
+
if format = self.format || Format.for(options)
|
82
|
+
format.writer
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# Retrieves the RDF serialization format class for this writer class.
|
88
|
+
#
|
89
|
+
# @return [Class]
|
90
|
+
def self.format(klass = nil)
|
91
|
+
if klass.nil?
|
92
|
+
Format.each do |format|
|
93
|
+
if format.writer == self
|
94
|
+
return format
|
95
|
+
end
|
96
|
+
end
|
97
|
+
nil # not found
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class << self
|
102
|
+
alias_method :format_class, :format
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# @param [RDF::Enumerable, #each] data
|
107
|
+
# the graph or repository to dump
|
108
|
+
# @param [IO, File] io
|
109
|
+
# the output stream or file to write to
|
110
|
+
# @param [Hash{Symbol => Object}] options
|
111
|
+
# passed to {RDF::Writer#initialize} or {RDF::Writer.buffer}
|
112
|
+
# @return [void]
|
113
|
+
def self.dump(data, io = nil, options = {})
|
114
|
+
io = File.open(io, 'w') if io.is_a?(String)
|
115
|
+
method = data.respond_to?(:each_statement) ? :each_statement : :each
|
116
|
+
if io
|
117
|
+
new(io, options) do |writer|
|
118
|
+
data.send(method) do |statement|
|
119
|
+
writer << statement
|
120
|
+
end
|
121
|
+
writer.flush
|
122
|
+
end
|
123
|
+
else
|
124
|
+
buffer(options) do |writer|
|
125
|
+
data.send(method) do |statement|
|
126
|
+
writer << statement
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# Buffers output into a string buffer.
|
134
|
+
#
|
135
|
+
# @yield [writer]
|
136
|
+
# @yieldparam [RDF::Writer] writer
|
137
|
+
# @yieldreturn [void]
|
138
|
+
# @return [String]
|
139
|
+
def self.buffer(*args, &block)
|
140
|
+
StringIO.open do |buffer|
|
141
|
+
self.new(buffer, *args) { |writer| block.call(writer) }
|
142
|
+
buffer.string
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
##
|
147
|
+
# Writes output to the given `filename`.
|
148
|
+
#
|
149
|
+
# @param [String, #to_s] filename
|
150
|
+
# @param [Hash{Symbol => Object}] options
|
151
|
+
# any additional options (see {RDF::Writer#initialize} and {RDF::Format.for})
|
152
|
+
# @option options [Symbol] :format (nil)
|
153
|
+
# @return [RDF::Writer]
|
154
|
+
def self.open(filename, options = {}, &block)
|
155
|
+
File.open(filename, 'wb') do |file|
|
156
|
+
format_options = options.dup
|
157
|
+
format_options[:file_name] ||= filename
|
158
|
+
self.for(options[:format] || format_options).new(file, options, &block)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# Returns a symbol appropriate to use with RDF::Writer.for()
|
164
|
+
# @return [Symbol]
|
165
|
+
def self.to_sym
|
166
|
+
elements = self.to_s.split("::")
|
167
|
+
sym = elements.pop
|
168
|
+
sym = elements.pop if sym == 'Writer'
|
169
|
+
sym.downcase.to_s.to_sym
|
170
|
+
end
|
171
|
+
|
172
|
+
##
|
173
|
+
# Returns a symbol appropriate to use with RDF::Writer.for()
|
174
|
+
# @return [Symbol]
|
175
|
+
def to_sym
|
176
|
+
self.class.to_sym
|
177
|
+
end
|
178
|
+
|
179
|
+
##
|
180
|
+
# Initializes the writer.
|
181
|
+
#
|
182
|
+
# @param [IO, File] output
|
183
|
+
# the output stream
|
184
|
+
# @param [Hash{Symbol => Object}] options
|
185
|
+
# any additional options
|
186
|
+
# @option options [Encoding] :encoding (Encoding::UTF_8)
|
187
|
+
# the encoding to use on the output stream (Ruby 1.9+)
|
188
|
+
# @option options [Boolean] :canonicalize (false)
|
189
|
+
# whether to canonicalize literals when serializing
|
190
|
+
# @option options [Hash] :prefixes (Hash.new)
|
191
|
+
# the prefix mappings to use (not supported by all writers)
|
192
|
+
# @option options [#to_s] :base_uri (nil)
|
193
|
+
# the base URI to use when constructing relative URIs (not supported
|
194
|
+
# by all writers)
|
195
|
+
# @yield [writer] `self`
|
196
|
+
# @yieldparam [RDF::Writer] writer
|
197
|
+
# @yieldreturn [void]
|
198
|
+
def initialize(output = $stdout, options = {}, &block)
|
199
|
+
@output, @options = output, options.dup
|
200
|
+
@nodes, @node_id = {}, 0
|
201
|
+
|
202
|
+
if block_given?
|
203
|
+
write_prologue
|
204
|
+
case block.arity
|
205
|
+
when 1 then block.call(self)
|
206
|
+
else instance_eval(&block)
|
207
|
+
end
|
208
|
+
write_epilogue
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
##
|
213
|
+
# Any additional options for this writer.
|
214
|
+
#
|
215
|
+
# @return [Hash]
|
216
|
+
# @since 0.2.2
|
217
|
+
attr_reader :options
|
218
|
+
|
219
|
+
##
|
220
|
+
# Returns the base URI used for this writer.
|
221
|
+
#
|
222
|
+
# @example
|
223
|
+
# reader.prefixes[:dc] #=> RDF::URI('http://purl.org/dc/terms/')
|
224
|
+
#
|
225
|
+
# @return [Hash{Symbol => RDF::URI}]
|
226
|
+
# @since 0.3.4
|
227
|
+
def base_uri
|
228
|
+
@options[:base_uri]
|
229
|
+
end
|
230
|
+
|
231
|
+
##
|
232
|
+
# Returns the URI prefixes currently defined for this writer.
|
233
|
+
#
|
234
|
+
# @example
|
235
|
+
# writer.prefixes[:dc] #=> RDF::URI('http://purl.org/dc/terms/')
|
236
|
+
#
|
237
|
+
# @return [Hash{Symbol => RDF::URI}]
|
238
|
+
# @since 0.2.2
|
239
|
+
def prefixes
|
240
|
+
@options[:prefixes] ||= {}
|
241
|
+
end
|
242
|
+
|
243
|
+
##
|
244
|
+
# Defines the given URI prefixes for this writer.
|
245
|
+
#
|
246
|
+
# @example
|
247
|
+
# writer.prefixes = {
|
248
|
+
# :dc => RDF::URI('http://purl.org/dc/terms/'),
|
249
|
+
# }
|
250
|
+
#
|
251
|
+
# @param [Hash{Symbol => RDF::URI}] prefixes
|
252
|
+
# @return [Hash{Symbol => RDF::URI}]
|
253
|
+
# @since 0.3.0
|
254
|
+
def prefixes=(prefixes)
|
255
|
+
@options[:prefixes] = prefixes
|
256
|
+
end
|
257
|
+
|
258
|
+
##
|
259
|
+
# Defines the given named URI prefix for this writer.
|
260
|
+
#
|
261
|
+
# @example Defining a URI prefix
|
262
|
+
# writer.prefix :dc, RDF::URI('http://purl.org/dc/terms/')
|
263
|
+
#
|
264
|
+
# @example Returning a URI prefix
|
265
|
+
# writer.prefix(:dc) #=> RDF::URI('http://purl.org/dc/terms/')
|
266
|
+
#
|
267
|
+
# @overload prefix(name, uri)
|
268
|
+
# @param [Symbol, #to_s] name
|
269
|
+
# @param [RDF::URI, #to_s] uri
|
270
|
+
#
|
271
|
+
# @overload prefix(name)
|
272
|
+
# @param [Symbol, #to_s] name
|
273
|
+
#
|
274
|
+
# @return [RDF::URI]
|
275
|
+
def prefix(name, uri = nil)
|
276
|
+
name = name.to_s.empty? ? nil : (name.respond_to?(:to_sym) ? name.to_sym : name.to_s.to_sym)
|
277
|
+
uri.nil? ? prefixes[name] : prefixes[name] = uri
|
278
|
+
end
|
279
|
+
alias_method :prefix!, :prefix
|
280
|
+
|
281
|
+
##
|
282
|
+
# Flushes the underlying output buffer.
|
283
|
+
#
|
284
|
+
# @return [void] `self`
|
285
|
+
def flush
|
286
|
+
@output.flush if @output.respond_to?(:flush)
|
287
|
+
self
|
288
|
+
end
|
289
|
+
alias_method :flush!, :flush
|
290
|
+
|
291
|
+
##
|
292
|
+
# @return [void] `self`
|
293
|
+
# @abstract
|
294
|
+
def write_prologue
|
295
|
+
self
|
296
|
+
end
|
297
|
+
|
298
|
+
##
|
299
|
+
# @return [void] `self`
|
300
|
+
# @abstract
|
301
|
+
def write_epilogue
|
302
|
+
self
|
303
|
+
end
|
304
|
+
|
305
|
+
##
|
306
|
+
# @param [String] text
|
307
|
+
# @return [void] `self`
|
308
|
+
# @abstract
|
309
|
+
def write_comment(text)
|
310
|
+
self
|
311
|
+
end
|
312
|
+
|
313
|
+
##
|
314
|
+
# @param [RDF::Graph] graph
|
315
|
+
# @return [void] `self`
|
316
|
+
# @deprecated replace by `RDF::Writable#insert_graph`
|
317
|
+
def write_graph(graph)
|
318
|
+
graph.each_triple { |*triple| write_triple(*triple) }
|
319
|
+
self
|
320
|
+
end
|
321
|
+
|
322
|
+
##
|
323
|
+
# @param [Array<RDF::Statement>] statements
|
324
|
+
# @return [void] `self`
|
325
|
+
# @deprecated replace by `RDF::Writable#insert_statements`
|
326
|
+
def write_statements(*statements)
|
327
|
+
statements.flatten.each { |statement| write_statement(statement) }
|
328
|
+
self
|
329
|
+
end
|
330
|
+
|
331
|
+
##
|
332
|
+
# @param [RDF::Statement] statement
|
333
|
+
# @return [void] `self`
|
334
|
+
def write_statement(statement)
|
335
|
+
write_triple(*statement.to_triple)
|
336
|
+
self
|
337
|
+
end
|
338
|
+
alias_method :insert_statement, :write_statement # support the RDF::Writable interface
|
339
|
+
|
340
|
+
##
|
341
|
+
# @param [Array<Array(RDF::Resource, RDF::URI, RDF::Term)>] triples
|
342
|
+
# @return [void] `self`
|
343
|
+
def write_triples(*triples)
|
344
|
+
triples.each { |triple| write_triple(*triple) }
|
345
|
+
self
|
346
|
+
end
|
347
|
+
|
348
|
+
##
|
349
|
+
# @param [RDF::Resource] subject
|
350
|
+
# @param [RDF::URI] predicate
|
351
|
+
# @param [RDF::Term] object
|
352
|
+
# @return [void] `self`
|
353
|
+
# @raise [NotImplementedError] unless implemented in subclass
|
354
|
+
# @abstract
|
355
|
+
def write_triple(subject, predicate, object)
|
356
|
+
raise NotImplementedError.new("#{self.class}#write_triple") # override in subclasses
|
357
|
+
end
|
358
|
+
|
359
|
+
##
|
360
|
+
# @param [RDF::Term] term
|
361
|
+
# @return [String]
|
362
|
+
# @since 0.3.0
|
363
|
+
def format_term(term, options = {})
|
364
|
+
case term
|
365
|
+
when String then format_literal(RDF::Literal(term, options), options)
|
366
|
+
when RDF::List then format_list(term, options)
|
367
|
+
when RDF::Literal then format_literal(term, options)
|
368
|
+
when RDF::URI then format_uri(term, options)
|
369
|
+
when RDF::Node then format_node(term, options)
|
370
|
+
else nil
|
371
|
+
end
|
372
|
+
end
|
373
|
+
alias_method :format_value, :format_term # @deprecated
|
374
|
+
|
375
|
+
##
|
376
|
+
# @param [RDF::Node] value
|
377
|
+
# @param [Hash{Symbol => Object}] options
|
378
|
+
# @return [String]
|
379
|
+
# @raise [NotImplementedError] unless implemented in subclass
|
380
|
+
# @abstract
|
381
|
+
def format_node(value, options = {})
|
382
|
+
raise NotImplementedError.new("#{self.class}#format_node") # override in subclasses
|
383
|
+
end
|
384
|
+
|
385
|
+
##
|
386
|
+
# @param [RDF::URI] value
|
387
|
+
# @param [Hash{Symbol => Object}] options
|
388
|
+
# @return [String]
|
389
|
+
# @raise [NotImplementedError] unless implemented in subclass
|
390
|
+
# @abstract
|
391
|
+
def format_uri(value, options = {})
|
392
|
+
raise NotImplementedError.new("#{self.class}#format_uri") # override in subclasses
|
393
|
+
end
|
394
|
+
|
395
|
+
##
|
396
|
+
# @param [RDF::Literal, String, #to_s] value
|
397
|
+
# @param [Hash{Symbol => Object}] options
|
398
|
+
# @return [String]
|
399
|
+
# @raise [NotImplementedError] unless implemented in subclass
|
400
|
+
# @abstract
|
401
|
+
def format_literal(value, options = {})
|
402
|
+
raise NotImplementedError.new("#{self.class}#format_literal") # override in subclasses
|
403
|
+
end
|
404
|
+
|
405
|
+
##
|
406
|
+
# @param [RDF::List] value
|
407
|
+
# @param [Hash{Symbol => Object}] options
|
408
|
+
# @return [String]
|
409
|
+
# @abstract
|
410
|
+
# @since 0.2.3
|
411
|
+
def format_list(value, options = {})
|
412
|
+
format_term(value.subject, options)
|
413
|
+
end
|
414
|
+
|
415
|
+
protected
|
416
|
+
|
417
|
+
##
|
418
|
+
# @return [void]
|
419
|
+
def puts(*args)
|
420
|
+
@output.puts(*args)
|
421
|
+
end
|
422
|
+
|
423
|
+
##
|
424
|
+
# @param [RDF::Resource] uriref
|
425
|
+
# @return [String]
|
426
|
+
def uri_for(uriref)
|
427
|
+
case
|
428
|
+
when uriref.is_a?(RDF::Node)
|
429
|
+
@nodes[uriref]
|
430
|
+
when uriref.respond_to?(:to_uri)
|
431
|
+
uriref.to_uri.to_s
|
432
|
+
else
|
433
|
+
uriref.to_s
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
##
|
438
|
+
# @return [String]
|
439
|
+
def node_id
|
440
|
+
"_:n#{@node_id += 1}"
|
441
|
+
end
|
442
|
+
|
443
|
+
##
|
444
|
+
# @param [String] string
|
445
|
+
# @return [String]
|
446
|
+
def escaped(string)
|
447
|
+
string.gsub('\\', '\\\\').gsub("\t", '\\t').
|
448
|
+
gsub("\n", '\\n').gsub("\r", '\\r').gsub('"', '\\"')
|
449
|
+
end
|
450
|
+
|
451
|
+
##
|
452
|
+
# @param [String] string
|
453
|
+
# @return [String]
|
454
|
+
def quoted(string)
|
455
|
+
"\"#{string}\""
|
456
|
+
end
|
457
|
+
|
458
|
+
private
|
459
|
+
|
460
|
+
@@subclasses = [] # @private
|
461
|
+
|
462
|
+
##
|
463
|
+
# @private
|
464
|
+
# @return [void]
|
465
|
+
def self.inherited(child)
|
466
|
+
@@subclasses << child
|
467
|
+
super
|
468
|
+
end
|
469
|
+
end # Writer
|
470
|
+
|
471
|
+
##
|
472
|
+
# The base class for RDF serialization errors.
|
473
|
+
class WriterError < IOError
|
474
|
+
end # WriterError
|
475
|
+
end # RDF
|
data/lib/rdf.rb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
require 'enumerator'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'stringio'
|
4
|
+
require 'bigdecimal'
|
5
|
+
require 'date'
|
6
|
+
require 'time'
|
7
|
+
|
8
|
+
if RUBY_VERSION < '1.8.7'
|
9
|
+
# @see http://rubygems.org/gems/backports
|
10
|
+
begin
|
11
|
+
require 'backports/1.8.7'
|
12
|
+
rescue LoadError
|
13
|
+
begin
|
14
|
+
require 'rubygems'
|
15
|
+
require 'backports/1.8.7'
|
16
|
+
rescue LoadError
|
17
|
+
abort "RDF.rb requires Ruby 1.8.7 or the Backports gem (hint: `gem install backports')."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'rdf/version'
|
23
|
+
|
24
|
+
module RDF
|
25
|
+
# For compatibility with both Ruby 1.8.x and Ruby 1.9.x:
|
26
|
+
Enumerator = defined?(::Enumerator) ? ::Enumerator : ::Enumerable::Enumerator
|
27
|
+
|
28
|
+
# RDF mixins
|
29
|
+
autoload :Countable, 'rdf/mixin/countable'
|
30
|
+
autoload :Durable, 'rdf/mixin/durable'
|
31
|
+
autoload :Enumerable, 'rdf/mixin/enumerable'
|
32
|
+
autoload :Indexable, 'rdf/mixin/indexable'
|
33
|
+
autoload :Inferable, 'rdf/mixin/inferable'
|
34
|
+
autoload :Mutable, 'rdf/mixin/mutable'
|
35
|
+
autoload :Queryable, 'rdf/mixin/queryable'
|
36
|
+
autoload :Readable, 'rdf/mixin/readable'
|
37
|
+
autoload :TypeCheck, 'rdf/mixin/type_check'
|
38
|
+
autoload :Writable, 'rdf/mixin/writable'
|
39
|
+
|
40
|
+
# RDF objects
|
41
|
+
autoload :Graph, 'rdf/model/graph'
|
42
|
+
autoload :Literal, 'rdf/model/literal'
|
43
|
+
autoload :Node, 'rdf/model/node'
|
44
|
+
autoload :Resource, 'rdf/model/resource'
|
45
|
+
autoload :Statement, 'rdf/model/statement'
|
46
|
+
autoload :URI, 'rdf/model/uri'
|
47
|
+
autoload :Value, 'rdf/model/value'
|
48
|
+
autoload :Term, 'rdf/model/term'
|
49
|
+
|
50
|
+
# RDF collections
|
51
|
+
autoload :List, 'rdf/model/list'
|
52
|
+
|
53
|
+
# RDF serialization
|
54
|
+
autoload :Format, 'rdf/format'
|
55
|
+
autoload :Reader, 'rdf/reader'
|
56
|
+
autoload :ReaderError, 'rdf/reader'
|
57
|
+
autoload :Writer, 'rdf/writer'
|
58
|
+
autoload :WriterError, 'rdf/writer'
|
59
|
+
|
60
|
+
# RDF serialization formats
|
61
|
+
autoload :NTriples, 'rdf/ntriples'
|
62
|
+
autoload :NQuads, 'rdf/nquads'
|
63
|
+
|
64
|
+
# RDF storage
|
65
|
+
autoload :Repository, 'rdf/repository'
|
66
|
+
autoload :Transaction, 'rdf/transaction'
|
67
|
+
|
68
|
+
# RDF querying
|
69
|
+
autoload :Query, 'rdf/query'
|
70
|
+
|
71
|
+
# RDF vocabularies
|
72
|
+
autoload :Vocabulary, 'rdf/vocab'
|
73
|
+
VOCABS = Dir.glob(File.join(File.dirname(__FILE__), 'rdf', 'vocab', '*.rb')).map { |f| File.basename(f)[0...-(File.extname(f).size)].to_sym } rescue []
|
74
|
+
VOCABS.each { |v| autoload v.to_s.upcase.to_sym, "rdf/vocab/#{v}" unless v == :rdf }
|
75
|
+
|
76
|
+
# Utilities
|
77
|
+
autoload :Util, 'rdf/util'
|
78
|
+
|
79
|
+
##
|
80
|
+
# Alias for `RDF::Resource.new`.
|
81
|
+
#
|
82
|
+
# @return [RDF::Resource]
|
83
|
+
def self.Resource(*args, &block)
|
84
|
+
Resource.new(*args, &block)
|
85
|
+
end
|
86
|
+
|
87
|
+
##
|
88
|
+
# Alias for `RDF::Node.new`.
|
89
|
+
#
|
90
|
+
# @return [RDF::Node]
|
91
|
+
def self.Node(*args, &block)
|
92
|
+
Node.new(*args, &block)
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Alias for `RDF::URI.new`.
|
97
|
+
#
|
98
|
+
# @overload URI(uri)
|
99
|
+
# @param [URI, String, #to_s] uri
|
100
|
+
#
|
101
|
+
# @overload URI(options = {})
|
102
|
+
# @param [Hash{Symbol => Object} options
|
103
|
+
#
|
104
|
+
# @return [RDF::URI]
|
105
|
+
def self.URI(*args, &block)
|
106
|
+
case uri = args.first
|
107
|
+
when RDF::URI then uri
|
108
|
+
else case
|
109
|
+
when uri.respond_to?(:to_uri) then uri.to_uri
|
110
|
+
else URI.new(*args, &block)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
##
|
116
|
+
# Alias for `RDF::Literal.new`.
|
117
|
+
#
|
118
|
+
# @return [RDF::Literal]
|
119
|
+
def self.Literal(*args, &block)
|
120
|
+
case literal = args.first
|
121
|
+
when RDF::Literal then literal
|
122
|
+
else Literal.new(*args, &block)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
##
|
127
|
+
# Alias for `RDF::Graph.new`.
|
128
|
+
#
|
129
|
+
# @return [RDF::Graph]
|
130
|
+
def self.Graph(*args, &block)
|
131
|
+
Graph.new(*args, &block)
|
132
|
+
end
|
133
|
+
|
134
|
+
##
|
135
|
+
# Alias for `RDF::Statement.new`.
|
136
|
+
#
|
137
|
+
# @return [RDF::Statement]
|
138
|
+
def self.Statement(*args, &block)
|
139
|
+
Statement.new(*args, &block)
|
140
|
+
end
|
141
|
+
|
142
|
+
##
|
143
|
+
# Alias for `RDF::Vocabulary.create`.
|
144
|
+
#
|
145
|
+
# @param [String] uri
|
146
|
+
# @return [Class]
|
147
|
+
def self.Vocabulary(uri)
|
148
|
+
Vocabulary.create(uri)
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# @return [URI]
|
153
|
+
def self.type
|
154
|
+
self[:type]
|
155
|
+
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# @return [#to_s] property
|
159
|
+
# @return [URI]
|
160
|
+
def self.[](property)
|
161
|
+
RDF::URI.intern([to_uri.to_s, property.to_s].join)
|
162
|
+
end
|
163
|
+
|
164
|
+
##
|
165
|
+
# @param [Symbol] property
|
166
|
+
# @return [URI]
|
167
|
+
# @raise [NoMethodError]
|
168
|
+
def self.method_missing(property, *args, &block)
|
169
|
+
if args.empty?
|
170
|
+
self[property]
|
171
|
+
else
|
172
|
+
super
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
##
|
177
|
+
# @return [URI]
|
178
|
+
def self.to_rdf
|
179
|
+
to_uri
|
180
|
+
end
|
181
|
+
|
182
|
+
##
|
183
|
+
# @return [URI]
|
184
|
+
def self.to_uri
|
185
|
+
RDF::URI.intern("http://www.w3.org/1999/02/22-rdf-syntax-ns#")
|
186
|
+
end
|
187
|
+
|
188
|
+
class << self
|
189
|
+
# For compatibility with `RDF::Vocabulary.__name__`:
|
190
|
+
alias_method :__name__, :name
|
191
|
+
end
|
192
|
+
end
|