rdf 0.2.3 → 0.3.0.pre
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/AUTHORS +1 -0
- data/{CONTRIBUTORS → CREDITS} +3 -1
- data/README +17 -8
- data/VERSION +1 -1
- data/etc/doap.nt +28 -10
- data/lib/rdf/format.rb +55 -47
- data/lib/rdf/mixin/countable.rb +3 -6
- data/lib/rdf/mixin/enumerable.rb +69 -69
- data/lib/rdf/mixin/indexable.rb +26 -0
- data/lib/rdf/mixin/mutable.rb +2 -2
- data/lib/rdf/mixin/queryable.rb +50 -12
- data/lib/rdf/mixin/writable.rb +8 -19
- data/lib/rdf/model/literal/boolean.rb +42 -6
- data/lib/rdf/model/literal/date.rb +17 -5
- data/lib/rdf/model/literal/datetime.rb +18 -6
- data/lib/rdf/model/literal/decimal.rb +32 -5
- data/lib/rdf/model/literal/double.rb +32 -5
- data/lib/rdf/model/literal/integer.rb +16 -5
- data/lib/rdf/model/literal/time.rb +6 -6
- data/lib/rdf/model/literal/token.rb +5 -5
- data/lib/rdf/model/literal/xml.rb +5 -5
- data/lib/rdf/model/literal.rb +24 -11
- data/lib/rdf/model/node.rb +14 -13
- data/lib/rdf/model/uri.rb +315 -42
- data/lib/rdf/model/value.rb +1 -1
- data/lib/rdf/ntriples/reader.rb +23 -15
- data/lib/rdf/ntriples/writer.rb +1 -1
- data/lib/rdf/query/pattern.rb +131 -15
- data/lib/rdf/query/solution.rb +94 -29
- data/lib/rdf/query/solutions.rb +202 -0
- data/lib/rdf/query/variable.rb +42 -18
- data/lib/rdf/query.rb +210 -160
- data/lib/rdf/reader.rb +300 -112
- data/lib/rdf/repository.rb +88 -6
- data/lib/rdf/transaction.rb +161 -0
- data/lib/rdf/util/cache.rb +5 -0
- data/lib/rdf/util/file.rb +31 -0
- data/lib/rdf/util/uuid.rb +36 -0
- data/lib/rdf/util.rb +2 -0
- data/lib/rdf/version.rb +3 -3
- data/lib/rdf/vocab.rb +43 -35
- data/lib/rdf/writer.rb +105 -50
- data/lib/rdf.rb +29 -27
- metadata +26 -17
@@ -27,15 +27,42 @@ module RDF; class Literal
|
|
27
27
|
end
|
28
28
|
|
29
29
|
##
|
30
|
-
# Converts
|
30
|
+
# Converts this literal into its canonical lexical representation.
|
31
31
|
#
|
32
|
-
# @return [Literal]
|
33
|
-
# @see http://www.w3.org/TR/xmlschema-2/#boolean
|
34
|
-
def canonicalize
|
32
|
+
# @return [RDF::Literal] `self`
|
33
|
+
# @see http://www.w3.org/TR/xmlschema-2/#boolean-canonical-representation
|
34
|
+
def canonicalize!
|
35
35
|
@string = (@object ? :true : :false).to_s
|
36
36
|
self
|
37
37
|
end
|
38
38
|
|
39
|
+
##
|
40
|
+
# Compares this literal to `other` for sorting purposes.
|
41
|
+
#
|
42
|
+
# @param [Object] other
|
43
|
+
# @return [Integer] `-1`, `0`, or `1`
|
44
|
+
# @since 0.3.0
|
45
|
+
def <=>(other)
|
46
|
+
case other
|
47
|
+
when TrueClass, FalseClass
|
48
|
+
to_i <=> (other ? 1 : 0)
|
49
|
+
when RDF::Literal::Boolean
|
50
|
+
to_i <=> other.to_i
|
51
|
+
else super
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# Returns `true` if this literal is equivalent to `other`.
|
57
|
+
#
|
58
|
+
# @param [Object] other
|
59
|
+
# @return [Boolean] `true` or `false`
|
60
|
+
# @since 0.3.0
|
61
|
+
def ==(other)
|
62
|
+
(self <=> other).zero?
|
63
|
+
end
|
64
|
+
alias_method :===, :==
|
65
|
+
|
39
66
|
##
|
40
67
|
# Returns the value as a string.
|
41
68
|
#
|
@@ -44,6 +71,15 @@ module RDF; class Literal
|
|
44
71
|
@string || @object.to_s
|
45
72
|
end
|
46
73
|
|
74
|
+
##
|
75
|
+
# Returns the value as an integer.
|
76
|
+
#
|
77
|
+
# @return [Integer] `0` or `1`
|
78
|
+
# @since 0.3.0
|
79
|
+
def to_i
|
80
|
+
@object ? 1 : 0
|
81
|
+
end
|
82
|
+
|
47
83
|
##
|
48
84
|
# Returns `true` if this value is `true`.
|
49
85
|
#
|
@@ -59,5 +95,5 @@ module RDF; class Literal
|
|
59
95
|
def false?
|
60
96
|
@object.equal?(false)
|
61
97
|
end
|
62
|
-
end #
|
63
|
-
end; end #
|
98
|
+
end # Boolean
|
99
|
+
end; end # RDF::Literal
|
@@ -23,15 +23,27 @@ module RDF; class Literal
|
|
23
23
|
end
|
24
24
|
|
25
25
|
##
|
26
|
-
# Converts
|
26
|
+
# Converts this literal into its canonical lexical representation.
|
27
27
|
#
|
28
|
-
# @return [Literal]
|
28
|
+
# @return [RDF::Literal] `self`
|
29
29
|
# @see http://www.w3.org/TR/xmlschema-2/#date
|
30
|
-
def canonicalize
|
30
|
+
def canonicalize!
|
31
31
|
@string = @object.strftime('%Y-%m-%d%Z').sub(/\+00:00|UTC/, 'Z')
|
32
32
|
self
|
33
33
|
end
|
34
34
|
|
35
|
+
##
|
36
|
+
# Returns `true` if the value adheres to the defined grammar of the
|
37
|
+
# datatype.
|
38
|
+
#
|
39
|
+
# Special case for date and dateTime, for which '0000' is not a valid year
|
40
|
+
#
|
41
|
+
# @return [Boolean]
|
42
|
+
# @since 0.2.1
|
43
|
+
def valid?
|
44
|
+
!!(value =~ GRAMMAR) && value !~ %r(\A0000)
|
45
|
+
end
|
46
|
+
|
35
47
|
##
|
36
48
|
# Returns the value as a string.
|
37
49
|
#
|
@@ -39,5 +51,5 @@ module RDF; class Literal
|
|
39
51
|
def to_s
|
40
52
|
@string || @object.strftime('%Y-%m-%d%Z').sub(/\+00:00|UTC/, 'Z')
|
41
53
|
end
|
42
|
-
end #
|
43
|
-
end; end #
|
54
|
+
end # Date
|
55
|
+
end; end # RDF::Literal
|
@@ -23,15 +23,27 @@ module RDF; class Literal
|
|
23
23
|
end
|
24
24
|
|
25
25
|
##
|
26
|
-
# Converts
|
26
|
+
# Converts this literal into its canonical lexical representation.
|
27
27
|
#
|
28
|
-
# @return [Literal]
|
28
|
+
# @return [RDF::Literal] `self`
|
29
29
|
# @see http://www.w3.org/TR/xmlschema-2/#dateTime
|
30
|
-
def canonicalize
|
31
|
-
@string = @object.strftime('%Y-%m-%dT%H:%M:%S%Z').sub(/\+00:00|UTC/, 'Z')
|
30
|
+
def canonicalize!
|
31
|
+
@string = @object.new_offset(0).strftime('%Y-%m-%dT%H:%M:%S%Z').sub(/\+00:00|UTC/, 'Z')
|
32
32
|
self
|
33
33
|
end
|
34
34
|
|
35
|
+
##
|
36
|
+
# Returns `true` if the value adheres to the defined grammar of the
|
37
|
+
# datatype.
|
38
|
+
#
|
39
|
+
# Special case for date and dateTime, for which '0000' is not a valid year
|
40
|
+
#
|
41
|
+
# @return [Boolean]
|
42
|
+
# @since 0.2.1
|
43
|
+
def valid?
|
44
|
+
!!(value =~ GRAMMAR) && value !~ %r(\A0000)
|
45
|
+
end
|
46
|
+
|
35
47
|
##
|
36
48
|
# Returns the value as a string.
|
37
49
|
#
|
@@ -39,5 +51,5 @@ module RDF; class Literal
|
|
39
51
|
def to_s
|
40
52
|
@string || @object.strftime('%Y-%m-%dT%H:%M:%S%Z').sub(/\+00:00|UTC/, 'Z')
|
41
53
|
end
|
42
|
-
end #
|
43
|
-
end; end #
|
54
|
+
end # DateTime
|
55
|
+
end; end # RDF::Literal
|
@@ -28,11 +28,11 @@ module RDF; class Literal
|
|
28
28
|
end
|
29
29
|
|
30
30
|
##
|
31
|
-
# Converts
|
31
|
+
# Converts this literal into its canonical lexical representation.
|
32
32
|
#
|
33
|
-
# @return [Literal]
|
33
|
+
# @return [RDF::Literal] `self`
|
34
34
|
# @see http://www.w3.org/TR/xmlschema-2/#decimal
|
35
|
-
def canonicalize
|
35
|
+
def canonicalize!
|
36
36
|
# Can't use simple %f transformation due to special requirements from
|
37
37
|
# N3 tests in representation
|
38
38
|
@string = begin
|
@@ -46,6 +46,33 @@ module RDF; class Literal
|
|
46
46
|
self
|
47
47
|
end
|
48
48
|
|
49
|
+
##
|
50
|
+
# Compares this literal to `other` for sorting purposes.
|
51
|
+
#
|
52
|
+
# @param [Object] other
|
53
|
+
# @return [Integer] `-1`, `0`, or `1`
|
54
|
+
# @since 0.3.0
|
55
|
+
def <=>(other)
|
56
|
+
case other
|
57
|
+
when Numeric
|
58
|
+
to_d <=> other
|
59
|
+
when RDF::Literal::Decimal, RDF::Literal::Double
|
60
|
+
to_d <=> other.to_d
|
61
|
+
else super
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# Returns `true` if this literal is equivalent to `other`.
|
67
|
+
#
|
68
|
+
# @param [Object] other
|
69
|
+
# @return [Boolean] `true` or `false`
|
70
|
+
# @since 0.3.0
|
71
|
+
def ==(other)
|
72
|
+
(self <=> other).zero?
|
73
|
+
end
|
74
|
+
alias_method :===, :==
|
75
|
+
|
49
76
|
##
|
50
77
|
# Returns the absolute value of `self`.
|
51
78
|
#
|
@@ -177,5 +204,5 @@ module RDF; class Literal
|
|
177
204
|
def to_r
|
178
205
|
@object.to_r # only available on Ruby 1.9+
|
179
206
|
end
|
180
|
-
end #
|
181
|
-
end; end #
|
207
|
+
end # Decimal
|
208
|
+
end; end # RDF::Literal
|
@@ -30,11 +30,11 @@ module RDF; class Literal
|
|
30
30
|
end
|
31
31
|
|
32
32
|
##
|
33
|
-
# Converts
|
33
|
+
# Converts this literal into its canonical lexical representation.
|
34
34
|
#
|
35
|
-
# @return [Literal]
|
35
|
+
# @return [RDF::Literal] `self`
|
36
36
|
# @see http://www.w3.org/TR/xmlschema-2/#double
|
37
|
-
def canonicalize
|
37
|
+
def canonicalize!
|
38
38
|
# Can't use simple %f transformation due to special requirements from
|
39
39
|
# N3 tests in representation
|
40
40
|
@string = case
|
@@ -51,6 +51,33 @@ module RDF; class Literal
|
|
51
51
|
self
|
52
52
|
end
|
53
53
|
|
54
|
+
##
|
55
|
+
# Compares this literal to `other` for sorting purposes.
|
56
|
+
#
|
57
|
+
# @param [Object] other
|
58
|
+
# @return [Integer] `-1`, `0`, or `1`
|
59
|
+
# @since 0.3.0
|
60
|
+
def <=>(other)
|
61
|
+
case other
|
62
|
+
when Numeric
|
63
|
+
to_d <=> other
|
64
|
+
when RDF::Literal::Decimal, RDF::Literal::Double
|
65
|
+
to_d <=> other.to_d
|
66
|
+
else super
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# Returns `true` if this literal is equivalent to `other`.
|
72
|
+
#
|
73
|
+
# @param [Object] other
|
74
|
+
# @return [Boolean] `true` or `false`
|
75
|
+
# @since 0.3.0
|
76
|
+
def ==(other)
|
77
|
+
(self <=> other).zero?
|
78
|
+
end
|
79
|
+
alias_method :===, :==
|
80
|
+
|
54
81
|
##
|
55
82
|
# Returns `true` if the value is an invalid IEEE floating point number.
|
56
83
|
#
|
@@ -253,5 +280,5 @@ module RDF; class Literal
|
|
253
280
|
def to_r
|
254
281
|
@object.to_r # only available on Ruby 1.9+
|
255
282
|
end
|
256
|
-
end #
|
257
|
-
end; end #
|
283
|
+
end # Double
|
284
|
+
end; end # RDF::Literal
|
@@ -30,11 +30,11 @@ module RDF; class Literal
|
|
30
30
|
end
|
31
31
|
|
32
32
|
##
|
33
|
-
# Converts
|
33
|
+
# Converts this literal into its canonical lexical representation.
|
34
34
|
#
|
35
|
-
# @return [Literal]
|
35
|
+
# @return [RDF::Literal] `self`
|
36
36
|
# @see http://www.w3.org/TR/xmlschema-2/#integer
|
37
|
-
def canonicalize
|
37
|
+
def canonicalize!
|
38
38
|
@string = @object.to_s if @object
|
39
39
|
self
|
40
40
|
end
|
@@ -203,5 +203,16 @@ module RDF; class Literal
|
|
203
203
|
def to_r
|
204
204
|
@object.to_r
|
205
205
|
end
|
206
|
-
|
207
|
-
|
206
|
+
|
207
|
+
##
|
208
|
+
# Returns the value as an `OpenSSL::BN` instance.
|
209
|
+
#
|
210
|
+
# @return [OpenSSL::BN]
|
211
|
+
# @see http://ruby-doc.org/stdlib/libdoc/openssl/rdoc/classes/OpenSSL/BN.html
|
212
|
+
# @since 0.2.4
|
213
|
+
def to_bn
|
214
|
+
require 'openssl' unless defined?(OpenSSL::BN)
|
215
|
+
OpenSSL::BN.new(to_s)
|
216
|
+
end
|
217
|
+
end # Integer
|
218
|
+
end; end # RDF::Literal
|
@@ -27,7 +27,7 @@ module RDF; class Literal
|
|
27
27
|
end
|
28
28
|
|
29
29
|
##
|
30
|
-
# Converts
|
30
|
+
# Converts this literal into its canonical lexical representation.
|
31
31
|
#
|
32
32
|
# §3.2.8.2 Canonical representation
|
33
33
|
#
|
@@ -37,10 +37,10 @@ module RDF; class Literal
|
|
37
37
|
# time zone must be Coordinated Universal Time (UTC) indicated by a "Z".
|
38
38
|
# Additionally, the canonical representation for midnight is 00:00:00.
|
39
39
|
#
|
40
|
-
# @return [Literal]
|
40
|
+
# @return [RDF::Literal] `self`
|
41
41
|
# @see http://www.w3.org/TR/xmlschema-2/#time
|
42
|
-
def canonicalize
|
43
|
-
@string = @object.strftime('%H:%M:%S%Z').sub(/\+00:00|UTC/, 'Z')
|
42
|
+
def canonicalize!
|
43
|
+
@string = @object.utc.strftime('%H:%M:%S%Z').sub(/\+00:00|UTC/, 'Z')
|
44
44
|
self
|
45
45
|
end
|
46
46
|
|
@@ -51,5 +51,5 @@ module RDF; class Literal
|
|
51
51
|
def to_s
|
52
52
|
@string || @object.strftime('%H:%M:%S%Z').sub(/\+00:00|UTC/, 'Z')
|
53
53
|
end
|
54
|
-
end #
|
55
|
-
end; end #
|
54
|
+
end # Time
|
55
|
+
end; end # RDF::Literal
|
@@ -19,11 +19,11 @@ module RDF; class Literal
|
|
19
19
|
end
|
20
20
|
|
21
21
|
##
|
22
|
-
# Converts
|
22
|
+
# Converts this literal into its canonical lexical representation.
|
23
23
|
#
|
24
|
-
# @return [Literal]
|
24
|
+
# @return [RDF::Literal] `self`
|
25
25
|
# @see http://www.w3.org/TR/xmlschema-2/#boolean
|
26
|
-
def canonicalize
|
26
|
+
def canonicalize!
|
27
27
|
@string = @object.to_s if @object
|
28
28
|
self
|
29
29
|
end
|
@@ -43,5 +43,5 @@ module RDF; class Literal
|
|
43
43
|
def to_s
|
44
44
|
@string || @object.to_s
|
45
45
|
end
|
46
|
-
end #
|
47
|
-
end; end #
|
46
|
+
end # Token
|
47
|
+
end; end # RDF::Literal
|
@@ -19,11 +19,11 @@ module RDF; class Literal
|
|
19
19
|
end
|
20
20
|
|
21
21
|
##
|
22
|
-
# Converts
|
22
|
+
# Converts this literal into its canonical lexical representation.
|
23
23
|
#
|
24
|
-
# @return [Literal]
|
24
|
+
# @return [RDF::Literal] `self`
|
25
25
|
# @see http://www.w3.org/TR/xml-exc-c14n/
|
26
|
-
def canonicalize
|
26
|
+
def canonicalize!
|
27
27
|
# TODO: implement XML canonicalization
|
28
28
|
self
|
29
29
|
end
|
@@ -35,5 +35,5 @@ module RDF; class Literal
|
|
35
35
|
def to_s
|
36
36
|
@string || @object.to_s # TODO
|
37
37
|
end
|
38
|
-
end #
|
39
|
-
end; end #
|
38
|
+
end # XML
|
39
|
+
end; end # RDF::Literal
|
data/lib/rdf/model/literal.rb
CHANGED
@@ -100,8 +100,8 @@ module RDF
|
|
100
100
|
end
|
101
101
|
literal = klass.allocate
|
102
102
|
literal.send(:initialize, value, options)
|
103
|
-
literal.validate
|
104
|
-
literal.canonicalize if options[:canonicalize]
|
103
|
+
literal.validate! if options[:validate]
|
104
|
+
literal.canonicalize! if options[:canonicalize]
|
105
105
|
literal
|
106
106
|
end
|
107
107
|
|
@@ -263,23 +263,36 @@ module RDF
|
|
263
263
|
# Validates the value using {#valid?}, raising an error if the value is
|
264
264
|
# invalid.
|
265
265
|
#
|
266
|
+
# @return [RDF::Literal] `self`
|
266
267
|
# @raise [ArgumentError] if the value is invalid
|
267
|
-
# @return [Literal]
|
268
268
|
# @since 0.2.1
|
269
|
-
def validate
|
270
|
-
raise ArgumentError
|
269
|
+
def validate!
|
270
|
+
raise ArgumentError, "#{to_s.inspect} is not a valid <#{datatype.to_s}> literal" if invalid?
|
271
271
|
self
|
272
272
|
end
|
273
|
-
alias_method :validate
|
273
|
+
alias_method :validate, :validate!
|
274
274
|
|
275
275
|
##
|
276
|
-
#
|
276
|
+
# Returns a copy of this literal converted into its canonical lexical
|
277
|
+
# representation.
|
277
278
|
#
|
278
|
-
# Subclasses should override
|
279
|
+
# Subclasses should override `#canonicalize!` as needed and appropriate,
|
280
|
+
# not this method.
|
279
281
|
#
|
280
|
-
# @return [Literal]
|
282
|
+
# @return [RDF::Literal]
|
281
283
|
# @since 0.2.1
|
282
284
|
def canonicalize
|
285
|
+
self.dup.canonicalize!
|
286
|
+
end
|
287
|
+
|
288
|
+
##
|
289
|
+
# Converts this literal into its canonical lexical representation.
|
290
|
+
#
|
291
|
+
# Subclasses should override this as needed and appropriate.
|
292
|
+
#
|
293
|
+
# @return [RDF::Literal] `self`
|
294
|
+
# @since 0.3.0
|
295
|
+
def canonicalize!
|
283
296
|
@language = @language.to_s.downcase.to_sym if @language
|
284
297
|
self
|
285
298
|
end
|
@@ -299,5 +312,5 @@ module RDF
|
|
299
312
|
def inspect
|
300
313
|
sprintf("#<%s:%#0x(%s)>", self.class.name, __id__, RDF::NTriples.serialize(self))
|
301
314
|
end
|
302
|
-
end
|
303
|
-
end
|
315
|
+
end # Literal
|
316
|
+
end # RDF
|
data/lib/rdf/model/node.rb
CHANGED
@@ -9,27 +9,28 @@ module RDF
|
|
9
9
|
# bnode = RDF::Node.uuid
|
10
10
|
# bnode.to_s #=> "_:504c0a30-0d11-012d-3f50-001b63cac539"
|
11
11
|
#
|
12
|
-
# @see http://rubygems.org/gems/uuid
|
13
|
-
# @see http://rubygems.org/gems/uuidtools
|
14
12
|
class Node
|
15
13
|
include RDF::Resource
|
16
14
|
|
17
15
|
##
|
18
16
|
# Returns a blank node with a random UUID-based identifier.
|
19
17
|
#
|
18
|
+
# @param [Hash{Symbol => Object}] options
|
19
|
+
# @option options [Regexp] :grammar (nil)
|
20
|
+
# a grammar specification that the generated UUID must match
|
20
21
|
# @return [RDF::Node]
|
21
|
-
def self.uuid
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
22
|
+
def self.uuid(options = {})
|
23
|
+
case
|
24
|
+
when options[:grammar]
|
25
|
+
# The UUID is generated such that its initial part is guaranteed
|
26
|
+
# to match the given `grammar`, e.g. `/^[A-Za-z][A-Za-z0-9]*/`.
|
27
|
+
# Some RDF storage systems (e.g. AllegroGraph) require this.
|
28
|
+
# @see http://github.com/bendiken/rdf/pull/43
|
29
|
+
uuid = RDF::Util::UUID.generate(options) until uuid =~ options[:grammar]
|
30
|
+
else
|
31
|
+
uuid = RDF::Util::UUID.generate(options)
|
32
32
|
end
|
33
|
+
self.new(uuid)
|
33
34
|
end
|
34
35
|
|
35
36
|
##
|