activerdf 1.6.8 → 1.6.9

Sign up to get free protection for your applications and to get access to all the features.
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
- # Represents an RDF literal, optionally datatyped.
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
- attr_reader :value, :type, :language
9
- @value, @type, @language = nil, nil, nil
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
- # Constructs literal with given datatype. If no datatype is given, automatic
12
- # conversion from Ruby to XSD datatype is tried.
13
- def initialize(value, type_or_language=nil)
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
- # the type_or_language was not empty and did not start with a @ so it must be a data type
33
- @type = type_or_language
34
- end
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
- # returns string serialisation of literal, e.g. "test"^^xsd:string
39
- def to_s
40
- if type
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
- "\"value\""
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
- uri <=> other.uri
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
- return predicate_invocation(@predicates[methodname], args, update, flatten)
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, *args)
233
- # check if updating or reading predicate value
234
- if localname.to_s[-1..-1] == '='
235
- # set value
236
- predicate = Namespace.lookup(@@uri, localname.to_s[0..-2])
237
- args.each { |value| FederationManager.add(@@subject, predicate, value) }
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
- # read value
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
- return predicate_invocation(pred, args, update, flatten)
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
- q = Query.new.distinct(:p)
400
+ Query.new.distinct(:p).where(self, :p, :o).execute
361
401
  else
362
- q = Query.new.select(:p)
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
- ## TODO: ensure that we don't use this anywhere before removing it!!
382
- #def Resource.to_s
383
- # "<#{uri}>"
384
- #end
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
- private
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(Node)
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 BNode
47
+ when MatchBNode
30
48
  RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
31
- when Resource
49
+ when MatchResource
32
50
  RDFS::Resource.new($1)
33
51
  end
34
52
 
35
53
  predicate = case nodes[1]
36
- when Resource
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 BNode
60
+ when MatchBNode
43
61
  RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
44
- when Literal
45
- fix_unicode($1)
46
- when Resource
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
- Node = Regexp.union(/"(?:\\"|[^"])*"/,/_:\S*/,/<[^>]*>/)
58
- BNode = /_:(\S*)/
59
- Resource = /<([^>]*)>/
60
- Literal = /"((?:\\"|[^"])*)"/
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.respond_to? :uri
61
- term.to_s
60
+ if term.is_a?(Symbol)
61
+ "?#{term}"
62
62
  else
63
- case term
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
- # test with explicit datatype
20
- test = Literal.new('test', XSD::string)
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 = Literal.new('test')
27
- assert_equal '"test"^^<http://www.w3.org/2001/XMLSchema#string>', test.to_s
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 = Literal.new(18)
31
- assert_equal '"18"^^<http://www.w3.org/2001/XMLSchema#integer>', test.to_s
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 = Literal.new(true)
35
- assert_equal '"true"^^<http://www.w3.org/2001/XMLSchema#boolean>', test.to_s
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 = Literal.new('test')
40
- test2 = Literal.new('test', XSD::string)
41
- assert_equal test2.to_s, test1.to_s
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 = Literal.new('cat')
46
- cat_en = Literal.new('cat', '@en')
47
- assert_equal '"cat"@en', cat_en.to_s
48
- assert_not_equal cat.to_s, cat_en.to_s
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', Literal.new('dog', '@en-GB').to_s
51
- assert_equal '"dog"@en@test', Literal.new('dog', '@en@test').to_s
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 '27', @eyal.age
57
- assert_equal '27', @eyal.test::age
58
- assert_equal ['27'], @eyal.all_age
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
- assert_nothing_raised { eyal.ar::age = 100 }
23
- assert_equal '100', eyal.ar::age
24
- assert_equal ['100'], eyal.all_ar::age
22
+ eyal.ar::age = 100
23
+ assert_equal 100, eyal.ar::age
24
+ assert_equal [100], eyal.all_ar::age
25
25
 
26
- adapter.load "#{File.dirname(__FILE__)}/../test_person_data.nt"
27
- assert_nothing_raised { eyal.age = 18 }
28
- assert_equal ['100', '18', '27'], eyal.age
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'), '30')
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
- # 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
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'), '30')
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
@@ -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 '27', eyal.age
46
- eyal.age = 30
47
-
48
- assert eyal.age.include?('30')
49
- assert eyal.age.include?('27')
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
 
@@ -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.8
7
- date: 2007-11-01 00:00:00 +01:00
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/queryengine
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/federation/active_rdf_adapter.rb
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/queryengine
67
- - lib/active_rdf/queryengine/query.rb
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