activerdf 1.6.8 → 1.6.9
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 +4 -0
- data/lib/active_rdf/federation/federation_manager.rb +7 -0
- data/lib/active_rdf/instance_exec.rb +13 -0
- data/lib/active_rdf/objectmanager/literal.rb +52 -35
- data/lib/active_rdf/objectmanager/resource.rb +95 -41
- data/lib/active_rdf/queryengine/ntriples_parser.rb +35 -12
- data/lib/active_rdf/queryengine/query2sparql.rb +3 -8
- data/test/objectmanager/test_literal.rb +17 -18
- data/test/objectmanager/test_object_manager.rb +26 -0
- data/test/objectmanager/test_resource_reading.rb +3 -3
- data/test/objectmanager/test_resource_writing.rb +10 -6
- data/test/queryengine/test_ntriples_parser.rb +16 -1
- data/test/queryengine/test_query2sparql.rb +12 -14
- data/test/queryengine/test_query_engine.rb +2 -2
- data/test/test_adapters.rb +12 -5
- data/test/test_person_data.nt +2 -2
- metadata +23 -24
- data/test/queryengine/test_query.rb +0 -55
- data/test/queryengine/test_query2jars2.rb +0 -51
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== activerdf (1.6.9) Fri, 08 Feb 2008 13:36:31 +0100
|
2
|
+
* automatic conversion from typed literals to Ruby internal datatypes
|
3
|
+
* added Resource#to_xml (José Ignacio)
|
4
|
+
|
1
5
|
== activerdf (1.6.8) Thu, 01 Nov 2007 15:55:38 +0100
|
2
6
|
* no need for ObjectManager.construct_classes (done during namespace registration)
|
3
7
|
* small fix to running form source on jruby
|
@@ -11,6 +11,13 @@ class FederationManager
|
|
11
11
|
ConnectionPool.write_adapter.add(s,p,o)
|
12
12
|
end
|
13
13
|
|
14
|
+
# delete triple s,p,o from the currently selected write adapter (s and p are
|
15
|
+
# mandatory, o is optional, symbols are interpreted as wildcards)
|
16
|
+
def FederationManager.delete(s,p,o=:all)
|
17
|
+
raise ActiveRdfError, "cannot write without a write-adapter" unless ConnectionPool.write_adapter
|
18
|
+
ConnectionPool.write_adapter.delete(s,p,o)
|
19
|
+
end
|
20
|
+
|
14
21
|
# executes read-only queries
|
15
22
|
# by distributing query over complete read-pool
|
16
23
|
# and aggregating the results
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Kernel
|
2
|
+
# Like instace_eval but allows parameters to be passed.
|
3
|
+
def instance_exec(*args, &block)
|
4
|
+
mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
|
5
|
+
Object.class_eval{ define_method(mname, &block) }
|
6
|
+
begin
|
7
|
+
ret = send(mname, *args)
|
8
|
+
ensure
|
9
|
+
Object.class_eval{ undef_method(mname) } rescue nil
|
10
|
+
end
|
11
|
+
ret
|
12
|
+
end
|
13
|
+
end
|
@@ -1,48 +1,65 @@
|
|
1
1
|
require 'active_rdf'
|
2
2
|
|
3
|
-
|
4
|
-
# TODO: language tags
|
5
|
-
class Literal
|
3
|
+
module Literal
|
6
4
|
Namespace.register :xsd, 'http://www.w3.org/2001/XMLSchema#'
|
5
|
+
def xsd_type
|
6
|
+
case self
|
7
|
+
when String
|
8
|
+
XSD::string
|
9
|
+
when Integer
|
10
|
+
XSD::integer
|
11
|
+
when TrueClass, FalseClass
|
12
|
+
XSD::boolean
|
13
|
+
when DateTime, Date, Time
|
14
|
+
XSD::date
|
15
|
+
end
|
16
|
+
end
|
7
17
|
|
8
|
-
|
9
|
-
|
18
|
+
def self.typed(value, type)
|
19
|
+
case type
|
20
|
+
when XSD::string
|
21
|
+
String.new(value)
|
22
|
+
when XSD::date
|
23
|
+
DateTime.parse(value)
|
24
|
+
when XSD::boolean
|
25
|
+
value == 'true' or value == 1
|
26
|
+
when XSD::integer
|
27
|
+
value.to_i
|
28
|
+
end
|
29
|
+
end
|
10
30
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@value = value
|
15
|
-
|
16
|
-
if type_or_language.nil?
|
17
|
-
# deduce type from the given value
|
18
|
-
@type = case value
|
19
|
-
when String
|
20
|
-
XSD::string
|
21
|
-
when Date, Time, DateTime
|
22
|
-
XSD::date
|
23
|
-
when TrueClass, FalseClass
|
24
|
-
XSD::boolean
|
25
|
-
when Fixnum
|
26
|
-
XSD::integer
|
27
|
-
end
|
28
|
-
elsif type_or_language[0..0] == "@"
|
29
|
-
# a language tag has been given
|
30
|
-
@language = type_or_language[1..type_or_language.length]
|
31
|
+
def to_ntriple
|
32
|
+
if $activerdf_without_xsdtype
|
33
|
+
"\"#{to_s}\""
|
31
34
|
else
|
32
|
-
#
|
33
|
-
|
34
|
-
|
35
|
+
"\"#{to_s}\"^^#{xsd_type}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class String; include Literal; end
|
41
|
+
class Integer; include Literal; end
|
42
|
+
class DateTime; include Literal; end
|
43
|
+
class Date; include Literal; end
|
44
|
+
class Time; include Literal; end
|
45
|
+
class TrueClass; include Literal; end
|
46
|
+
class FalseClass; include Literal; end
|
47
|
+
|
48
|
+
class LocalizedString < String
|
49
|
+
include Literal
|
50
|
+
attr_reader :lang
|
51
|
+
def initialize value, lang=nil
|
52
|
+
super(value)
|
35
53
|
|
54
|
+
@lang = lang
|
55
|
+
@lang = lang[1..-1] if @lang[0..0] == '@'
|
36
56
|
end
|
37
57
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
"\"#{value}\"^^#{type.to_s}"
|
42
|
-
elsif language
|
43
|
-
"\"#{value}\"@#{language}"
|
58
|
+
def to_ntriple
|
59
|
+
if @lang
|
60
|
+
"\"#{to_s}\"@#@lang"
|
44
61
|
else
|
45
|
-
|
62
|
+
super
|
46
63
|
end
|
47
64
|
end
|
48
65
|
end
|
@@ -2,9 +2,7 @@ require 'active_rdf'
|
|
2
2
|
require 'objectmanager/object_manager'
|
3
3
|
require 'objectmanager/namespace'
|
4
4
|
require 'queryengine/query'
|
5
|
-
|
6
|
-
# TODO: finish removal of ObjectManager.construct_classes: make dynamic finders
|
7
|
-
# accessible on instance level, and probably more stuff.
|
5
|
+
require 'instance_exec'
|
8
6
|
|
9
7
|
module RDFS
|
10
8
|
# Represents an RDF resource and manages manipulations of that resource,
|
@@ -28,7 +26,7 @@ module RDFS
|
|
28
26
|
# allow Resource.new(other_resource)
|
29
27
|
when RDFS::Resource
|
30
28
|
uri.uri
|
31
|
-
# allow Resource.new(<uri>) by stripping out <>
|
29
|
+
# allow Resource.new('<uri>') by stripping out <>
|
32
30
|
when /^<([^>]*)>$/
|
33
31
|
$1
|
34
32
|
# allow Resource.new('uri')
|
@@ -55,21 +53,53 @@ module RDFS
|
|
55
53
|
##### start of instance-level code
|
56
54
|
##### ######
|
57
55
|
|
56
|
+
def abbreviation; [Namespace.prefix(uri).to_s, localname]; end
|
58
57
|
# a resource is same as another if they both represent the same uri
|
59
|
-
def ==(other)
|
58
|
+
def ==(other);
|
60
59
|
other.respond_to?(:uri) ? other.uri == self.uri : false
|
61
60
|
end
|
62
61
|
alias_method 'eql?','=='
|
63
62
|
|
64
63
|
# overriding hash to use uri.hash
|
65
64
|
# needed for array.uniq
|
66
|
-
def hash
|
67
|
-
uri.hash
|
68
|
-
end
|
65
|
+
def hash; uri.hash; end
|
69
66
|
|
70
67
|
# overriding sort based on uri
|
71
|
-
def <=>(other)
|
72
|
-
|
68
|
+
def <=>(other); uri <=> other.uri; end
|
69
|
+
def to_ntriple; "<#{uri}>"; end
|
70
|
+
def self.to_ntriple; "<#{class_uri.uri}>"; end
|
71
|
+
|
72
|
+
def to_xml
|
73
|
+
base = Namespace.expand(Namespace.prefix(self),'').chop
|
74
|
+
|
75
|
+
xml = "<?xml version=\"1.0\"?>\n"
|
76
|
+
xml += "<rdf:RDF xmlns=\"#{base}\#\"\n"
|
77
|
+
Namespace.abbreviations.each { |p| uri = Namespace.expand(p,''); xml += " xmlns:#{p.to_s}=\"#{uri}\"\n" if uri != base + '#' }
|
78
|
+
xml += " xml:base=\"#{base}\">\n"
|
79
|
+
|
80
|
+
xml += "<rdf:Description rdf:about=\"\##{localname}\">\n"
|
81
|
+
direct_predicates.each do |p|
|
82
|
+
objects = Query.new.distinct(:o).where(self, p, :o).execute
|
83
|
+
objects.each do |obj|
|
84
|
+
prefix, localname = Namespace.prefix(p), Namespace.localname(p)
|
85
|
+
pred_xml = if prefix
|
86
|
+
"%s:%s" % [prefix, localname]
|
87
|
+
else
|
88
|
+
p.uri
|
89
|
+
end
|
90
|
+
|
91
|
+
case obj
|
92
|
+
when RDFS::Resource
|
93
|
+
xml += " <#{pred_xml} rdf:resource=\"#{obj.uri}\"/>\n"
|
94
|
+
when LocalizedString
|
95
|
+
xml += " <#{pred_xml} xml:lang=\"#{obj.lang}\">#{obj}</#{pred_xml}>\n"
|
96
|
+
else
|
97
|
+
xml += " <#{pred_xml} rdf:datatype=\"#{obj.xsd_type.uri}\">#{obj}</#{pred_xml}>\n"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
xml += "</rdf:Description>\n"
|
102
|
+
xml += "</rdf:RDF>"
|
73
103
|
end
|
74
104
|
|
75
105
|
##### #####
|
@@ -217,7 +247,11 @@ module RDFS
|
|
217
247
|
|
218
248
|
# check possibility (5)
|
219
249
|
if @predicates.include?(methodname)
|
220
|
-
|
250
|
+
if update
|
251
|
+
return set_predicate(@predicates[methodname], args)
|
252
|
+
else
|
253
|
+
return get_predicate(@predicates[methodname])
|
254
|
+
end
|
221
255
|
end
|
222
256
|
|
223
257
|
# check possibility (6)
|
@@ -229,16 +263,18 @@ module RDFS
|
|
229
263
|
|
230
264
|
# catch the invocation on the namespace
|
231
265
|
class <<namespace
|
232
|
-
def method_missing(localname, *
|
233
|
-
|
234
|
-
if
|
235
|
-
|
236
|
-
|
237
|
-
|
266
|
+
def method_missing(localname, *values)
|
267
|
+
update = localname.to_s[-1..-1] == '='
|
268
|
+
predicate = if update
|
269
|
+
Namespace.lookup(@@uri, localname.to_s[0..-2])
|
270
|
+
else
|
271
|
+
Namespace.lookup(@@uri, localname)
|
272
|
+
end
|
273
|
+
|
274
|
+
if update
|
275
|
+
@@subject.set_predicate(predicate, values)
|
238
276
|
else
|
239
|
-
|
240
|
-
predicate = Namespace.lookup(@@uri, localname)
|
241
|
-
Query.new.distinct(:o).where(@@subject, predicate, :o).execute(:flatten => @@flatten)
|
277
|
+
@@subject.get_predicate(predicate, @@flatten)
|
242
278
|
end
|
243
279
|
end
|
244
280
|
private(:type)
|
@@ -255,7 +291,11 @@ module RDFS
|
|
255
291
|
# checking possibility (1) and (3)
|
256
292
|
candidates.each do |pred|
|
257
293
|
if Namespace.localname(pred) == methodname
|
258
|
-
|
294
|
+
if update
|
295
|
+
return set_predicate(pred, args)
|
296
|
+
else
|
297
|
+
return get_predicate(pred, flatten)
|
298
|
+
end
|
259
299
|
end
|
260
300
|
end
|
261
301
|
|
@@ -357,12 +397,10 @@ module RDFS
|
|
357
397
|
# returns all predicates that are directly defined for this resource
|
358
398
|
def direct_predicates(distinct = true)
|
359
399
|
if distinct
|
360
|
-
|
400
|
+
Query.new.distinct(:p).where(self, :p, :o).execute
|
361
401
|
else
|
362
|
-
|
402
|
+
Query.new.select(:p).where(self, :p, :o).execute
|
363
403
|
end
|
364
|
-
q.where(self,:p, :o).execute
|
365
|
-
#return (direct + direct.collect {|d| ancestors(d)}).flatten.uniq
|
366
404
|
end
|
367
405
|
|
368
406
|
def property_accessors
|
@@ -378,28 +416,44 @@ module RDFS
|
|
378
416
|
"<#{uri}>"
|
379
417
|
end
|
380
418
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
419
|
+
def set_predicate(predicate, values)
|
420
|
+
FederationManager.delete(self, predicate)
|
421
|
+
values.flatten.each {|v| FederationManager.add(self, predicate, v) }
|
422
|
+
values
|
423
|
+
end
|
385
424
|
|
386
|
-
|
425
|
+
def get_predicate(predicate, flatten=false)
|
426
|
+
values = Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
|
427
|
+
|
428
|
+
# TODO: fix '<<' for Fixnum values etc (we cannot use values.instance_eval
|
429
|
+
# because Fixnum cannot do instace_eval, they're not normal classes)
|
430
|
+
if values.is_a?(RDFS::Resource) and !values.nil?
|
431
|
+
# prepare returned values for accepting << later, eg. in
|
432
|
+
# eyal.foaf::knows << knud
|
433
|
+
#
|
434
|
+
# store @subject, @predicate in returned values
|
435
|
+
values.instance_exec(self, predicate) do |s,p|
|
436
|
+
@subj = s
|
437
|
+
@pred = p
|
438
|
+
end
|
387
439
|
|
440
|
+
# overwrite << to add triple to db
|
441
|
+
values.instance_eval do
|
442
|
+
def <<(value)
|
443
|
+
FederationManager.add(@subj, @pred, value)
|
444
|
+
end
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
values
|
449
|
+
end
|
450
|
+
|
451
|
+
private
|
388
452
|
# def ancestors(predicate)
|
389
453
|
# subproperty = Namespace.lookup(:rdfs,:subPropertyOf)
|
390
454
|
# Query.new.distinct(:p).where(predicate, subproperty, :p).execute
|
391
455
|
# end
|
392
456
|
|
393
|
-
def predicate_invocation(predicate, args, update, flatten)
|
394
|
-
if update
|
395
|
-
args.each do |value|
|
396
|
-
FederationManager.add(self, predicate, value)
|
397
|
-
end
|
398
|
-
args
|
399
|
-
else
|
400
|
-
Query.new.distinct(:o).where(self, predicate, :o).execute(:flatten => flatten)
|
401
|
-
end
|
402
|
-
end
|
403
457
|
|
404
458
|
# returns all rdf:types of this resource but without a conversion to
|
405
459
|
# Ruby classes (it returns an array of RDFS::Resources)
|
@@ -519,6 +573,6 @@ class DynamicFinderProxy
|
|
519
573
|
# the initialize method so all return values are ignored, instead the proxy
|
520
574
|
# itself is returned)
|
521
575
|
@value = query.execute
|
522
|
-
return value
|
576
|
+
return @value
|
523
577
|
end
|
524
578
|
end
|
@@ -7,6 +7,24 @@ require 'strscan'
|
|
7
7
|
|
8
8
|
# ntriples parser
|
9
9
|
class NTriplesParser
|
10
|
+
def self.parse_node input
|
11
|
+
case input
|
12
|
+
when MatchBNode
|
13
|
+
RDFS::Resource.new("http://www.activerdf.org/bnode/#{UUID.random_create}/#$1")
|
14
|
+
when MatchLiteral
|
15
|
+
value = fix_unicode($1)
|
16
|
+
if $2
|
17
|
+
Literal.typed(value, RDFS::Resource.new($2))
|
18
|
+
else
|
19
|
+
value
|
20
|
+
end
|
21
|
+
when MatchResource
|
22
|
+
RDFS::Resource.new($1)
|
23
|
+
else
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
10
28
|
# parses an input string of ntriples and returns a nested array of [s, p, o]
|
11
29
|
# (which are in turn ActiveRDF objects)
|
12
30
|
def self.parse(input)
|
@@ -19,31 +37,36 @@ class NTriplesParser
|
|
19
37
|
scanner = StringScanner.new(triple)
|
20
38
|
scanner.skip(/\s+/)
|
21
39
|
while not scanner.eos?
|
22
|
-
nodes << scanner.scan(
|
40
|
+
nodes << scanner.scan(MatchNode)
|
23
41
|
scanner.skip(/\s+/)
|
24
42
|
scanner.terminate if nodes.size == 3
|
25
43
|
end
|
26
44
|
|
27
45
|
# handle bnodes if necessary (bnodes need to have uri generated)
|
28
46
|
subject = case nodes[0]
|
29
|
-
when
|
47
|
+
when MatchBNode
|
30
48
|
RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
|
31
|
-
when
|
49
|
+
when MatchResource
|
32
50
|
RDFS::Resource.new($1)
|
33
51
|
end
|
34
52
|
|
35
53
|
predicate = case nodes[1]
|
36
|
-
when
|
54
|
+
when MatchResource
|
37
55
|
RDFS::Resource.new($1)
|
38
56
|
end
|
39
57
|
|
40
58
|
# handle bnodes and literals if necessary (literals need unicode fixing)
|
41
59
|
object = case nodes[2]
|
42
|
-
when
|
60
|
+
when MatchBNode
|
43
61
|
RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
|
44
|
-
when
|
45
|
-
|
46
|
-
|
62
|
+
when MatchLiteral
|
63
|
+
value = fix_unicode($1)
|
64
|
+
if $2
|
65
|
+
Literal.typed(value, RDFS::Resource.new($2))
|
66
|
+
else
|
67
|
+
value
|
68
|
+
end
|
69
|
+
when MatchResource
|
47
70
|
RDFS::Resource.new($1)
|
48
71
|
end
|
49
72
|
|
@@ -54,10 +77,10 @@ class NTriplesParser
|
|
54
77
|
|
55
78
|
private
|
56
79
|
# constants for extracting resources/literals from sql results
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
80
|
+
MatchNode = Regexp.union(/"(?:\\"|[^"])*"(?:\^\^\S+)?/,/_:\S*/,/<[^>]*>/)
|
81
|
+
MatchBNode = /_:(\S*)/
|
82
|
+
MatchResource = /<([^>]*)>/
|
83
|
+
MatchLiteral = /"((?:\\"|[^"])*)"(?:\^\^<(\S+)>)?/
|
61
84
|
|
62
85
|
# fixes unicode characters in literals (because we parse them wrongly somehow)
|
63
86
|
def self.fix_unicode(str)
|
@@ -57,15 +57,10 @@ class Query2SPARQL
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def self.construct_clause(term)
|
60
|
-
if term.
|
61
|
-
term
|
60
|
+
if term.is_a?(Symbol)
|
61
|
+
"?#{term}"
|
62
62
|
else
|
63
|
-
|
64
|
-
when Symbol
|
65
|
-
'?' + term.to_s
|
66
|
-
else
|
67
|
-
term.to_s
|
68
|
-
end
|
63
|
+
term.to_ntriple
|
69
64
|
end
|
70
65
|
end
|
71
66
|
|
@@ -16,38 +16,37 @@ class TestLiteral < Test::Unit::TestCase
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def test_xsd_string
|
19
|
-
|
20
|
-
|
21
|
-
assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_s
|
19
|
+
test = Literal.typed('test', XSD::string)
|
20
|
+
assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_ntriple
|
22
21
|
end
|
23
22
|
|
24
23
|
def test_automatic_conversion
|
25
24
|
# infer string
|
26
|
-
test =
|
27
|
-
assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.
|
25
|
+
test = 'test'
|
26
|
+
assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_ntriple
|
28
27
|
|
29
28
|
# infer integer
|
30
|
-
test =
|
31
|
-
assert_equal '"18"^^<http://www.w3.org/2001/XMLSchema#integer>', test.
|
29
|
+
test = 18
|
30
|
+
assert_equal '"18"^^<http://www.w3.org/2001/XMLSchema#integer>', test.to_ntriple
|
32
31
|
|
33
32
|
# infer boolean
|
34
|
-
test =
|
35
|
-
assert_equal '"true"^^<http://www.w3.org/2001/XMLSchema#boolean>', test.
|
33
|
+
test = true
|
34
|
+
assert_equal '"true"^^<http://www.w3.org/2001/XMLSchema#boolean>', test.to_ntriple
|
36
35
|
end
|
37
36
|
|
38
37
|
def test_equality
|
39
|
-
test1 =
|
40
|
-
test2 = Literal.
|
41
|
-
assert_equal test2.
|
38
|
+
test1 = 'test'
|
39
|
+
test2 = Literal.typed('test', XSD::string)
|
40
|
+
assert_equal test2.to_ntriple, test1.to_ntriple
|
42
41
|
end
|
43
42
|
|
44
43
|
def test_language_tag
|
45
|
-
cat =
|
46
|
-
cat_en =
|
47
|
-
assert_equal '"cat"@en', cat_en.
|
48
|
-
assert_not_equal cat.
|
44
|
+
cat = 'cat'
|
45
|
+
cat_en = LocalizedString.new('cat', '@en')
|
46
|
+
assert_equal '"cat"@en', cat_en.to_ntriple
|
47
|
+
assert_not_equal cat.to_ntriple, cat_en.to_ntriple
|
49
48
|
|
50
|
-
assert_equal '"dog"@en-GB',
|
51
|
-
assert_equal '"dog"@en@test',
|
49
|
+
assert_equal '"dog"@en-GB', LocalizedString.new('dog', '@en-GB').to_ntriple
|
50
|
+
assert_equal '"dog"@en@test', LocalizedString.new('dog', '@en@test').to_ntriple
|
52
51
|
end
|
53
52
|
end
|
@@ -65,4 +65,30 @@ class TestObjectManager < Test::Unit::TestCase
|
|
65
65
|
assert_equal TEST::Person, RDFS::Resource.new('http://activerdf.org/test/Person')
|
66
66
|
assert_equal RDFS::Resource.new('http://activerdf.org/test/Person'), TEST::Person
|
67
67
|
end
|
68
|
+
|
69
|
+
def test_to_xml
|
70
|
+
get_adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
|
71
|
+
Namespace.register(:test, 'http://activerdf.org/test/')
|
72
|
+
|
73
|
+
eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
|
74
|
+
eyal.age = 29
|
75
|
+
assert_equal 29, eyal.age
|
76
|
+
snippet =
|
77
|
+
'<rdf:Description rdf:about="#eyal">
|
78
|
+
<test:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">29</test:age>
|
79
|
+
<test:eye rdf:datatype="http://www.w3.org/2001/XMLSchema#string">blue</test:eye>
|
80
|
+
<rdf:type rdf:resource="http://activerdf.org/test/Person"/>
|
81
|
+
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
|
82
|
+
</rdf:Description>
|
83
|
+
</rdf:RDF>'
|
84
|
+
assert eyal.to_xml.include?(snippet)
|
85
|
+
|
86
|
+
|
87
|
+
url = 'http://gollem.swi.psy.uva.nl/cgi-bin/rdf-parser'
|
88
|
+
uri = URI.parse(url)
|
89
|
+
req = Net::HTTP::Post.new(url)
|
90
|
+
req.set_form_data('rdf' => eyal.to_xml)
|
91
|
+
res = Net::HTTP.new(uri.host, uri.port).start { |http| http.request(req) }
|
92
|
+
assert_match /RDF statement parsed successfully/, res.body, "SWI-Prolog failed to parse XML output"
|
93
|
+
end
|
68
94
|
end
|
@@ -53,9 +53,9 @@ class TestResourceReading < Test::Unit::TestCase
|
|
53
53
|
|
54
54
|
def test_eyal_age
|
55
55
|
# triple exists '<eyal> age 27'
|
56
|
-
assert_equal
|
57
|
-
assert_equal
|
58
|
-
assert_equal [
|
56
|
+
assert_equal 27, @eyal.age
|
57
|
+
assert_equal 27, @eyal.test::age
|
58
|
+
assert_equal [27], @eyal.all_age
|
59
59
|
|
60
60
|
# Person has property car, but eyal has no value for it
|
61
61
|
assert_equal nil, @eyal.car
|
@@ -19,12 +19,16 @@ class TestResourceWriting < Test::Unit::TestCase
|
|
19
19
|
eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
|
20
20
|
assert_raises(ActiveRdfError) { eyal.age = 18 }
|
21
21
|
|
22
|
-
|
23
|
-
assert_equal
|
24
|
-
assert_equal [
|
22
|
+
eyal.ar::age = 100
|
23
|
+
assert_equal 100, eyal.ar::age
|
24
|
+
assert_equal [100], eyal.all_ar::age
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
# << fails on Fixnums , because Ruby doesn't allow us to change behaviour of
|
27
|
+
# << on Fixnums
|
28
|
+
eyal.age << 18
|
29
|
+
assert_equal 100, eyal.age
|
30
|
+
|
31
|
+
eyal.ar::age = [100, 80]
|
32
|
+
assert_equal [100, 80], eyal.ar::age
|
29
33
|
end
|
30
34
|
end
|
@@ -51,6 +51,21 @@ EOF
|
|
51
51
|
triples = NTriplesParser.parse(string)
|
52
52
|
|
53
53
|
assert_equal 1, triples.size
|
54
|
-
assert_equal literal, triples.first[2]
|
54
|
+
assert_equal literal, triples.first[2]
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_datatypes
|
58
|
+
string =<<EOF
|
59
|
+
<s> <p> "blue" .
|
60
|
+
<s> <p> "29"^^<http://www.w3.org/2001/XMLSchema#integer> .
|
61
|
+
<s> <p> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
|
62
|
+
<s> <p> "2002-10-10T00:00:00+13"^^<http://www.w3.org/2001/XMLSchema#date> .
|
63
|
+
EOF
|
64
|
+
triples = NTriplesParser.parse(string)
|
65
|
+
assert_equal 4, triples.size
|
66
|
+
assert_equal 'blue', triples[0][2]
|
67
|
+
assert_equal 29, triples[1][2]
|
68
|
+
assert_equal triples[2][2], false
|
69
|
+
assert_equal triples[3][2], DateTime.parse('2002-10-10T00:00:00+13')
|
55
70
|
end
|
56
71
|
end
|
@@ -8,22 +8,18 @@ require 'queryengine/query2sparql'
|
|
8
8
|
require "#{File.dirname(__FILE__)}/../common"
|
9
9
|
|
10
10
|
class TestQuery2Sparql < Test::Unit::TestCase
|
11
|
-
def setup
|
12
|
-
end
|
13
|
-
|
14
|
-
def teardown
|
15
|
-
end
|
11
|
+
def setup; end
|
12
|
+
def teardown; end
|
16
13
|
|
17
14
|
def test_sparql_generation
|
18
|
-
|
19
15
|
# TODO: write tests for distinct, ask
|
20
16
|
|
21
17
|
query = Query.new
|
22
18
|
query.select(:s)
|
23
|
-
query.where(:s, RDFS::Resource.new('predicate'),
|
19
|
+
query.where(:s, RDFS::Resource.new('predicate'), 30)
|
24
20
|
|
25
21
|
generated = Query2SPARQL.translate(query)
|
26
|
-
expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
|
22
|
+
expected = "SELECT ?s WHERE { ?s <predicate> \"30\"^^<http://www.w3.org/2001/XMLSchema#integer> . } "
|
27
23
|
assert_equal expected, generated
|
28
24
|
|
29
25
|
query = Query.new
|
@@ -33,13 +29,15 @@ class TestQuery2Sparql < Test::Unit::TestCase
|
|
33
29
|
generated = Query2SPARQL.translate(query)
|
34
30
|
expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
|
35
31
|
assert_equal expected, generated
|
32
|
+
end
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
34
|
+
def test_sparql_distinct
|
35
|
+
query = Query.new
|
36
|
+
query.distinct(:s)
|
37
|
+
query.where(:s, RDFS::Resource.new('foaf:age'), :a)
|
38
|
+
generated = Query2SPARQL.translate(query)
|
39
|
+
expected = "SELECT DISTINCT ?s WHERE { ?s <foaf:age> ?a . } "
|
40
|
+
assert_equal expected, generated
|
43
41
|
end
|
44
42
|
|
45
43
|
def test_query_omnipotent
|
@@ -21,10 +21,10 @@ class TestQueryEngine < Test::Unit::TestCase
|
|
21
21
|
|
22
22
|
query = Query.new
|
23
23
|
query.select(:s)
|
24
|
-
query.where(:s, RDFS::Resource.new('predicate'),
|
24
|
+
query.where(:s, RDFS::Resource.new('predicate'), 30)
|
25
25
|
|
26
26
|
generated = Query2SPARQL.translate(query)
|
27
|
-
expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
|
27
|
+
expected = "SELECT ?s WHERE { ?s <predicate> \"30\"^^<http://www.w3.org/2001/XMLSchema#integer> . } "
|
28
28
|
assert_equal expected, generated
|
29
29
|
|
30
30
|
query = Query.new
|
data/test/test_adapters.rb
CHANGED
@@ -42,11 +42,18 @@ class TestAdapter < Test::Unit::TestCase
|
|
42
42
|
Namespace.register(:test, 'http://activerdf.org/test/')
|
43
43
|
eyal = Namespace.lookup(:test, :eyal)
|
44
44
|
|
45
|
-
assert_equal
|
46
|
-
eyal.age
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
assert_equal 1, eyal.all_age.size
|
46
|
+
assert_equal 27, eyal.age
|
47
|
+
|
48
|
+
# << doesn't work on Fixnums
|
49
|
+
eyal.age << 30
|
50
|
+
assert_equal 1, eyal.all_age.size
|
51
|
+
assert !eyal.all_age.include?(30)
|
52
|
+
assert eyal.all_age.include?(27)
|
53
|
+
|
54
|
+
eyal.age = 40
|
55
|
+
assert_equal 1, eyal.all_age.size
|
56
|
+
assert eyal.age == 40
|
50
57
|
end
|
51
58
|
end
|
52
59
|
|
data/test/test_person_data.nt
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
<http://activerdf.org/test/Person> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> .
|
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
|
-
<http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27" .
|
4
|
+
<http://activerdf.org/test/eyal> <http://activerdf.org/test/age> "27"^^<http://www.w3.org/2001/XMLSchema#integer> .
|
5
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"
|
6
|
+
<http://activerdf.org/test/other> <http://activerdf.org/test/age> "21"^^<http://www.w3.org/2001/XMLSchema#integer> .
|
7
7
|
<http://activerdf.org/test/eyal> <http://activerdf.org/test/eye> "blue" .
|
8
8
|
<http://activerdf.org/test/age> <http://www.w3.org/2000/01/rdf-schema#domain> <http://www.w3.org/2000/01/rdf-schema#Resource> .
|
9
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.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: activerdf
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.6.
|
7
|
-
date:
|
6
|
+
version: 1.6.9
|
7
|
+
date: 2008-02-11 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
|
@@ -32,42 +32,41 @@ files:
|
|
32
32
|
- LICENSE
|
33
33
|
- README
|
34
34
|
- CHANGELOG
|
35
|
+
- test/small-two.nt
|
36
|
+
- test/queryengine
|
37
|
+
- test/queryengine/test_query_engine.rb
|
38
|
+
- test/queryengine/test_ntriples_parser.rb
|
39
|
+
- test/queryengine/test_query2sparql.rb
|
40
|
+
- test/test_person_data.nt
|
35
41
|
- test/federation
|
36
|
-
- test/federation/test_federation_manager.rb
|
37
42
|
- test/federation/test_connection_pool.rb
|
43
|
+
- test/federation/test_federation_manager.rb
|
44
|
+
- test/small-one.nt
|
45
|
+
- test/test_adapters.rb
|
46
|
+
- test/common.rb
|
38
47
|
- test/objectmanager
|
39
|
-
- test/objectmanager/test_resource_reading.rb
|
40
48
|
- test/objectmanager/test_literal.rb
|
41
|
-
- test/objectmanager/test_namespace.rb
|
42
49
|
- test/objectmanager/test_object_manager.rb
|
50
|
+
- test/objectmanager/test_resource_reading.rb
|
43
51
|
- test/objectmanager/test_resource_writing.rb
|
44
|
-
- test/
|
45
|
-
- test/queryengine/test_ntriples_parser.rb
|
46
|
-
- test/queryengine/test_query.rb
|
47
|
-
- test/queryengine/test_query2jars2.rb
|
48
|
-
- test/queryengine/test_query2sparql.rb
|
49
|
-
- test/queryengine/test_query_engine.rb
|
50
|
-
- test/common.rb
|
51
|
-
- test/test_adapters.rb
|
52
|
-
- test/test_person_data.nt
|
53
|
-
- test/small-one.nt
|
54
|
-
- test/small-two.nt
|
52
|
+
- test/objectmanager/test_namespace.rb
|
55
53
|
- lib/active_rdf
|
54
|
+
- lib/active_rdf/queryengine
|
55
|
+
- lib/active_rdf/queryengine/ntriples_parser.rb
|
56
|
+
- lib/active_rdf/queryengine/query.rb
|
57
|
+
- lib/active_rdf/queryengine/query2sparql.rb
|
58
|
+
- lib/active_rdf/queryengine/query2jars2.rb
|
56
59
|
- lib/active_rdf/federation
|
60
|
+
- lib/active_rdf/federation/active_rdf_adapter.rb
|
57
61
|
- lib/active_rdf/federation/connection_pool.rb
|
58
62
|
- lib/active_rdf/federation/federation_manager.rb
|
59
|
-
- lib/active_rdf/
|
63
|
+
- lib/active_rdf/instance_exec.rb
|
60
64
|
- lib/active_rdf/objectmanager
|
61
65
|
- lib/active_rdf/objectmanager/resource.rb
|
62
|
-
- lib/active_rdf/objectmanager/namespace.rb
|
63
66
|
- lib/active_rdf/objectmanager/literal.rb
|
64
|
-
- lib/active_rdf/objectmanager/object_manager.rb
|
65
67
|
- lib/active_rdf/objectmanager/bnode.rb
|
66
|
-
- lib/active_rdf/
|
67
|
-
- lib/active_rdf/
|
68
|
-
- lib/active_rdf/queryengine/query2sparql.rb
|
69
|
-
- lib/active_rdf/queryengine/ntriples_parser.rb
|
70
|
-
- lib/active_rdf/queryengine/query2jars2.rb
|
68
|
+
- lib/active_rdf/objectmanager/namespace.rb
|
69
|
+
- lib/active_rdf/objectmanager/object_manager.rb
|
71
70
|
- lib/active_rdf.rb
|
72
71
|
- lib/active_rdf_log.rb
|
73
72
|
- lib/active_rdf_helpers.rb
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# Author:: Eyal Oren
|
2
|
-
# Copyright:: (c) 2005-2006
|
3
|
-
# License:: LGPL
|
4
|
-
|
5
|
-
require 'test/unit'
|
6
|
-
require 'active_rdf'
|
7
|
-
require 'queryengine/query'
|
8
|
-
require "#{File.dirname(__FILE__)}/../common"
|
9
|
-
|
10
|
-
class TestQuery < Test::Unit::TestCase
|
11
|
-
def setup
|
12
|
-
end
|
13
|
-
|
14
|
-
def teardown
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_sparql_generation
|
18
|
-
query = Query.new
|
19
|
-
query.select(:s)
|
20
|
-
query.where(:s, RDFS::Resource.new('predicate'), '30')
|
21
|
-
generated = Query2SPARQL.translate(query)
|
22
|
-
expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
|
23
|
-
assert_equal expected, generated
|
24
|
-
|
25
|
-
query = Query.new
|
26
|
-
query.select(:s)
|
27
|
-
query.where(:s, RDFS::Resource.new('foaf:age'), :a)
|
28
|
-
query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
|
29
|
-
generated = Query2SPARQL.translate(query)
|
30
|
-
expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
|
31
|
-
assert_equal expected, generated
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_sparql_distinct
|
35
|
-
query = Query.new
|
36
|
-
query.distinct(:s)
|
37
|
-
query.where(:s, RDFS::Resource.new('foaf:age'), :a)
|
38
|
-
generated = Query2SPARQL.translate(query)
|
39
|
-
expected = "SELECT DISTINCT ?s WHERE { ?s <foaf:age> ?a . } "
|
40
|
-
assert_equal expected, generated
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_query_omnipotent
|
44
|
-
# can define multiple select clauses at once or separately
|
45
|
-
q1 = Query.new.select(:s,:a)
|
46
|
-
q2 = Query.new.select(:s).select(:a)
|
47
|
-
assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_query_refuses_string_in_where_clause_subject_or_predicate
|
51
|
-
assert_raises(ActiveRdfError)do
|
52
|
-
Query.new.select(:s).where("http://test.org/uri",:p, :o).execute
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
# Author:: Eyal Oren
|
2
|
-
# Copyright:: (c) 2005-2006
|
3
|
-
# License:: LGPL
|
4
|
-
|
5
|
-
require 'test/unit'
|
6
|
-
require 'active_rdf'
|
7
|
-
require 'queryengine/query2jars2'
|
8
|
-
require "#{File.dirname(__FILE__)}/../common"
|
9
|
-
|
10
|
-
class TestQuery2Jars2 < Test::Unit::TestCase
|
11
|
-
def setup
|
12
|
-
end
|
13
|
-
|
14
|
-
def teardown
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_sparql_generation
|
18
|
-
|
19
|
-
# TODO: write tests for distinct, ask
|
20
|
-
|
21
|
-
query = Query.new
|
22
|
-
query.select(:s)
|
23
|
-
query.where(:s, RDFS::Resource.new('predicate'), '30')
|
24
|
-
|
25
|
-
generated = Query2SPARQL.translate(query)
|
26
|
-
expected = "SELECT ?s WHERE { ?s <predicate> \"30\" . } "
|
27
|
-
assert_equal expected, generated
|
28
|
-
|
29
|
-
query = Query.new
|
30
|
-
query.select(:s)
|
31
|
-
query.where(:s, RDFS::Resource.new('foaf:age'), :a)
|
32
|
-
query.where(:a, RDFS::Resource.new('rdf:type'), RDFS::Resource.new('xsd:int'))
|
33
|
-
generated = Query2SPARQL.translate(query)
|
34
|
-
expected = "SELECT ?s WHERE { ?s <foaf:age> ?a . ?a <rdf:type> <xsd:int> . } "
|
35
|
-
assert_equal expected, generated
|
36
|
-
|
37
|
-
# query = Query.new
|
38
|
-
# query.select(:s).select(:a)
|
39
|
-
# query.where(:s, 'foaf:age', :a)
|
40
|
-
# generated = Query2SPARQL.translate(query)
|
41
|
-
# expected = "SELECT DISTINCT ?s ?a WHERE { ?s foaf:age ?a .}"
|
42
|
-
# assert_equal expected, generated
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_query_omnipotent
|
46
|
-
# can define multiple select clauses at once or separately
|
47
|
-
q1 = Query.new.select(:s,:a)
|
48
|
-
q2 = Query.new.select(:s).select(:a)
|
49
|
-
assert_equal Query2SPARQL.translate(q1),Query2SPARQL.translate(q2)
|
50
|
-
end
|
51
|
-
end
|