activerdf 1.4 → 1.5

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/CHANGELOG CHANGED
@@ -1,3 +1,12 @@
1
+ == activerdf (1.6)
2
+ * TODO: remove ObjectManager.construct_classes (classes exist automagically after Namespace.register)
3
+
4
+ == activerdf (1.5) Thu, 12 Apr 2007 22:42:28 +0100
5
+ * allows directly using classes in query: where(:s, RDF::type, SIOC::Post)
6
+ * extended search in Resource.find (e.g. order results, pagination)
7
+ * added eyal.all_age and eyal.all_foaf::name to always return Arrays
8
+ * added support for writing namespaced attributes (eyal.foaf::name = ...)
9
+
1
10
  == activerdf (1.4) Tue, 27 Feb 2007 20:50:21 +0000
2
11
  * dynamic finders support prefixes (find_by_foaf::name)
3
12
  * ntriples parser supports encoded literals (HTML)
@@ -39,6 +39,10 @@ class ConnectionPool
39
39
  self.write_adapter = nil
40
40
  end
41
41
 
42
+ def ConnectionPool.adapters
43
+ @@adapter_pool.dup
44
+ end
45
+
42
46
  # flushes all openstanding changes into the original datasource.
43
47
  def ConnectionPool.flush
44
48
  write_adapter.flush
@@ -15,6 +15,7 @@ class FederationManager
15
15
  # by distributing query over complete read-pool
16
16
  # and aggregating the results
17
17
  def FederationManager.query(q, options={:flatten => true})
18
+ $activerdflog.debug "querying #{q.to_sp}"
18
19
  if ConnectionPool.read_adapters.empty?
19
20
  raise ActiveRdfError, "cannot execute query without data sources"
20
21
  end
@@ -33,7 +33,7 @@ class Namespace
33
33
 
34
34
  # make some builtin methods private because lookup doesn't work otherwise
35
35
  # on e.g. RDF::type and FOAF::name
36
- [:type, :name].each {|m| private(m) }
36
+ [:type, :name, :id].each {|m| private(m) }
37
37
  end
38
38
 
39
39
  # return the namespace proxy object
@@ -83,7 +83,7 @@ class Namespace
83
83
  end
84
84
 
85
85
  delimiter = uri.rindex(/#|\//)
86
- if delimiter.nil?
86
+ if delimiter.nil? or delimiter == uri.size-1
87
87
  uri
88
88
  else
89
89
  uri[delimiter+1..-1]
@@ -3,6 +3,9 @@ require 'objectmanager/object_manager'
3
3
  require 'objectmanager/namespace'
4
4
  require 'queryengine/query'
5
5
 
6
+ # TODO: finish removal of ObjectManager.construct_classes: make dynamic finders
7
+ # accessible on instance level, and probably more stuff.
8
+
6
9
  module RDFS
7
10
  # Represents an RDF resource and manages manipulations of that resource,
8
11
  # including data lookup (e.g. eyal.age), data updates (e.g. eyal.age=20),
@@ -21,8 +24,14 @@ module RDFS
21
24
 
22
25
  # creates new resource representing an RDF resource
23
26
  def initialize uri
24
- raise ActiveRdfError, "creating resource <#{uri}>" unless uri.is_a?(String)
25
- @uri = uri
27
+ @uri = case uri
28
+ when RDFS::Resource
29
+ uri.uri
30
+ when String
31
+ uri
32
+ else
33
+ raise ActiveRdfError, "cannot create resource <#{uri}>"
34
+ end
26
35
  @predicates = Hash.new
27
36
  end
28
37
 
@@ -31,17 +40,18 @@ module RDFS
31
40
  # because it cannot be found in Namespace.lookup otherwise)
32
41
  self.class_uri = Namespace.lookup(:rdfs, :Resource)
33
42
 
43
+ def self.uri; class_uri.uri; end
44
+ def self.==(other)
45
+ other.respond_to?(:uri) ? other.uri == self.uri : false
46
+ end
47
+
34
48
  ##### ######
35
49
  ##### start of instance-level code
36
50
  ##### ######
37
51
 
38
52
  # a resource is same as another if they both represent the same uri
39
53
  def ==(other)
40
- if other.respond_to?(:uri)
41
- other.uri == self.uri
42
- else
43
- false
44
- end
54
+ other.respond_to?(:uri) ? other.uri == self.uri : false
45
55
  end
46
56
  alias_method 'eql?','=='
47
57
 
@@ -86,8 +96,46 @@ module RDFS
86
96
 
87
97
  # returns array of all instances of this class (e.g. Person.find_all)
88
98
  # (always returns collection)
89
- def Resource.find_all
90
- query = Query.new.distinct(:s).where(:s, Namespace.lookup(:rdf,:type), class_uri)
99
+ def Resource.find_all(*args)
100
+ find(:all, *args)
101
+ end
102
+
103
+ def Resource.find(*args)
104
+ class_uri.find(*args)
105
+ end
106
+
107
+ ##### #####
108
+ ##### instance level methods #####
109
+ ##### #####
110
+ def find(*args)
111
+ # extract sort options from args
112
+ options = args.last.is_a?(Hash) ? args.pop : {}
113
+
114
+ query = Query.new.distinct(:s)
115
+ query.where(:s, Namespace.lookup(:rdf,:type), self)
116
+
117
+ if options.include? :order
118
+ sort_predicate = options[:order]
119
+ query.sort(:sort_value)
120
+ query.where(:s, sort_predicate, :sort_value)
121
+ end
122
+
123
+ if options.include? :reverse_order
124
+ sort_predicate = options[:reverse_order]
125
+ query.reverse_sort(:sort_value)
126
+ query.where(:s, sort_predicate, :sort_value)
127
+ end
128
+
129
+ if options.include? :where
130
+ raise ActiveRdfError, "where clause should be hash of predicate => object" unless options[:where].is_a? Hash
131
+ options[:where].each do |p,o|
132
+ query.where(:s, p, o)
133
+ end
134
+ end
135
+
136
+ query.limit(options[:limit]) if options[:limit]
137
+ query.offset(options[:offset]) if options[:offset]
138
+
91
139
  if block_given?
92
140
  query.execute do |resource|
93
141
  yield resource
@@ -97,10 +145,6 @@ module RDFS
97
145
  end
98
146
  end
99
147
 
100
- ##### #####
101
- ##### instance level methods #####
102
- ##### #####
103
-
104
148
  # manages invocations such as eyal.age
105
149
  def method_missing(method, *args)
106
150
  # possibilities:
@@ -134,42 +178,55 @@ module RDFS
134
178
  # action: return namespace proxy that handles 'name' invocation, by
135
179
  # rewriting into predicate lookup (similar to case (5)
136
180
 
137
- # maybe change order in which to check these, checking (4) is probably
138
- # cheaper than (1)-(2) but (1) and (2) are probably more probable (getting
139
- # attribute values over executing custom methods)
140
-
141
- $activerdflog.debug "RDFS::Resource: method_missing on instance: called with method name #{method}"
181
+ $activerdflog.debug "method_missing: #{method}"
142
182
 
143
183
  # are we doing an update or not?
144
184
  # checking if method ends with '='
145
185
 
146
- if method.to_s[-1..-1] == '='
147
- methodname = method.to_s[0..-2]
148
- update = true
149
- else
150
- methodname = method.to_s
151
- update = false
186
+ update = method.to_s[-1..-1] == '='
187
+ methodname = if update
188
+ method.to_s[0..-2]
189
+ else
190
+ method.to_s
191
+ end
192
+
193
+ # extract single values from array unless user asked for eyal.all_age
194
+ flatten = true
195
+ if method.to_s[0..3] == 'all_'
196
+ flatten = false
197
+ methodname = methodname[4..-1]
152
198
  end
153
199
 
154
200
  # check possibility (5)
155
201
  if @predicates.include?(methodname)
156
- return predicate_invocation(@predicates[methodname], args, update)
202
+ return predicate_invocation(@predicates[methodname], args, update, flatten)
157
203
  end
158
204
 
159
205
  # check possibility (6)
160
- if Namespace.abbreviations.include?(method)
206
+ if Namespace.abbreviations.include?(methodname.to_sym)
161
207
  namespace = Object.new
162
- @@uri = method
208
+ @@uri = methodname
163
209
  @@subject = self
164
- class <<namespace
165
- def method_missing(localname, *args)
166
- predicate = Namespace.lookup(@@uri, localname)
167
- Query.new.distinct(:o).where(@@subject, predicate, :o).execute(:flatten => true)
168
- end
210
+ @@flatten = flatten
211
+
212
+ # catch the invocation on the namespace
213
+ class <<namespace
214
+ def method_missing(localname, *args)
215
+ # check if updating or reading predicate value
216
+ if localname.to_s[-1..-1] == '='
217
+ # set value
218
+ predicate = Namespace.lookup(@@uri, localname.to_s[0..-2])
219
+ args.each { |value| FederationManager.add(@@subject, predicate, value) }
220
+ else
221
+ # read value
222
+ predicate = Namespace.lookup(@@uri, localname)
223
+ Query.new.distinct(:o).where(@@subject, predicate, :o).execute(:flatten => @@flatten)
224
+ end
225
+ end
169
226
  private(:type)
170
- end
171
- return namespace
172
- end
227
+ end
228
+ return namespace
229
+ end
173
230
 
174
231
  candidates = if update
175
232
  (class_level_predicates + direct_predicates).compact.uniq
@@ -180,7 +237,7 @@ module RDFS
180
237
  # checking possibility (1) and (3)
181
238
  candidates.each do |pred|
182
239
  if Namespace.localname(pred) == methodname
183
- return predicate_invocation(pred, args, update)
240
+ return predicate_invocation(pred, args, update, flatten)
184
241
  end
185
242
  end
186
243
 
@@ -299,11 +356,6 @@ module RDFS
299
356
  "<#{uri}>"
300
357
  end
301
358
 
302
- # # label of resource (rdfs:label if available, uri otherwise)
303
- # def label
304
- # get_property_value(Namespace.lookup(:rdfs,:label)) || uri
305
- # end
306
-
307
359
  private
308
360
 
309
361
  # def ancestors(predicate)
@@ -311,24 +363,17 @@ module RDFS
311
363
  # Query.new.distinct(:p).where(predicate, subproperty, :p).execute
312
364
  # end
313
365
 
314
- def predicate_invocation(predicate, args, update)
366
+ def predicate_invocation(predicate, args, update, flatten)
315
367
  if update
316
368
  args.each do |value|
317
369
  FederationManager.add(self, predicate, value)
318
370
  end
319
371
  args
320
372
  else
321
- get_property_value(predicate, args)
373
+ Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
322
374
  end
323
375
  end
324
376
 
325
- def get_property_value(predicate, args=[])
326
- return_ary = args[0][:array] if args[0].is_a?(Hash)
327
- flatten_results = !return_ary
328
- query = Query.new.distinct(:o).where(self, predicate, :o)
329
- query.execute(:flatten => flatten_results)
330
- end
331
-
332
377
  # returns all rdf:types of this resource but without a conversion to
333
378
  # Ruby classes (it returns an array of RDFS::Resources)
334
379
  def types
@@ -6,7 +6,7 @@ require 'federation/federation_manager'
6
6
  # data source. In all clauses symbols represent variables:
7
7
  # Query.new.select(:s).where(:s,:p,:o).
8
8
  class Query
9
- attr_reader :select_clauses, :where_clauses, :sort_clauses, :keywords, :limits, :offsets
9
+ attr_reader :select_clauses, :where_clauses, :sort_clauses, :keywords, :limits, :offsets, :reverse_sort_clauses
10
10
  bool_accessor :distinct, :ask, :select, :count, :keyword, :reasoning
11
11
 
12
12
  def initialize
@@ -18,6 +18,7 @@ class Query
18
18
  @sort_clauses = []
19
19
  @keywords = {}
20
20
  @reasoning = true
21
+ @reverse_sort_clauses = []
21
22
  end
22
23
 
23
24
  # Clears the select clauses
@@ -57,25 +58,33 @@ class Query
57
58
  select(*s)
58
59
  end
59
60
 
60
- # Adds sort predicates (must appear in select clause)
61
+ # Adds sort predicates
61
62
  def sort *s
62
- s.each do |e|
63
- @sort_clauses << parametrise(e)
64
- end
65
- # removing duplicate select clauses
63
+ # add sort clauses without duplicates
64
+ s.each { |clause| @sort_clauses << parametrise(clause) }
66
65
  @sort_clauses.uniq!
66
+
67
+ self
68
+ end
69
+
70
+ # adds reverse sorting predicates
71
+ def reverse_sort *s
72
+ # add sort clauses without duplicates
73
+ s.each { |clause| @reverse_sort_clauses << parametrise(clause) }
74
+ @reverse_sort_clauses.uniq!
75
+
67
76
  self
68
77
  end
69
78
 
70
79
  # Adds limit clause (maximum number of results to return)
71
80
  def limit(i)
72
- @limits = i
81
+ @limits = i.to_i
73
82
  self
74
83
  end
75
84
 
76
85
  # Add offset clause (ignore first n results)
77
86
  def offset(i)
78
- @offsets = i
87
+ @offsets = i.to_i
79
88
  self
80
89
  end
81
90
 
@@ -128,6 +137,9 @@ class Query
128
137
  # usage:: results = query.execute
129
138
  # usage:: query.execute do |s,p,o| ... end
130
139
  def execute(options={:flatten => false}, &block)
140
+ options = {:flatten => true} if options == :flatten
141
+
142
+ $activerdflog.debug("query: #{self.to_sp}")
131
143
  if block_given?
132
144
  FederationManager.query(self) do |*clauses|
133
145
  block.call(*clauses)
@@ -155,14 +167,10 @@ class Query
155
167
  private
156
168
  def parametrise s
157
169
  case s
158
- when Symbol
170
+ when Symbol, RDFS::Resource, Literal, Class
159
171
  s
160
- when RDFS::Resource
161
- s
162
172
  when nil
163
173
  nil
164
- when Literal
165
- s
166
174
  else
167
175
  '"' + s.to_s + '"'
168
176
  end
@@ -15,11 +15,9 @@ class Query2SPARQL
15
15
  str << "ASK { #{where_clauses(query)} }"
16
16
  end
17
17
 
18
- $activerdflog.debug "Query2SPARQL: translated the query to #{str}"
19
18
  return str
20
19
  end
21
20
 
22
- private
23
21
  # concatenate each where clause using space (e.g. 's p o')
24
22
  # and concatenate the clauses using dot, e.g. 's p o . s2 p2 o2 .'
25
23
  def self.where_clauses(query)
@@ -31,17 +29,17 @@ class Query2SPARQL
31
29
  end
32
30
 
33
31
  def self.construct_clause(term)
34
- case term
35
- when Symbol
36
- '?' + term.to_s
37
- when RDFS::Resource
38
- '<' + term.uri + '>'
39
- else
40
- term.to_s
41
- end
32
+ if term.respond_to? :uri
33
+ '<' + term.uri + '>'
34
+ else
35
+ case term
36
+ when Symbol
37
+ '?' + term.to_s
38
+ else
39
+ term.to_s
40
+ end
41
+ end
42
42
  end
43
43
 
44
- #declare the class level methods as private with these directives
45
- private_class_method :where_clauses
46
- private_class_method :construct_clause
44
+ private_class_method :where_clauses, :construct_clause
47
45
  end
data/lib/active_rdf.rb CHANGED
@@ -23,7 +23,7 @@ def load_adapter s
23
23
  begin
24
24
  require s
25
25
  rescue Exception => e
26
- $activerdflog.warn "could not load adapter #{s}: #{e}"
26
+ $activerdflog.info "could not load adapter #{s}: #{e}"
27
27
  end
28
28
  end
29
29
 
@@ -1,7 +1,7 @@
1
1
  require 'logger'
2
2
 
3
3
  # use either $ACTIVE_RDF_LOG for logging or current directory
4
- location = ENV['ACTIVE_RDF_LOG'] || "#{Dir.pwd}/activerdf.log"
4
+ location = ENV['ACTIVE_RDF_LOG'] || $stdout # "#{Dir.pwd}/activerdf.log"
5
5
  location = $stdout if location == "STDOUT"
6
6
  $activerdflog = Logger.new(location, 1, 100*1024)
7
7
 
data/test/common.rb CHANGED
@@ -27,8 +27,12 @@ end
27
27
  # TODO make this work with a list of existing adapters, not only one
28
28
  def get_different_adapter(existing_adapter)
29
29
  types = ConnectionPool.adapter_types
30
- if types.include?(:rdflite) and existing_adapter.class != RDFLite
31
- ConnectionPool.add :type => :rdflite
30
+ if types.include?(:rdflite)
31
+ if existing_adapter.class == RDFLite
32
+ ConnectionPool.add :type => :rdflite, :unique => true
33
+ else
34
+ ConnectionPool.add :type => :rdflite
35
+ end
32
36
  elsif types.include?(:redland) and existing_adapter.class != RedlandAdapter
33
37
  ConnectionPool.add :type => :redland
34
38
  elsif types.include?(:sparql) and existing_adapter.class != SparqlAdapter
@@ -78,8 +82,12 @@ end
78
82
  # TODO use a list of exisiting adapters not only one
79
83
  def get_different_write_adapter(existing_adapter)
80
84
  types = ConnectionPool.adapter_types
81
- if types.include?(:rdflite) and existing_adapter.class != RDFLite
82
- ConnectionPool.add :type => :rdflite
85
+ if types.include?(:rdflite)
86
+ if existing_adapter.class == RDFLite
87
+ ConnectionPool.add :type => :rdflite, :unique => true
88
+ else
89
+ ConnectionPool.add :type => :rdflite
90
+ end
83
91
  elsif types.include?(:redland) and existing_adapter.class != RedlandAdapter
84
92
  ConnectionPool.add :type => :redland
85
93
  elsif types.include?(:yars) and existing_adapter.class != YarsAdapter
@@ -33,10 +33,10 @@ class TestObjectManager < Test::Unit::TestCase
33
33
  Namespace.register(:test, 'http://activerdf.org/test/')
34
34
  ObjectManager.construct_classes
35
35
 
36
- assert(defined? TEST, "class construction should have created module TEST")
37
- assert(defined? RDFS, "class construction should have created module RDFS")
38
- assert(defined? TEST::Person, "class construction should have created TEST::Person")
39
- assert(defined? RDFS::Class, "class construction should have created RDFS::Class")
36
+ assert(defined? TEST)
37
+ assert(defined? RDFS)
38
+ assert(defined? TEST::Person)
39
+ assert(defined? RDFS::Class)
40
40
  end
41
41
 
42
42
  def test_class_construct_class
@@ -49,4 +49,16 @@ class TestObjectManager < Test::Unit::TestCase
49
49
  assert_instance_of Class, person_class
50
50
  assert_equal person_resource.uri, person_class.class_uri.uri
51
51
  end
52
+
53
+ def test_class_uri
54
+ adapter = get_write_adapter
55
+ adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
56
+ Namespace.register(:test, 'http://activerdf.org/test/')
57
+ ObjectManager.construct_classes
58
+
59
+ assert_equal RDFS::Resource.new('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), RDF::type
60
+ assert_equal RDF::type, RDFS::Resource.new('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')
61
+ assert_equal TEST::Person, RDFS::Resource.new('http://activerdf.org/test/Person')
62
+ assert_equal RDFS::Resource.new('http://activerdf.org/test/Person'), TEST::Person
63
+ end
52
64
  end
@@ -10,7 +10,8 @@ require "#{File.dirname(__FILE__)}/../common"
10
10
  class TestResourceReading < Test::Unit::TestCase
11
11
  def setup
12
12
  ConnectionPool.clear
13
- @adapter = get_read_only_adapter
13
+ @adapter = get_adapter
14
+ @adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
14
15
  Namespace.register(:test, 'http://activerdf.org/test/')
15
16
  ObjectManager.construct_classes
16
17
 
@@ -21,12 +22,12 @@ class TestResourceReading < Test::Unit::TestCase
21
22
  end
22
23
 
23
24
  def test_find_all_instances
24
- assert_equal 36, RDFS::Resource.find_all.size
25
- assert_equal [@eyal], TEST::Person.find_all
25
+ assert_equal 7, RDFS::Resource.find_all.size
26
+ assert_equal [TEST::eyal, TEST::other], TEST::Person.find_all
26
27
  end
27
28
 
28
29
  def test_class_predicates
29
- assert_equal 10, RDFS::Resource.predicates.size
30
+ assert_equal 4, RDFS::Resource.predicates.size
30
31
  end
31
32
 
32
33
  def test_eyal_predicates
@@ -39,9 +40,9 @@ class TestResourceReading < Test::Unit::TestCase
39
40
 
40
41
  # test class level predicates
41
42
  class_preds = @eyal.class_level_predicates.collect {|p| p.uri }
42
- # eyal.type: person and resource, has predicates age, eye, and
43
- # rdfs:label, rdfs:comment, etc.
44
- assert_equal 10, class_preds.size
43
+ # eyal.type: person and resource, has predicates age, eye
44
+ # not default rdfs:label, rdfs:comment, etc. because not using rdfs reasoning
45
+ assert_equal 4, class_preds.size
45
46
  end
46
47
 
47
48
  def test_eyal_types
@@ -54,9 +55,13 @@ class TestResourceReading < Test::Unit::TestCase
54
55
  def test_eyal_age
55
56
  # triple exists '<eyal> age 27'
56
57
  assert_equal '27', @eyal.age
58
+ assert_equal '27', @eyal.test::age
59
+ assert_equal ['27'], @eyal.all_age
57
60
 
58
61
  # Person has property car, but eyal has no value for it
59
62
  assert_equal nil, @eyal.car
63
+ assert_equal nil, @eyal.test::car
64
+ assert_equal [], @eyal.all_test::car
60
65
 
61
66
  # non-existent method should throw error
62
67
  assert_equal nil, @eyal.non_existing_method
@@ -67,6 +72,22 @@ class TestResourceReading < Test::Unit::TestCase
67
72
  assert_instance_of TEST::Person, @eyal
68
73
  end
69
74
 
75
+ def test_find_options
76
+ all = [Namespace.lookup(:test,:Person), Namespace.lookup(:rdfs, :Class), Namespace.lookup(:rdf, :Property), @eyal, TEST::car, TEST::age, TEST::eye]
77
+ found = RDFS::Resource.find
78
+ assert_equal all.sort, found.sort
79
+
80
+ properties = [TEST::car, TEST::age, TEST::eye]
81
+ found = RDFS::Resource.find(:where => {RDFS::domain => RDFS::Resource})
82
+ assert_equal properties.sort, found.sort
83
+
84
+ found = RDFS::Resource.find(:where => {RDFS::domain => RDFS::Resource, :prop => :any})
85
+ assert_equal properties.sort, found.sort
86
+
87
+ found = TEST::Person.find(:order => TEST::age)
88
+ assert_equal [TEST::other, TEST::eyal], found
89
+ end
90
+
70
91
  def test_find_methods
71
92
  assert_equal @eyal, RDFS::Resource.find_by_eye('blue')
72
93
  assert_equal @eyal, RDFS::Resource.find_by_test::eye('blue')
@@ -82,6 +103,8 @@ class TestResourceReading < Test::Unit::TestCase
82
103
 
83
104
  # test for writing if no write adapter is defined (like only sparqls)
84
105
  def test_write_without_write_adapter
85
- assert_raises(ActiveRdfError) { @eyal.age = 18 }
106
+ ConnectionPool.clear
107
+ get_read_only_adapter
108
+ assert_raises(ActiveRdfError) { @eyal.test::age = 18 }
86
109
  end
87
110
  end
@@ -18,9 +18,13 @@ class TestResourceWriting < Test::Unit::TestCase
18
18
 
19
19
  eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
20
20
  assert_raises(ActiveRdfError) { eyal.age = 18 }
21
+
22
+ assert_nothing_raised { eyal.ar::age = 100 }
23
+ assert_equal '100', eyal.ar::age
24
+ assert_equal ['100'], eyal.all_ar::age
21
25
 
22
26
  adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
23
27
  assert_nothing_raised { eyal.age = 18 }
24
- assert_equal ['18','27'], eyal.age
28
+ assert_equal ['100', '18', '27'], eyal.age
25
29
  end
26
30
  end
@@ -2,6 +2,8 @@
2
2
  <http://activerdf.org/test/Person> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://www.w3.org/2000/01/rdf-schema#Resource> .
3
3
  <http://activerdf.org/test/eyal> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://activerdf.org/test/Person> .
4
4
  <http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27" .
5
+ <http://activerdf.org/test/other> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://activerdf.org/test/Person> .
6
+ <http://activerdf.org/test/other> <http://activerdf.org/test/age> "21" .
5
7
  <http://activerdf.org/test/eyal> <http://activerdf.org/test/eye> "blue" .
6
8
  <http://activerdf.org/test/age> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
7
9
  <http://activerdf.org/test/eye> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: activerdf
5
5
  version: !ruby/object:Gem::Version
6
- version: "1.4"
7
- date: 2007-02-27 00:00:00 +00:00
6
+ version: "1.5"
7
+ date: 2007-04-12 00:00:00 +01:00
8
8
  summary: Offers object-oriented access to RDF (with adapters to several datastores).
9
9
  require_paths:
10
10
  - lib
@@ -38,36 +38,36 @@ files:
38
38
  - test/common.rb
39
39
  - test/test_adapters.rb
40
40
  - test/test_person_data.nt
41
- - test/federation/test_connection_pool.rb
42
41
  - test/federation/test_federation_manager.rb
42
+ - test/federation/test_connection_pool.rb
43
+ - test/objectmanager/test_resource_reading.rb
44
+ - test/objectmanager/test_literal.rb
43
45
  - test/objectmanager/test_namespace.rb
44
46
  - test/objectmanager/test_object_manager.rb
45
- - test/objectmanager/test_resource_reading.rb
46
47
  - test/objectmanager/test_resource_writing.rb
47
- - test/objectmanager/test_literal.rb
48
+ - test/queryengine/test_ntriples_parser.rb
48
49
  - test/queryengine/test_query.rb
49
50
  - test/queryengine/test_query2jars2.rb
50
51
  - test/queryengine/test_query2sparql.rb
51
52
  - test/queryengine/test_query_engine.rb
52
- - test/queryengine/test_ntriples_parser.rb
53
53
  - lib/active_rdf
54
54
  - lib/active_rdf.rb
55
- - lib/active_rdf_helpers.rb
56
55
  - lib/active_rdf_log.rb
56
+ - lib/active_rdf_helpers.rb
57
57
  - lib/active_rdf/federation
58
58
  - lib/active_rdf/objectmanager
59
59
  - lib/active_rdf/queryengine
60
- - lib/active_rdf/federation/active_rdf_adapter.rb
61
60
  - lib/active_rdf/federation/connection_pool.rb
62
61
  - lib/active_rdf/federation/federation_manager.rb
63
- - lib/active_rdf/objectmanager/namespace.rb
64
- - lib/active_rdf/objectmanager/object_manager.rb
62
+ - lib/active_rdf/federation/active_rdf_adapter.rb
65
63
  - lib/active_rdf/objectmanager/resource.rb
64
+ - lib/active_rdf/objectmanager/namespace.rb
66
65
  - lib/active_rdf/objectmanager/literal.rb
66
+ - lib/active_rdf/objectmanager/object_manager.rb
67
67
  - lib/active_rdf/queryengine/query.rb
68
- - lib/active_rdf/queryengine/query2jars2.rb
69
68
  - lib/active_rdf/queryengine/query2sparql.rb
70
69
  - lib/active_rdf/queryengine/ntriples_parser.rb
70
+ - lib/active_rdf/queryengine/query2jars2.rb
71
71
  test_files: []
72
72
 
73
73
  rdoc_options: []