rdf 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -27,44 +27,98 @@ Features
27
27
  use of any one part of the library without needing to load up the rest.
28
28
  * Compatible with Ruby 1.8.7+, Ruby 1.9.x, and JRuby 1.4/1.5.
29
29
  * Compatible with older Ruby versions with the help of the [Backports][] gem.
30
+ * Performs auto-detection of input to select appropriate Reader class if one
31
+ cannot be determined from file characteristics.
30
32
 
31
33
  Tutorials
32
34
  ---------
33
35
 
34
- * [Getting data from the Semantic Web using Ruby and RDF.rb]
35
- (http://semanticweb.org/wiki/Getting_data_from_the_Semantic_Web_%28Ruby%29)
36
- * [Using RDF.rb and Spira to process RDF data from the British Ordnance Survey]
37
- (http://ultramagnus.org/?p=85)
38
- * [Getting started with RDF and SPARQL using 4store and RDF.rb]
39
- (http://www.jenitennison.com/blog/node/152)
36
+ * [Getting data from the Semantic Web using Ruby and RDF.rb](http://semanticweb.org/wiki/Getting_data_from_the_Semantic_Web_%28Ruby%29)
37
+ * [Using RDF.rb and Spira to process RDF data from the British Ordnance Survey](http://stephenpope.co.uk/?p=85)
38
+ * [Getting started with RDF and SPARQL using 4store and RDF.rb](http://www.jenitennison.com/blog/node/152)
39
+
40
+ Command Line
41
+ ------------
42
+ When installed, RDF.rb includes a `rdf` shell script which acts as a wrapper to perform a number of different
43
+ operations on RDF files using available readers and writers.
44
+
45
+ * `serialize`: Parse an RDF input and re-serializing to N-Triples or another available format using `--output-format` option.
46
+ * `count`: Parse and RDF input and count the number of statements.
47
+ * `subjects`: Returns unique subjects from parsed input.
48
+ * `objects`: Returns unique objects from parsed input.
49
+ * `predicates`: Returns unique objects from parsed input.
40
50
 
41
51
  Examples
42
52
  --------
43
53
 
44
54
  require 'rdf'
45
-
46
55
  include RDF
47
56
 
48
57
  ### Writing RDF data using the N-Triples format
49
58
 
50
59
  require 'rdf/ntriples'
60
+ graph = RDF::Graph.new << [:hello, RDF::DC.title, "Hello, world!"]
61
+ graph.dump(:ntriples)
51
62
 
52
- RDF::Writer.open("hello.nt") do |writer|
53
- writer << RDF::Graph.new do |graph|
54
- graph << [:hello, RDF::DC.title, "Hello, world!"]
55
- end
56
- end
63
+ or
64
+
65
+ RDF::Writer.open("hello.nt") { |writer| writer << graph }
57
66
 
58
67
  ### Reading RDF data in the N-Triples format
59
68
 
60
69
  require 'rdf/ntriples'
70
+ graph = RDF::Graph.load("http://rdf.rubyforge.org/doap.nt")
61
71
 
72
+ or
73
+
62
74
  RDF::Reader.open("http://rdf.rubyforge.org/doap.nt") do |reader|
63
75
  reader.each_statement do |statement|
64
76
  puts statement.inspect
65
77
  end
66
78
  end
67
79
 
80
+ ### Reading RDF data in other formats
81
+ {RDF::Reader.open} and {RDF::Repository.load} use a number of mechanisms to determine the appropriate reader
82
+ to use when loading a file. The specific format to use can be forced using, e.g. `:format => :ntriples`
83
+ option where the specific format symbol is determined by the available readers. Both also use
84
+ MimeType or file extension, where available.
85
+
86
+ require 'linkeddata'
87
+
88
+ graph = RDF::Graph.load("etc/doap.nq", :format => :nquads)
89
+
90
+ A specific sub-type of Reader can also be invoked directly:
91
+
92
+ require 'rdf/nquads'
93
+
94
+ RDF::NQuads::Reader.open("http://rdf.rubyforge.org/doap.nq") do |reader|
95
+ reader.each_statement do |statement|
96
+ puts statement.inspect
97
+ end
98
+ end
99
+
100
+ Reader/Writer implementations may override {RDF::Format.detect}, which takes a small sample if input
101
+ and return a boolean indicating if it matches that specific format. In the case that a format cannot
102
+ be detected from filename or other options, or that more than one format is identified,
103
+ {RDF::Format.for} will query each loaded format by invoking it's `detect` method, and the first successful
104
+ match will be used to read the input.
105
+
106
+ ### Writing RDF data using other formats
107
+ {RDF::Writer.open}, {RDF::Enumerable#dump}, {RDF::Writer.dump} take similar options to {RDF::Reader.open} to determine the
108
+ appropriate writer to use.
109
+
110
+ require 'linkeddata'
111
+
112
+ RDF::Writer.open("hello.nq", :format => :nquads) do |writer|
113
+ writer << RDF::Repository.new do |repo|
114
+ repo << RDF::Statement.new(:hello, RDF::DC.title, "Hello, world!", :context => RDF::URI("context"))
115
+ end
116
+ end
117
+
118
+ A specific sub-type of Writer can also be invoked directly:
119
+
120
+ graph.dump(:nq)
121
+
68
122
  ### Querying RDF data using basic graph patterns (BGPs)
69
123
 
70
124
  require 'rdf/ntriples'
@@ -82,6 +136,8 @@ Examples
82
136
  puts "name=#{solution.name} email=#{solution.email}"
83
137
  end
84
138
 
139
+ A separate [SPARQL][SPARQL doc] gem builds on basic BGP support to provide full support for [SPARQL 1.0](http://www.w3.org/TR/rdf-sparql-query/) queries.
140
+
85
141
  ### Using pre-defined RDF vocabularies
86
142
 
87
143
  DC.title #=> RDF::URI("http://purl.org/dc/terms/title")
@@ -111,7 +167,16 @@ Documentation
111
167
  * {RDF::Value}
112
168
  * {RDF::Term}
113
169
  * {RDF::Literal}
170
+ * {RDF::Literal::Boolean}
171
+ * {RDF::Literal::Date}
172
+ * {RDF::Literal::DateTime}
173
+ * {RDF::Literal::Decimal}
174
+ * {RDF::Literal::Double}
175
+ * {RDF::Literal::Integer}
176
+ * {RDF::Literal::Time}
177
+ * [RDF::XSD](http://rubydoc.info/github/gkellogg/rdf-xsd/master/frames) (plugin)
114
178
  * {RDF::Resource}
179
+ * {RDF::List}
115
180
  * {RDF::Node}
116
181
  * {RDF::URI}
117
182
  * {RDF::Graph}
@@ -127,14 +192,23 @@ Documentation
127
192
 
128
193
  ### RDF Serialization Formats
129
194
 
195
+ The following is a partial list of RDF formats implemented either natively, or through the inclusion of
196
+ other gems:
197
+
130
198
  * {RDF::NTriples}
199
+ * {RDF::NQuads}
200
+ * [JSON::LD][JSONLD doc] (plugin)
131
201
  * [RDF::JSON](http://rdf.rubyforge.org/json/) (plugin)
132
- * [RDF::N3](http://rdf.rubyforge.org/n3/) (plugin)
202
+ * [RDF::Microdata][Microdata doc] (plugin)
203
+ * [RDF::N3][N3 doc] (plugin)
133
204
  * [RDF::Raptor::RDFXML](http://rdf.rubyforge.org/raptor/) (plugin)
134
205
  * [RDF::Raptor::Turtle](http://rdf.rubyforge.org/raptor/) (plugin)
135
- * [RDF::RDFa](http://rdf.rubyforge.org/rdfa/) (plugin)
136
- * [RDF::RDFXML](http://rdf.rubyforge.org/rdfxml/) (plugin)
206
+ * [RDF::RDFa][RDFa doc] (plugin)
207
+ * [RDF::RDFXML][RDFXML doc] (plugin)
137
208
  * [RDF::Trix](http://rdf.rubyforge.org/trix/) (plugin)
209
+ * [RDF::Turtle][Turtle doc] (plugin)
210
+
211
+ The meta-gem [LinkedData][LinkedData doc] includes many of these gems.
138
212
 
139
213
  ### RDF Storage
140
214
 
@@ -149,6 +223,8 @@ Documentation
149
223
  * {RDF::Mutable}
150
224
  * {RDF::Durable}
151
225
  * {RDF::Transaction}
226
+ * [RDF::AllegroGraph](http://rubydoc.info/github/emk/rdf-agraph/master/frames) (plugin)
227
+ * [RDF::Mongo](http://rubydoc.info/github/pius/rdf-mongo/master/frames) (plugin)
152
228
  * [RDF::DataObjects](http://rdf.rubyforge.org/do/) (plugin)
153
229
  * [RDF::Sesame](http://rdf.rubyforge.org/sesame/) (plugin)
154
230
 
@@ -159,6 +235,8 @@ Documentation
159
235
  * {RDF::Query::Solution}
160
236
  * {RDF::Query::Solutions}
161
237
  * {RDF::Query::Variable}
238
+ * [SPARQL](http://rubydoc.info/github/gkellogg/sparql/frames) (plugin)
239
+
162
240
 
163
241
  ### RDF Vocabularies
164
242
 
@@ -267,8 +345,17 @@ License
267
345
  This is free and unencumbered public domain software. For more information,
268
346
  see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
269
347
 
270
- [RDF]: http://www.w3.org/RDF/
271
- [YARD]: http://yardoc.org/
272
- [YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
273
- [PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
274
- [Backports]: http://rubygems.org/gems/backports
348
+ [RDF]: http://www.w3.org/RDF/
349
+ [YARD]: http://yardoc.org/
350
+ [YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
351
+ [PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
352
+ [Backports]: http://rubygems.org/gems/backports
353
+ [JSONLD doc]: http://rubydoc.info/github/gkellogg/json-ld/frames
354
+ [LinkedData doc]: http://rubydoc.info/github/datagraph/linkeddata/master/frames
355
+ [Microdata doc]: http://rubydoc.info/github/gkellogg/rdf-microdata/frames
356
+ [N3 doc]: http://rubydoc.info/github/gkellogg/rdf-n3/master/frames
357
+ [RDFa doc]: http://rubydoc.info/github/gkellogg/rdf-rdfa/master/frames
358
+ [RDFXML doc]: http://rubydoc.info/github/gkellogg/rdf-rdfxml/master/frames
359
+ [Turtle doc]: http://rubydoc.info/github/gkellogg/rdf-turtle/master/frames
360
+ [SPARQL doc]: http://rubydoc.info/github/gkellogg/sparql/frames
361
+ [SPARQL 1.0]: http://www.w3.org/TR/rdf-sparql-query/
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.3.4
data/bin/rdf CHANGED
@@ -1,22 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
  $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
3
+ require 'rubygems'
3
4
  require 'rdf/cli'
4
5
 
5
6
  options = RDF::CLI.options do
6
- self.banner = "Usage: #{RDF::CLI.basename} [options] command [args...]"
7
- self.on('-d', '--debug', 'Enable debug output for troubleshooting.') do
8
- $DEBUG = true
9
- end
10
7
  self.on('-v', '--verbose', 'Enable verbose output. May be given more than once.') do
11
8
  $VERBOSE = true
12
9
  end
10
+
13
11
  self.on('-V', '--version', 'Display the RDF.rb version and exit.') do
14
12
  puts RDF::VERSION; exit
15
13
  end
16
14
  end
17
15
 
18
- abort options.banner if ARGV.empty?
16
+ abort options.banner if ARGV.empty? && !options.has_key?(:evaluate)
19
17
 
20
- unless RDF::CLI.exec_command(command = ARGV.shift, *ARGV)
21
- abort "#{File.basename($0)}: unknown command `#{command}'"
22
- end
18
+ RDF::CLI.exec_command(command = ARGV.shift, ARGV, options.options)
@@ -12,11 +12,11 @@
12
12
  <http://bhuga.net/#ben> <http://xmlns.com/foaf/0.1/mbox> <mailto:blavender@gmail.com> .
13
13
  <http://bhuga.net/#ben> <http://xmlns.com/foaf/0.1/mbox_sha1sum> "dbf45f4ffbd27b67aa84f02a6a31c144727d10af" .
14
14
  <http://bhuga.net/#ben> <http://xmlns.com/foaf/0.1/name> "Ben Lavender" .
15
- <http://kellogg-assoc.com/#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
16
- <http://kellogg-assoc.com/#me> <http://xmlns.com/foaf/0.1/homepage> <http://kellogg-assoc.com/> .
17
- <http://kellogg-assoc.com/#me> <http://xmlns.com/foaf/0.1/mbox> <mailto:gregg@kellogg-assoc.com> .
18
- <http://kellogg-assoc.com/#me> <http://xmlns.com/foaf/0.1/mbox_sha1sum> "35bc44e6d0070e5ad50ccbe0d24403c96af2b9bd" .
19
- <http://kellogg-assoc.com/#me> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .
15
+ <http://greggkellogg.net/foaf.rdf#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
16
+ <http://greggkellogg.net/foaf.rdf#me> <http://xmlns.com/foaf/0.1/name> "Gregg Kellogg" .
17
+ <http://greggkellogg.net/foaf.rdf#me> <http://xmlns.com/foaf/0.1/mbox> <mailto:gregg@kellogg-assoc.com> .
18
+ <http://greggkellogg.net/foaf.rdf#me> <http://xmlns.com/foaf/0.1/mbox_sha1sum> "35bc44e6d0070e5ad50ccbe0d24403c96af2b9bd" .
19
+ <http://greggkellogg.net/foaf.rdf#me> <http://xmlns.com/foaf/0.1/homepage> <http://greggkellogg.net/> .
20
20
  <http://rubygems.org/gems/rdf> <http://purl.org/dc/terms/creator> <http://ar.to/#self> .
21
21
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#blog> <http://ar.to/> .
22
22
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#blog> <http://blog.datagraph.org/> .
@@ -27,10 +27,10 @@
27
27
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#description> "RDF.rb is a pure-Ruby library for working with Resource Description Framework (RDF) data."@en .
28
28
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#developer> <http://ar.to/#self> .
29
29
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#developer> <http://bhuga.net/#ben> .
30
- <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#developer> <http://kellogg-assoc.com/#me> .
30
+ <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#developer> <http://greggkellogg.net/foaf.rdf#me> .
31
31
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#documenter> <http://ar.to/#self> .
32
32
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#documenter> <http://bhuga.net/#ben> .
33
- <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#documenter> <http://kellogg-assoc.com/#me> .
33
+ <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#documenter> <http://greggkellogg.net/foaf.rdf#me> .
34
34
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#download-page> <http://rubyforge.org/projects/rdf/> .
35
35
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#helper> _:genid1 .
36
36
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#helper> _:genid2 .
@@ -45,7 +45,7 @@
45
45
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#license> <http://creativecommons.org/licenses/publicdomain/> .
46
46
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#maintainer> <http://ar.to/#self> .
47
47
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#maintainer> <http://bhuga.net/#ben> .
48
- <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#maintainer> <http://kellogg-assoc.com/#me> .
48
+ <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#maintainer> <http://greggkellogg.net/foaf.rdf#me> .
49
49
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#name> "RDF.rb" .
50
50
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#platform> "Ruby" .
51
51
  <http://rubygems.org/gems/rdf> <http://usefulinc.com/ns/doap#shortdesc> "A Ruby library for working with Resource Description Framework (RDF) data."@en .
data/lib/rdf.rb CHANGED
@@ -34,6 +34,7 @@ module RDF
34
34
  autoload :Mutable, 'rdf/mixin/mutable'
35
35
  autoload :Queryable, 'rdf/mixin/queryable'
36
36
  autoload :Readable, 'rdf/mixin/readable'
37
+ autoload :TypeCheck, 'rdf/mixin/type_check'
37
38
  autoload :Writable, 'rdf/mixin/writable'
38
39
 
39
40
  # RDF objects
@@ -1,8 +1,75 @@
1
1
  require 'rdf'
2
+ require 'rdf/ntriples'
3
+ require 'rdf/nquads'
2
4
  require 'optparse'
5
+ begin
6
+ gem 'linkeddata'
7
+ require 'linkeddata'
8
+ rescue LoadError
9
+ # Silently load without linkeddata
10
+ end
11
+
12
+ class OptionParser
13
+ def options; @options || {}; end
14
+ def options=(value); @options = value; end
15
+ end
3
16
 
4
17
  module RDF
5
18
  class CLI
19
+
20
+ COMMANDS = {
21
+ "count" => lambda do |argv, opts|
22
+ start = Time.new
23
+ count = 0
24
+ self.parse(argv, opts) do |reader|
25
+ reader.each_statement do |statement|
26
+ count += 1
27
+ end
28
+ end
29
+ secs = Time.new - start
30
+ $stdout.puts "Parsed #{count} statements with #{@readers.join(', ')} in #{secs} seconds @ #{count/secs} statements/second."
31
+ end,
32
+ "lenghts" => lambda do |argv, opts|
33
+ self.parse(argv, opts) do |reader|
34
+ reader.each_statement do |statement|
35
+ $stdout.puts statement.to_s.size
36
+ end
37
+ end
38
+ end,
39
+ "objects" => lambda do |argv, opts|
40
+ self.parse(argv, opts) do |reader|
41
+ reader.each_statement do |statement|
42
+ $stdout.puts statement.object.to_ntriples
43
+ end
44
+ end
45
+ end,
46
+ "predicates" => lambda do |argv, opts|
47
+ self.parse(argv, opts) do |reader|
48
+ reader.each_statement do |statement|
49
+ $stdout.puts statement.predicate.to_ntriples
50
+ end
51
+ end
52
+ end,
53
+ "serialize" => lambda do |argv, opts|
54
+ writer_class = RDF::Writer.for(opts[:output_format]) || RDF::NTriples::Writer
55
+ out = opts[:output] || $stdout
56
+ opts = opts.merge(:prefixes => {})
57
+ writer_opts = opts.merge(:standard_prefixes => true)
58
+ self.parse(argv, opts) do |reader|
59
+ writer_class.new(out, writer_opts) do |writer|
60
+ writer << reader
61
+ end
62
+ end
63
+ end,
64
+ "subjects" => lambda do |argv, opts|
65
+ self.parse(argv, opts) do |reader|
66
+ reader.each_statement do |statement|
67
+ $stdout.puts statement.subject.to_ntriples
68
+ end
69
+ end
70
+ end
71
+ }
72
+
6
73
  ##
7
74
  # @return [String]
8
75
  def self.basename() File.basename($0) end
@@ -13,20 +80,70 @@ module RDF
13
80
  # @return [OptionParser]
14
81
  def self.options(&block)
15
82
  options = OptionParser.new
83
+ opts = options.options = {
84
+ :base_uri => nil,
85
+ :canonicalize => false,
86
+ :debug => false,
87
+ :evaluate => nil,
88
+ :format => nil,
89
+ :output => $stdout,
90
+ :output_format => :ntriples,
91
+ :validate => false,
92
+ }
16
93
 
94
+ # Command-specific options
17
95
  if block_given?
18
96
  case block.arity
19
97
  when 1 then block.call(options)
20
98
  else options.instance_eval(&block)
21
99
  end
22
100
  end
101
+ options.banner ||= "Usage: #{self.basename} [options] command [args...]"
102
+
103
+ options.on('--canonicalize', 'Canonicalize input.') do
104
+ opts[:canonicalize] = true
105
+ end
106
+
107
+ options.on('-d', '--debug', 'Enable debug output for troubleshooting.') do
108
+ opts[:debug] = $DEBUG = true
109
+ end
110
+
111
+ options.on("-e", "--evaluate STRING", "Evaluate argument as RDF input, if no files are specified") do |arg|
112
+ opts[:evaluate] = arg
113
+ end
114
+
115
+ options.on("--input-format FORMAT", "Format of input file, uses heuristic if not specified") do |arg|
116
+ opts[:format] = arg.downcase.to_sym
117
+ end
118
+
119
+ options.on("-o", "--output FILE", "File to write output, defaults to STDOUT") do |arg|
120
+ opts[:output] = File.open(arg, "w")
121
+ end
122
+
123
+ options.on("--output-format FORMAT", "Format of output file, defaults to NTriples") do |arg|
124
+ opts[:output_format] = arg.downcase.to_sym
125
+ end
126
+
127
+ options.on('--uri URI', 'Base URI of input file, defaults to the filename.') do |arg|
128
+ opts[:base_uri] = arg
129
+ end
130
+
131
+ options.on('--validate', 'Validate input file.') do
132
+ opts[:validate] = true
133
+ end
23
134
 
135
+ options.on_tail("-h", "--help", "Show this message") do
136
+ $stdout.puts options
137
+ $stdout.puts "Available commands:\n\t#{self.commands.join("\n\t")}"
138
+ exit
139
+ end
140
+
24
141
  begin
25
142
  options.parse!
26
143
  rescue OptionParser::InvalidOption => e
27
144
  abort e
28
145
  end
29
-
146
+
30
147
  options
31
148
  end
32
149
 
@@ -34,35 +151,45 @@ module RDF
34
151
  # @param [String] command
35
152
  # @param [Array<String>] args
36
153
  # @return [Boolean]
37
- def self.exec_command(command, *args)
38
- if binary = RDF::CLI.find_binary(command)
39
- exec(binary, *args)
40
- else
41
- false
154
+ def self.exec_command(command, args, options = {})
155
+ unless COMMANDS.has_key?(command)
156
+ abort "#{File.basename($0)}: unknown command `#{command}'"
42
157
  end
158
+
159
+ COMMANDS[command].call(args, options)
43
160
  end
44
-
161
+
45
162
  ##
46
- # @param [String] command
47
- # @return [String, nil]
48
- def self.find_binary(command)
49
- binary = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'rdf-' + command)
50
- File.exists?(binary) ? binary : nil
163
+ # @return [Array<String>] list of executable commands
164
+ def self.commands
165
+ COMMANDS.keys
51
166
  end
52
167
 
53
168
  ##
169
+ # Parse each file, STDIN or specified string in options[:evaluate] yielding
170
+ # a reader
171
+ #
54
172
  # @param [Array<String>] files
55
- # @yield [statement]
56
- # @yieldparam [Statement]
173
+ # @yield [reader]
174
+ # @yieldparam [RDF::Reader]
57
175
  # @return [nil]
58
- def self.each_statement(*files, &block)
59
- files.each do |file|
60
- RDF::NTriples::Reader.open(file) do |reader|
61
- reader.each_statement(&block)
176
+ def self.parse(files, options = {}, &block)
177
+ if files.empty?
178
+ # If files are empty, either use options[:execute]
179
+ input = options[:evaluate] ? StringIO.new(options[:evaluate]) : STDIN
180
+ RDF::Reader.for(options[:format] || :ntriples).new(input, options) do |reader|
181
+ yield(reader)
182
+ end
183
+ else
184
+ files.each do |file|
185
+ RDF::Reader.open(file, options) do |reader|
186
+ (@readers ||= []) << reader.class.to_s
187
+ yield(reader)
188
+ end
62
189
  end
63
190
  end
64
191
  end
65
-
192
+
66
193
  ##
67
194
  # @param [String] msg
68
195
  # @return [void]