activerdf 1.4 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
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: []