rdf 0.3.3 → 0.3.4
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/README +107 -20
- data/VERSION +1 -1
- data/bin/rdf +4 -8
- data/etc/doap.nt +8 -8
- data/lib/rdf.rb +1 -0
- data/lib/rdf/cli.rb +146 -19
- data/lib/rdf/format.rb +59 -10
- data/lib/rdf/mixin/type_check.rb +21 -0
- data/lib/rdf/model/graph.rb +1 -0
- data/lib/rdf/model/list.rb +36 -3
- data/lib/rdf/model/literal.rb +113 -74
- data/lib/rdf/model/literal/boolean.rb +15 -5
- data/lib/rdf/model/literal/date.rb +24 -6
- data/lib/rdf/model/literal/datetime.rb +21 -4
- data/lib/rdf/model/literal/decimal.rb +3 -128
- data/lib/rdf/model/literal/double.rb +4 -107
- data/lib/rdf/model/literal/integer.rb +3 -97
- data/lib/rdf/model/literal/numeric.rb +178 -3
- data/lib/rdf/model/literal/time.rb +23 -3
- data/lib/rdf/model/literal/token.rb +2 -2
- data/lib/rdf/model/literal/xml.rb +1 -1
- data/lib/rdf/model/node.rb +35 -5
- data/lib/rdf/model/statement.rb +7 -6
- data/lib/rdf/model/term.rb +32 -0
- data/lib/rdf/model/uri.rb +13 -7
- data/lib/rdf/model/value.rb +10 -0
- data/lib/rdf/nquads.rb +120 -3
- data/lib/rdf/ntriples/format.rb +9 -1
- data/lib/rdf/ntriples/writer.rb +1 -0
- data/lib/rdf/query.rb +121 -13
- data/lib/rdf/query/pattern.rb +28 -15
- data/lib/rdf/query/solution.rb +47 -0
- data/lib/rdf/query/solutions.rb +45 -10
- data/lib/rdf/query/variable.rb +39 -4
- data/lib/rdf/reader.rb +47 -4
- data/lib/rdf/repository.rb +8 -4
- data/lib/rdf/util/file.rb +5 -2
- data/lib/rdf/version.rb +1 -1
- data/lib/rdf/writer.rb +34 -5
- metadata +56 -88
@@ -14,9 +14,9 @@ module RDF; class Literal
|
|
14
14
|
# @param [Boolean] value
|
15
15
|
# @option options [String] :lexical (nil)
|
16
16
|
def initialize(value, options = {})
|
17
|
-
@datatype = RDF::URI(options[:datatype] || DATATYPE)
|
17
|
+
@datatype = RDF::URI(options[:datatype] || self.class.const_get(:DATATYPE))
|
18
18
|
@string = options[:lexical] if options.has_key?(:lexical)
|
19
|
-
@string
|
19
|
+
@string ||= value if value.is_a?(String)
|
20
20
|
@object = case
|
21
21
|
when true.equal?(value) then true
|
22
22
|
when false.equal?(value) then false
|
@@ -59,10 +59,20 @@ module RDF; class Literal
|
|
59
59
|
# @return [Boolean] `true` or `false`
|
60
60
|
# @since 0.3.0
|
61
61
|
def ==(other)
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
# If lexically invalid, use regular literal testing
|
63
|
+
return super unless self.valid?
|
64
|
+
|
65
|
+
other = Literal::Boolean.new(other) if other.class == TrueClass || other.class == FalseClass
|
65
66
|
|
67
|
+
case other
|
68
|
+
when Literal::Boolean
|
69
|
+
return super unless other.valid?
|
70
|
+
(cmp = (self <=> other)) ? cmp.zero? : false
|
71
|
+
else
|
72
|
+
super
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
66
76
|
##
|
67
77
|
# Returns the value as a string.
|
68
78
|
#
|
@@ -7,19 +7,20 @@ module RDF; class Literal
|
|
7
7
|
class Date < Literal
|
8
8
|
DATATYPE = XSD.date
|
9
9
|
GRAMMAR = %r(\A-?\d{4}-\d{2}-\d{2}(([\+\-]\d{2}:\d{2})|UTC|Z)?\Z).freeze
|
10
|
+
FORMAT = '%Y-%m-%d%Z'.freeze
|
10
11
|
|
11
12
|
##
|
12
13
|
# @param [Date] value
|
13
14
|
# @option options [String] :lexical (nil)
|
14
15
|
def initialize(value, options = {})
|
15
|
-
@datatype = RDF::URI(options[:datatype] || DATATYPE)
|
16
|
+
@datatype = RDF::URI(options[:datatype] || self.class.const_get(:DATATYPE))
|
16
17
|
@string = options[:lexical] if options.has_key?(:lexical)
|
17
|
-
@string
|
18
|
+
@string ||= value if value.is_a?(String)
|
18
19
|
@object = case
|
19
20
|
when value.is_a?(::Date) then value
|
20
21
|
when value.respond_to?(:to_date) then value.to_date # Ruby 1.9+
|
21
22
|
else ::Date.parse(value.to_s)
|
22
|
-
end
|
23
|
+
end rescue nil
|
23
24
|
end
|
24
25
|
|
25
26
|
##
|
@@ -28,7 +29,7 @@ module RDF; class Literal
|
|
28
29
|
# @return [RDF::Literal] `self`
|
29
30
|
# @see http://www.w3.org/TR/xmlschema-2/#date
|
30
31
|
def canonicalize!
|
31
|
-
@string = @object.strftime(
|
32
|
+
@string = @object.strftime(FORMAT).sub(/\+00:00|UTC/, 'Z')
|
32
33
|
self
|
33
34
|
end
|
34
35
|
|
@@ -41,7 +42,7 @@ module RDF; class Literal
|
|
41
42
|
# @return [Boolean]
|
42
43
|
# @since 0.2.1
|
43
44
|
def valid?
|
44
|
-
|
45
|
+
super && value !~ %r(\A0000)
|
45
46
|
end
|
46
47
|
|
47
48
|
##
|
@@ -49,7 +50,24 @@ module RDF; class Literal
|
|
49
50
|
#
|
50
51
|
# @return [String]
|
51
52
|
def to_s
|
52
|
-
@string || @object.strftime(
|
53
|
+
@string || @object.strftime(FORMAT).sub(/\+00:00|UTC/, 'Z')
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Equal compares as Date objects
|
58
|
+
def ==(other)
|
59
|
+
# If lexically invalid, use regular literal testing
|
60
|
+
return super unless self.valid?
|
61
|
+
|
62
|
+
case other
|
63
|
+
when Literal::Date
|
64
|
+
return super unless other.valid?
|
65
|
+
self.object == other.object
|
66
|
+
when Literal::Time, Literal::DateTime
|
67
|
+
false
|
68
|
+
else
|
69
|
+
super
|
70
|
+
end
|
53
71
|
end
|
54
72
|
end # Date
|
55
73
|
end; end # RDF::Literal
|
@@ -12,14 +12,14 @@ module RDF; class Literal
|
|
12
12
|
# @param [DateTime] value
|
13
13
|
# @option options [String] :lexical (nil)
|
14
14
|
def initialize(value, options = {})
|
15
|
-
@datatype = RDF::URI(options[:datatype] || DATATYPE)
|
15
|
+
@datatype = RDF::URI(options[:datatype] || self.class.const_get(:DATATYPE))
|
16
16
|
@string = options[:lexical] if options.has_key?(:lexical)
|
17
|
-
@string
|
17
|
+
@string ||= value if value.is_a?(String)
|
18
18
|
@object = case
|
19
19
|
when value.is_a?(::DateTime) then value
|
20
20
|
when value.respond_to?(:to_datetime) then value.to_datetime # Ruby 1.9+
|
21
21
|
else ::DateTime.parse(value.to_s)
|
22
|
-
end
|
22
|
+
end rescue nil
|
23
23
|
end
|
24
24
|
|
25
25
|
##
|
@@ -41,7 +41,7 @@ module RDF; class Literal
|
|
41
41
|
# @return [Boolean]
|
42
42
|
# @since 0.2.1
|
43
43
|
def valid?
|
44
|
-
|
44
|
+
super && value !~ %r(\A0000)
|
45
45
|
end
|
46
46
|
|
47
47
|
##
|
@@ -51,5 +51,22 @@ module RDF; class Literal
|
|
51
51
|
def to_s
|
52
52
|
@string || @object.strftime('%Y-%m-%dT%H:%M:%S%Z').sub(/\+00:00|UTC/, 'Z')
|
53
53
|
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# Equal compares as DateTime objects
|
57
|
+
def ==(other)
|
58
|
+
# If lexically invalid, use regular literal testing
|
59
|
+
return super unless self.valid?
|
60
|
+
|
61
|
+
case other
|
62
|
+
when Literal::DateTime
|
63
|
+
return super unless other.valid?
|
64
|
+
self.object == other.object
|
65
|
+
when Literal::Time, Literal::Date
|
66
|
+
false
|
67
|
+
else
|
68
|
+
super
|
69
|
+
end
|
70
|
+
end
|
54
71
|
end # DateTime
|
55
72
|
end; end # RDF::Literal
|
@@ -10,19 +10,17 @@ module RDF; class Literal
|
|
10
10
|
#
|
11
11
|
# @see http://www.w3.org/TR/xmlschema-2/#decimal
|
12
12
|
# @since 0.2.1
|
13
|
-
class Decimal <
|
13
|
+
class Decimal < Numeric
|
14
14
|
DATATYPE = XSD.decimal
|
15
15
|
GRAMMAR = /^[\+\-]?\d+(\.\d*)?$/.freeze
|
16
16
|
|
17
|
-
include RDF::Literal::Numeric
|
18
|
-
|
19
17
|
##
|
20
18
|
# @param [BigDecimal] value
|
21
19
|
# @option options [String] :lexical (nil)
|
22
20
|
def initialize(value, options = {})
|
23
|
-
@datatype = RDF::URI(options[:datatype] || DATATYPE)
|
21
|
+
@datatype = RDF::URI(options[:datatype] || self.class.const_get(:DATATYPE))
|
24
22
|
@string = options[:lexical] if options.has_key?(:lexical)
|
25
|
-
@string
|
23
|
+
@string ||= value if value.is_a?(String)
|
26
24
|
@object = case
|
27
25
|
when value.is_a?(BigDecimal) then value
|
28
26
|
else BigDecimal(value.to_s)
|
@@ -49,33 +47,6 @@ module RDF; class Literal
|
|
49
47
|
self
|
50
48
|
end
|
51
49
|
|
52
|
-
##
|
53
|
-
# Compares this literal to `other` for sorting purposes.
|
54
|
-
#
|
55
|
-
# @param [Object] other
|
56
|
-
# @return [Integer] `-1`, `0`, or `1`
|
57
|
-
# @since 0.3.0
|
58
|
-
def <=>(other)
|
59
|
-
case other
|
60
|
-
when ::Numeric
|
61
|
-
to_d <=> other
|
62
|
-
when RDF::Literal::Decimal, RDF::Literal::Double
|
63
|
-
to_d <=> other.to_d
|
64
|
-
else super
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
##
|
69
|
-
# Returns `true` if this literal is equivalent to `other`.
|
70
|
-
#
|
71
|
-
# @param [Object] other
|
72
|
-
# @return [Boolean] `true` or `false`
|
73
|
-
# @since 0.3.0
|
74
|
-
def ==(other)
|
75
|
-
(cmp = (self <=> other)) ? cmp.zero? : false
|
76
|
-
end
|
77
|
-
alias_method :===, :==
|
78
|
-
|
79
50
|
##
|
80
51
|
# Returns the absolute value of `self`.
|
81
52
|
#
|
@@ -103,64 +74,6 @@ module RDF; class Literal
|
|
103
74
|
to_d.nonzero? ? self : nil
|
104
75
|
end
|
105
76
|
|
106
|
-
##
|
107
|
-
# Returns `self`.
|
108
|
-
#
|
109
|
-
# @return [RDF::Literal]
|
110
|
-
# @since 0.2.3
|
111
|
-
def +@
|
112
|
-
self # unary plus
|
113
|
-
end
|
114
|
-
|
115
|
-
##
|
116
|
-
# Returns `self` negated.
|
117
|
-
#
|
118
|
-
# @return [RDF::Literal]
|
119
|
-
# @since 0.2.3
|
120
|
-
def -@
|
121
|
-
RDF::Literal(-to_d) # unary minus
|
122
|
-
end
|
123
|
-
|
124
|
-
##
|
125
|
-
# Returns the sum of `self` plus `other`.
|
126
|
-
#
|
127
|
-
# @param [#to_d] other
|
128
|
-
# @return [RDF::Literal]
|
129
|
-
# @since 0.2.3
|
130
|
-
def +(other)
|
131
|
-
RDF::Literal(to_d + (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
132
|
-
end
|
133
|
-
|
134
|
-
##
|
135
|
-
# Returns the difference of `self` minus `other`.
|
136
|
-
#
|
137
|
-
# @param [#to_d] other
|
138
|
-
# @return [RDF::Literal]
|
139
|
-
# @since 0.2.3
|
140
|
-
def -(other)
|
141
|
-
RDF::Literal(to_d - (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
142
|
-
end
|
143
|
-
|
144
|
-
##
|
145
|
-
# Returns the product of `self` times `other`.
|
146
|
-
#
|
147
|
-
# @param [#to_d] other
|
148
|
-
# @return [RDF::Literal]
|
149
|
-
# @since 0.2.3
|
150
|
-
def *(other)
|
151
|
-
RDF::Literal(to_d * (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
152
|
-
end
|
153
|
-
|
154
|
-
##
|
155
|
-
# Returns the quotient of `self` divided by `other`.
|
156
|
-
#
|
157
|
-
# @param [#to_d] other
|
158
|
-
# @return [RDF::Literal]
|
159
|
-
# @since 0.2.3
|
160
|
-
def /(other)
|
161
|
-
RDF::Literal(to_d / (other.respond_to?(:to_d) ? other.to_d : BigDecimal(other.to_s)))
|
162
|
-
end
|
163
|
-
|
164
77
|
##
|
165
78
|
# Returns the value as a string.
|
166
79
|
#
|
@@ -169,43 +82,5 @@ module RDF; class Literal
|
|
169
82
|
def to_s
|
170
83
|
@string || @object.to_s('F')
|
171
84
|
end
|
172
|
-
|
173
|
-
##
|
174
|
-
# Returns the value as an integer.
|
175
|
-
#
|
176
|
-
# @return [Integer]
|
177
|
-
# @see BigDecimal#to_i
|
178
|
-
def to_i
|
179
|
-
@object.to_i
|
180
|
-
end
|
181
|
-
|
182
|
-
##
|
183
|
-
# Returns the value as a floating point number.
|
184
|
-
#
|
185
|
-
# The usual accuracy limits and errors of binary float arithmetic apply.
|
186
|
-
#
|
187
|
-
# @return [Float]
|
188
|
-
# @see BigDecimal#to_f
|
189
|
-
def to_f
|
190
|
-
@object.to_f
|
191
|
-
end
|
192
|
-
|
193
|
-
##
|
194
|
-
# Returns the value as a decimal number.
|
195
|
-
#
|
196
|
-
# @return [BigDecimal]
|
197
|
-
# @see BigDecimal#to_d
|
198
|
-
def to_d
|
199
|
-
@object.respond_to?(:to_d) ? @object.to_d : BigDecimal(@object.to_s)
|
200
|
-
end
|
201
|
-
|
202
|
-
##
|
203
|
-
# Returns the value as a rational number.
|
204
|
-
#
|
205
|
-
# @return [Rational]
|
206
|
-
# @see BigDecimal#to_r
|
207
|
-
def to_r
|
208
|
-
@object.to_r # only available on Ruby 1.9+
|
209
|
-
end
|
210
85
|
end # Decimal
|
211
86
|
end; end # RDF::Literal
|
@@ -10,19 +10,17 @@ module RDF; class Literal
|
|
10
10
|
#
|
11
11
|
# @see http://www.w3.org/TR/xmlschema-2/#double
|
12
12
|
# @since 0.2.1
|
13
|
-
class Double <
|
13
|
+
class Double < Numeric
|
14
14
|
DATATYPE = XSD.double
|
15
|
-
GRAMMAR = /^[\+\-]
|
16
|
-
|
17
|
-
include RDF::Literal::Numeric
|
15
|
+
GRAMMAR = /^NaN|(?:[\+\-]?(?:INF|(?:\d+(\.\d*)?([eE][\+\-]?\d+)?)))$/.freeze
|
18
16
|
|
19
17
|
##
|
20
18
|
# @param [Float, #to_f] value
|
21
19
|
# @option options [String] :lexical (nil)
|
22
20
|
def initialize(value, options = {})
|
23
|
-
@datatype = RDF::URI(options[:datatype] || DATATYPE)
|
21
|
+
@datatype = RDF::URI(options[:datatype] || self.class.const_get(:DATATYPE))
|
24
22
|
@string = options[:lexical] if options.has_key?(:lexical)
|
25
|
-
@string
|
23
|
+
@string ||= value if value.is_a?(String)
|
26
24
|
@object = case
|
27
25
|
when value.is_a?(::String) then case value
|
28
26
|
when 'INF' then 1/0.0
|
@@ -75,17 +73,6 @@ module RDF; class Literal
|
|
75
73
|
end
|
76
74
|
end
|
77
75
|
|
78
|
-
##
|
79
|
-
# Returns `true` if this literal is equivalent to `other`.
|
80
|
-
#
|
81
|
-
# @param [Object] other
|
82
|
-
# @return [Boolean] `true` or `false`
|
83
|
-
# @since 0.3.0
|
84
|
-
def ==(other)
|
85
|
-
(cmp = (self <=> other)) ? cmp.zero? : false
|
86
|
-
end
|
87
|
-
alias_method :===, :==
|
88
|
-
|
89
76
|
##
|
90
77
|
# Returns `true` if the value is an invalid IEEE floating point number.
|
91
78
|
#
|
@@ -187,64 +174,6 @@ module RDF; class Literal
|
|
187
174
|
to_f.nonzero? ? self : nil
|
188
175
|
end
|
189
176
|
|
190
|
-
##
|
191
|
-
# Returns `self`.
|
192
|
-
#
|
193
|
-
# @return [RDF::Literal]
|
194
|
-
# @since 0.2.3
|
195
|
-
def +@
|
196
|
-
self # unary plus
|
197
|
-
end
|
198
|
-
|
199
|
-
##
|
200
|
-
# Returns `self` negated.
|
201
|
-
#
|
202
|
-
# @return [RDF::Literal]
|
203
|
-
# @since 0.2.3
|
204
|
-
def -@
|
205
|
-
RDF::Literal(-to_f, :datatype => datatype) # unary minus
|
206
|
-
end
|
207
|
-
|
208
|
-
##
|
209
|
-
# Returns the sum of `self` plus `other`.
|
210
|
-
#
|
211
|
-
# @param [#to_f] other
|
212
|
-
# @return [RDF::Literal]
|
213
|
-
# @since 0.2.3
|
214
|
-
def +(other)
|
215
|
-
RDF::Literal(to_f + other.to_f)
|
216
|
-
end
|
217
|
-
|
218
|
-
##
|
219
|
-
# Returns the difference of `self` minus `other`.
|
220
|
-
#
|
221
|
-
# @param [#to_f] other
|
222
|
-
# @return [RDF::Literal]
|
223
|
-
# @since 0.2.3
|
224
|
-
def -(other)
|
225
|
-
RDF::Literal(to_f - other.to_f)
|
226
|
-
end
|
227
|
-
|
228
|
-
##
|
229
|
-
# Returns the product of `self` times `other`.
|
230
|
-
#
|
231
|
-
# @param [#to_f] other
|
232
|
-
# @return [RDF::Literal]
|
233
|
-
# @since 0.2.3
|
234
|
-
def *(other)
|
235
|
-
RDF::Literal(to_f * other.to_f)
|
236
|
-
end
|
237
|
-
|
238
|
-
##
|
239
|
-
# Returns the quotient of `self` divided by `other`.
|
240
|
-
#
|
241
|
-
# @param [#to_f] other
|
242
|
-
# @return [RDF::Literal]
|
243
|
-
# @since 0.2.3
|
244
|
-
def /(other)
|
245
|
-
RDF::Literal(to_f / other.to_f)
|
246
|
-
end
|
247
|
-
|
248
177
|
##
|
249
178
|
# Returns the value as a string.
|
250
179
|
#
|
@@ -256,37 +185,5 @@ module RDF; class Literal
|
|
256
185
|
else @object.to_s
|
257
186
|
end
|
258
187
|
end
|
259
|
-
|
260
|
-
##
|
261
|
-
# Returns the value as an integer.
|
262
|
-
#
|
263
|
-
# @return [Integer]
|
264
|
-
def to_i
|
265
|
-
@object.to_i
|
266
|
-
end
|
267
|
-
|
268
|
-
##
|
269
|
-
# Returns the value as a floating point number.
|
270
|
-
#
|
271
|
-
# @return [Float]
|
272
|
-
def to_f
|
273
|
-
@object.to_f
|
274
|
-
end
|
275
|
-
|
276
|
-
##
|
277
|
-
# Returns the value as a decimal number.
|
278
|
-
#
|
279
|
-
# @return [BigDecimal]
|
280
|
-
def to_d
|
281
|
-
@object.respond_to?(:to_d) ? @object.to_d : BigDecimal(@object.to_s)
|
282
|
-
end
|
283
|
-
|
284
|
-
##
|
285
|
-
# Returns the value as a rational number.
|
286
|
-
#
|
287
|
-
# @return [Rational]
|
288
|
-
def to_r
|
289
|
-
@object.to_r # only available on Ruby 1.9+
|
290
|
-
end
|
291
188
|
end # Double
|
292
189
|
end; end # RDF::Literal
|