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 +9 -0
- data/lib/active_rdf/federation/connection_pool.rb +4 -0
- data/lib/active_rdf/federation/federation_manager.rb +1 -0
- data/lib/active_rdf/objectmanager/namespace.rb +2 -2
- data/lib/active_rdf/objectmanager/resource.rb +95 -50
- data/lib/active_rdf/queryengine/query.rb +21 -13
- data/lib/active_rdf/queryengine/query2sparql.rb +11 -13
- data/lib/active_rdf.rb +1 -1
- data/lib/active_rdf_log.rb +1 -1
- data/test/common.rb +12 -4
- data/test/objectmanager/test_object_manager.rb +16 -4
- data/test/objectmanager/test_resource_reading.rb +31 -8
- data/test/objectmanager/test_resource_writing.rb +5 -1
- data/test/test_person_data.nt +2 -0
- metadata +11 -11
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)
|
@@ -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
|
-
|
25
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
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?(
|
206
|
+
if Namespace.abbreviations.include?(methodname.to_sym)
|
161
207
|
namespace = Object.new
|
162
|
-
@@uri =
|
208
|
+
@@uri = methodname
|
163
209
|
@@subject = self
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
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
|
-
|
171
|
-
|
172
|
-
|
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
|
-
|
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
|
61
|
+
# Adds sort predicates
|
61
62
|
def sort *s
|
62
|
-
|
63
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
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
data/lib/active_rdf_log.rb
CHANGED
@@ -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
|
-
|
31
|
-
|
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)
|
82
|
-
|
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
|
37
|
-
assert(defined? RDFS
|
38
|
-
assert(defined? TEST::Person
|
39
|
-
assert(defined? 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 =
|
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
|
25
|
-
assert_equal [
|
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
|
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
|
43
|
-
# rdfs:label, rdfs:comment, etc.
|
44
|
-
assert_equal
|
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
|
-
|
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
|
data/test/test_person_data.nt
CHANGED
@@ -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.
|
7
|
-
date: 2007-
|
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/
|
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/
|
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: []
|