rdf 0.2.3 → 0.3.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/rdf/mixin/enumerable.rb
CHANGED
@@ -12,15 +12,15 @@ module RDF
|
|
12
12
|
# enumerable.count
|
13
13
|
#
|
14
14
|
# @example Checking whether a specific statement exists
|
15
|
-
# enumerable.has_statement?(RDF::Statement
|
15
|
+
# enumerable.has_statement?(RDF::Statement(subject, predicate, object))
|
16
16
|
# enumerable.has_triple?([subject, predicate, object])
|
17
17
|
# enumerable.has_quad?([subject, predicate, object, context])
|
18
18
|
#
|
19
19
|
# @example Checking whether a specific value exists
|
20
|
-
# enumerable.has_subject?(RDF::URI
|
20
|
+
# enumerable.has_subject?(RDF::URI("http://rdf.rubyforge.org/"))
|
21
21
|
# enumerable.has_predicate?(RDF::DC.creator)
|
22
|
-
# enumerable.has_object?(RDF::Literal
|
23
|
-
# enumerable.has_context?(RDF::URI
|
22
|
+
# enumerable.has_object?(RDF::Literal("Hello!", :language => :en))
|
23
|
+
# enumerable.has_context?(RDF::URI("http://rubyforge.org/"))
|
24
24
|
#
|
25
25
|
# @example Enumerating all statements
|
26
26
|
# enumerable.each_statement do |statement|
|
@@ -65,7 +65,7 @@ module RDF
|
|
65
65
|
# Returns all RDF statements.
|
66
66
|
#
|
67
67
|
# @param [Hash{Symbol => Boolean}] options
|
68
|
-
# @return [Enumerator<Statement>]
|
68
|
+
# @return [Enumerator<RDF::Statement>]
|
69
69
|
# @see #each_statement
|
70
70
|
# @see #enum_statement
|
71
71
|
def statements(options = {})
|
@@ -75,12 +75,11 @@ module RDF
|
|
75
75
|
##
|
76
76
|
# Returns `true` if `self` contains the given RDF statement.
|
77
77
|
#
|
78
|
-
# @param [Statement] statement
|
78
|
+
# @param [RDF::Statement] statement
|
79
79
|
# @return [Boolean]
|
80
80
|
def has_statement?(statement)
|
81
81
|
!enum_statement.find { |s| s.eql?(statement) }.nil?
|
82
82
|
end
|
83
|
-
|
84
83
|
alias_method :include?, :has_statement?
|
85
84
|
|
86
85
|
##
|
@@ -92,7 +91,9 @@ module RDF
|
|
92
91
|
#
|
93
92
|
# @overload each_statement
|
94
93
|
# @yield [statement]
|
95
|
-
#
|
94
|
+
# each statement
|
95
|
+
# @yieldparam [RDF::Statement] statement
|
96
|
+
# @yieldreturn [void] ignored
|
96
97
|
# @return [void]
|
97
98
|
#
|
98
99
|
# @overload each_statement
|
@@ -104,9 +105,8 @@ module RDF
|
|
104
105
|
if block_given?
|
105
106
|
# Invoke {#each} in the containing class:
|
106
107
|
each(&block)
|
107
|
-
else
|
108
|
-
enum_statement
|
109
108
|
end
|
109
|
+
enum_statement
|
110
110
|
end
|
111
111
|
|
112
112
|
##
|
@@ -117,14 +117,13 @@ module RDF
|
|
117
117
|
def enum_statement
|
118
118
|
enum_for(:each_statement).extend(RDF::Queryable, RDF::Enumerable)
|
119
119
|
end
|
120
|
-
|
121
120
|
alias_method :enum_statements, :enum_statement
|
122
121
|
|
123
122
|
##
|
124
123
|
# Returns all RDF triples.
|
125
124
|
#
|
126
125
|
# @param [Hash{Symbol => Boolean}] options
|
127
|
-
# @return [Enumerator<Array(Resource, URI, Value)>]
|
126
|
+
# @return [Enumerator<Array(RDF::Resource, RDF::URI, RDF::Value)>]
|
128
127
|
# @see #each_triple
|
129
128
|
# @see #enum_triple
|
130
129
|
def triples(options = {})
|
@@ -134,7 +133,7 @@ module RDF
|
|
134
133
|
##
|
135
134
|
# Returns `true` if `self` contains the given RDF triple.
|
136
135
|
#
|
137
|
-
# @param [Array(Resource, URI, Value)] triple
|
136
|
+
# @param [Array(RDF::Resource, RDF::URI, RDF::Value)] triple
|
138
137
|
# @return [Boolean]
|
139
138
|
def has_triple?(triple)
|
140
139
|
enum_triple.include?(triple)
|
@@ -149,9 +148,11 @@ module RDF
|
|
149
148
|
#
|
150
149
|
# @overload each_triple
|
151
150
|
# @yield [subject, predicate, object]
|
152
|
-
#
|
153
|
-
# @yieldparam
|
154
|
-
# @yieldparam
|
151
|
+
# each triple
|
152
|
+
# @yieldparam [RDF::Resource] subject
|
153
|
+
# @yieldparam [RDF::URI] predicate
|
154
|
+
# @yieldparam [RDF::Value] object
|
155
|
+
# @yieldreturn [void] ignored
|
155
156
|
# @return [void]
|
156
157
|
#
|
157
158
|
# @overload each_triple
|
@@ -164,9 +165,8 @@ module RDF
|
|
164
165
|
each_statement do |statement|
|
165
166
|
block.call(*statement.to_triple)
|
166
167
|
end
|
167
|
-
else
|
168
|
-
enum_triple
|
169
168
|
end
|
169
|
+
enum_triple
|
170
170
|
end
|
171
171
|
|
172
172
|
##
|
@@ -177,14 +177,13 @@ module RDF
|
|
177
177
|
def enum_triple
|
178
178
|
enum_for(:each_triple)
|
179
179
|
end
|
180
|
-
|
181
180
|
alias_method :enum_triples, :enum_triple
|
182
181
|
|
183
182
|
##
|
184
183
|
# Returns all RDF quads.
|
185
184
|
#
|
186
185
|
# @param [Hash{Symbol => Boolean}] options
|
187
|
-
# @return [Enumerator<Array(Resource, URI, Value, Resource)>]
|
186
|
+
# @return [Enumerator<Array(RDF::Resource, RDF::URI, RDF::Value, RDF::Resource)>]
|
188
187
|
# @see #each_quad
|
189
188
|
# @see #enum_quad
|
190
189
|
def quads(options = {})
|
@@ -194,7 +193,7 @@ module RDF
|
|
194
193
|
##
|
195
194
|
# Returns `true` if `self` contains the given RDF quad.
|
196
195
|
#
|
197
|
-
# @param [Array(Resource, URI, Value, Resource)] quad
|
196
|
+
# @param [Array(RDF::Resource, RDF::URI, RDF::Value, RDF::Resource)] quad
|
198
197
|
# @return [Boolean]
|
199
198
|
def has_quad?(quad)
|
200
199
|
enum_quad.include?(quad)
|
@@ -209,10 +208,12 @@ module RDF
|
|
209
208
|
#
|
210
209
|
# @overload each_quad
|
211
210
|
# @yield [subject, predicate, object, context]
|
212
|
-
#
|
213
|
-
# @yieldparam [
|
214
|
-
# @yieldparam [
|
215
|
-
# @yieldparam [
|
211
|
+
# each quad
|
212
|
+
# @yieldparam [RDF::Resource] subject
|
213
|
+
# @yieldparam [RDF::URI] predicate
|
214
|
+
# @yieldparam [RDF::Value] object
|
215
|
+
# @yieldparam [RDF::Resource] context
|
216
|
+
# @yieldreturn [void] ignored
|
216
217
|
# @return [void]
|
217
218
|
#
|
218
219
|
# @overload each_quad
|
@@ -225,9 +226,8 @@ module RDF
|
|
225
226
|
each_statement do |statement|
|
226
227
|
block.call(*statement.to_quad)
|
227
228
|
end
|
228
|
-
else
|
229
|
-
enum_quad
|
230
229
|
end
|
230
|
+
enum_quad
|
231
231
|
end
|
232
232
|
|
233
233
|
##
|
@@ -238,15 +238,14 @@ module RDF
|
|
238
238
|
def enum_quad
|
239
239
|
enum_for(:each_quad)
|
240
240
|
end
|
241
|
-
|
242
241
|
alias_method :enum_quads, :enum_quad
|
243
242
|
|
244
243
|
##
|
245
|
-
# Returns all unique RDF
|
244
|
+
# Returns all unique RDF subject terms.
|
246
245
|
#
|
247
246
|
# @param [Hash{Symbol => Boolean}] options
|
248
247
|
# @option options [Boolean] :unique (true)
|
249
|
-
# @return [Enumerator<Resource>]
|
248
|
+
# @return [Enumerator<RDF::Resource>]
|
250
249
|
# @see #each_subject
|
251
250
|
# @see #enum_subject
|
252
251
|
def subjects(options = {})
|
@@ -258,16 +257,16 @@ module RDF
|
|
258
257
|
end
|
259
258
|
|
260
259
|
##
|
261
|
-
# Returns `true` if `self` contains the given RDF subject.
|
260
|
+
# Returns `true` if `self` contains the given RDF subject term.
|
262
261
|
#
|
263
|
-
# @param [Resource] value
|
262
|
+
# @param [RDF::Resource] value
|
264
263
|
# @return [Boolean]
|
265
264
|
def has_subject?(value)
|
266
265
|
enum_subject.include?(value)
|
267
266
|
end
|
268
267
|
|
269
268
|
##
|
270
|
-
# Iterates the given block for each unique RDF subject.
|
269
|
+
# Iterates the given block for each unique RDF subject term.
|
271
270
|
#
|
272
271
|
# If no block was given, returns an enumerator.
|
273
272
|
#
|
@@ -275,7 +274,9 @@ module RDF
|
|
275
274
|
#
|
276
275
|
# @overload each_subject
|
277
276
|
# @yield [subject]
|
278
|
-
#
|
277
|
+
# each subject term
|
278
|
+
# @yieldparam [RDF::Resource] subject
|
279
|
+
# @yieldreturn [void] ignored
|
279
280
|
# @return [void]
|
280
281
|
#
|
281
282
|
# @overload each_subject
|
@@ -293,9 +294,8 @@ module RDF
|
|
293
294
|
block.call(value)
|
294
295
|
end
|
295
296
|
end
|
296
|
-
else
|
297
|
-
enum_subject
|
298
297
|
end
|
298
|
+
enum_subject
|
299
299
|
end
|
300
300
|
|
301
301
|
##
|
@@ -306,15 +306,14 @@ module RDF
|
|
306
306
|
def enum_subject
|
307
307
|
enum_for(:each_subject)
|
308
308
|
end
|
309
|
-
|
310
309
|
alias_method :enum_subjects, :enum_subject
|
311
310
|
|
312
311
|
##
|
313
|
-
# Returns all unique RDF
|
312
|
+
# Returns all unique RDF predicate terms.
|
314
313
|
#
|
315
314
|
# @param [Hash{Symbol => Boolean}] options
|
316
315
|
# @option options [Boolean] :unique (true)
|
317
|
-
# @return [Enumerator<URI>]
|
316
|
+
# @return [Enumerator<RDF::URI>]
|
318
317
|
# @see #each_predicate
|
319
318
|
# @see #enum_predicate
|
320
319
|
def predicates(options = {})
|
@@ -326,16 +325,16 @@ module RDF
|
|
326
325
|
end
|
327
326
|
|
328
327
|
##
|
329
|
-
# Returns `true` if `self` contains the given RDF predicate.
|
328
|
+
# Returns `true` if `self` contains the given RDF predicate term.
|
330
329
|
#
|
331
|
-
# @param [URI] value
|
330
|
+
# @param [RDF::URI] value
|
332
331
|
# @return [Boolean]
|
333
332
|
def has_predicate?(value)
|
334
333
|
enum_predicate.include?(value)
|
335
334
|
end
|
336
335
|
|
337
336
|
##
|
338
|
-
# Iterates the given block for each unique RDF predicate.
|
337
|
+
# Iterates the given block for each unique RDF predicate term.
|
339
338
|
#
|
340
339
|
# If no block was given, returns an enumerator.
|
341
340
|
#
|
@@ -343,7 +342,9 @@ module RDF
|
|
343
342
|
#
|
344
343
|
# @overload each_predicate
|
345
344
|
# @yield [predicate]
|
346
|
-
#
|
345
|
+
# each predicate term
|
346
|
+
# @yieldparam [RDF::URI] predicate
|
347
|
+
# @yieldreturn [void] ignored
|
347
348
|
# @return [void]
|
348
349
|
#
|
349
350
|
# @overload each_predicate
|
@@ -361,9 +362,8 @@ module RDF
|
|
361
362
|
block.call(value)
|
362
363
|
end
|
363
364
|
end
|
364
|
-
else
|
365
|
-
enum_predicate
|
366
365
|
end
|
366
|
+
enum_predicate
|
367
367
|
end
|
368
368
|
|
369
369
|
##
|
@@ -374,15 +374,14 @@ module RDF
|
|
374
374
|
def enum_predicate
|
375
375
|
enum_for(:each_predicate)
|
376
376
|
end
|
377
|
-
|
378
377
|
alias_method :enum_predicates, :enum_predicate
|
379
378
|
|
380
379
|
##
|
381
|
-
# Returns all unique RDF
|
380
|
+
# Returns all unique RDF object terms.
|
382
381
|
#
|
383
382
|
# @param [Hash{Symbol => Boolean}] options
|
384
383
|
# @option options [Boolean] :unique (true)
|
385
|
-
# @return [Enumerator<Value>]
|
384
|
+
# @return [Enumerator<RDF::Value>]
|
386
385
|
# @see #each_object
|
387
386
|
# @see #enum_object
|
388
387
|
def objects(options = {})
|
@@ -394,16 +393,16 @@ module RDF
|
|
394
393
|
end
|
395
394
|
|
396
395
|
##
|
397
|
-
# Returns `true` if `self` contains the given RDF object.
|
396
|
+
# Returns `true` if `self` contains the given RDF object term.
|
398
397
|
#
|
399
|
-
# @param [Value] value
|
398
|
+
# @param [RDF::Value] value
|
400
399
|
# @return [Boolean]
|
401
400
|
def has_object?(value)
|
402
401
|
enum_object.include?(value)
|
403
402
|
end
|
404
403
|
|
405
404
|
##
|
406
|
-
# Iterates the given block for each unique RDF object.
|
405
|
+
# Iterates the given block for each unique RDF object term.
|
407
406
|
#
|
408
407
|
# If no block was given, returns an enumerator.
|
409
408
|
#
|
@@ -411,7 +410,9 @@ module RDF
|
|
411
410
|
#
|
412
411
|
# @overload each_object
|
413
412
|
# @yield [object]
|
414
|
-
#
|
413
|
+
# each object term
|
414
|
+
# @yieldparam [RDF::Value] object
|
415
|
+
# @yieldreturn [void] ignored
|
415
416
|
# @return [void]
|
416
417
|
#
|
417
418
|
# @overload each_object
|
@@ -429,9 +430,8 @@ module RDF
|
|
429
430
|
block.call(value)
|
430
431
|
end
|
431
432
|
end
|
432
|
-
else
|
433
|
-
enum_object
|
434
433
|
end
|
434
|
+
enum_object
|
435
435
|
end
|
436
436
|
|
437
437
|
##
|
@@ -442,7 +442,6 @@ module RDF
|
|
442
442
|
def enum_object
|
443
443
|
enum_for(:each_object)
|
444
444
|
end
|
445
|
-
|
446
445
|
alias_method :enum_objects, :enum_object
|
447
446
|
|
448
447
|
##
|
@@ -450,7 +449,7 @@ module RDF
|
|
450
449
|
#
|
451
450
|
# @param [Hash{Symbol => Boolean}] options
|
452
451
|
# @option options [Boolean] :unique (true)
|
453
|
-
# @return [Enumerator<Resource>]
|
452
|
+
# @return [Enumerator<RDF::Resource>]
|
454
453
|
# @see #each_context
|
455
454
|
# @see #enum_context
|
456
455
|
def contexts(options = {})
|
@@ -464,7 +463,7 @@ module RDF
|
|
464
463
|
##
|
465
464
|
# Returns `true` if `self` contains the given RDF context.
|
466
465
|
#
|
467
|
-
# @param [Resource] value
|
466
|
+
# @param [RDF::Resource] value
|
468
467
|
# @return [Boolean]
|
469
468
|
def has_context?(value)
|
470
469
|
enum_context.include?(value)
|
@@ -479,7 +478,9 @@ module RDF
|
|
479
478
|
#
|
480
479
|
# @overload each_context
|
481
480
|
# @yield [context]
|
482
|
-
#
|
481
|
+
# each context term
|
482
|
+
# @yieldparam [RDF::Resource] context
|
483
|
+
# @yieldreturn [void] ignored
|
483
484
|
# @return [void]
|
484
485
|
#
|
485
486
|
# @overload each_context
|
@@ -497,9 +498,8 @@ module RDF
|
|
497
498
|
block.call(value)
|
498
499
|
end
|
499
500
|
end
|
500
|
-
else
|
501
|
-
enum_context
|
502
501
|
end
|
502
|
+
enum_context
|
503
503
|
end
|
504
504
|
|
505
505
|
##
|
@@ -510,7 +510,6 @@ module RDF
|
|
510
510
|
def enum_context
|
511
511
|
enum_for(:each_context)
|
512
512
|
end
|
513
|
-
|
514
513
|
alias_method :enum_contexts, :enum_context
|
515
514
|
|
516
515
|
##
|
@@ -522,7 +521,9 @@ module RDF
|
|
522
521
|
#
|
523
522
|
# @overload each_graph
|
524
523
|
# @yield [graph]
|
525
|
-
#
|
524
|
+
# each graph
|
525
|
+
# @yieldparam [RDF::Graph] graph
|
526
|
+
# @yieldreturn [void] ignored
|
526
527
|
# @return [void]
|
527
528
|
#
|
528
529
|
# @overload each_graph
|
@@ -537,9 +538,8 @@ module RDF
|
|
537
538
|
each_context do |context|
|
538
539
|
block.call(RDF::Graph.new(context, :data => self))
|
539
540
|
end
|
540
|
-
else
|
541
|
-
enum_graph
|
542
541
|
end
|
542
|
+
enum_graph
|
543
543
|
end
|
544
544
|
|
545
545
|
##
|
@@ -551,7 +551,6 @@ module RDF
|
|
551
551
|
def enum_graph
|
552
552
|
enum_for(:each_graph)
|
553
553
|
end
|
554
|
-
|
555
554
|
alias_method :enum_graphs, :enum_graph
|
556
555
|
|
557
556
|
##
|
@@ -578,12 +577,13 @@ module RDF
|
|
578
577
|
end
|
579
578
|
|
580
579
|
##
|
581
|
-
# Returns all RDF
|
580
|
+
# Returns all RDF object terms indexed by their subject and predicate
|
581
|
+
# terms.
|
582
582
|
#
|
583
583
|
# The return value is a `Hash` instance that has the structure:
|
584
584
|
# `{subject => {predicate => [*objects]}}`.
|
585
585
|
#
|
586
|
-
# @return [Hash
|
586
|
+
# @return [Hash]
|
587
587
|
def to_hash
|
588
588
|
result = {}
|
589
589
|
each_statement do |statement|
|
@@ -613,5 +613,5 @@ module RDF
|
|
613
613
|
def dump(*args)
|
614
614
|
RDF::Writer.for(*args).dump(self)
|
615
615
|
end
|
616
|
-
end
|
617
|
-
end
|
616
|
+
end # Enumerable
|
617
|
+
end # RDF
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# A mixin that can be used to mark RDF repository implementations as
|
4
|
+
# indexable.
|
5
|
+
#
|
6
|
+
# @since 0.3.0
|
7
|
+
module Indexable
|
8
|
+
##
|
9
|
+
# Returns `true` if `self` is indexed at present.
|
10
|
+
#
|
11
|
+
# @abstract
|
12
|
+
# @return [Boolean]
|
13
|
+
def indexed?
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Indexes `self`.
|
19
|
+
#
|
20
|
+
# @abstract
|
21
|
+
# @return [void]
|
22
|
+
def index!
|
23
|
+
raise NotImplementedError, "#{self.class}#index!"
|
24
|
+
end
|
25
|
+
end # Indexable
|
26
|
+
end # RDF
|
data/lib/rdf/mixin/mutable.rb
CHANGED
@@ -95,7 +95,7 @@ module RDF
|
|
95
95
|
raise TypeError.new("#{self} is immutable") if immutable?
|
96
96
|
|
97
97
|
statements.each do |statement|
|
98
|
-
if (statement =
|
98
|
+
if (statement = Statement.from(statement))
|
99
99
|
delete([statement.subject, statement.predicate, nil])
|
100
100
|
insert(statement) if statement.has_object?
|
101
101
|
end
|
@@ -118,7 +118,7 @@ module RDF
|
|
118
118
|
when value.respond_to?(:each_statement)
|
119
119
|
delete_statements(value)
|
120
120
|
nil
|
121
|
-
when (statement =
|
121
|
+
when (statement = Statement.from(value)).valid?
|
122
122
|
statement
|
123
123
|
else
|
124
124
|
delete_statements(query(value))
|
data/lib/rdf/mixin/queryable.rb
CHANGED
@@ -22,21 +22,28 @@ module RDF
|
|
22
22
|
#
|
23
23
|
# @param [Query, Statement, Array(Value), Hash] pattern
|
24
24
|
# @yield [statement]
|
25
|
-
# @yieldparam [RDF::Statement]
|
26
|
-
# @return [Enumerator
|
25
|
+
# @yieldparam [RDF::Statement] statement
|
26
|
+
# @return [Enumerator]
|
27
27
|
# @see RDF::Queryable#query_pattern
|
28
28
|
def query(pattern, &block)
|
29
|
-
raise TypeError
|
29
|
+
raise TypeError, "#{self} is not readable" if respond_to?(:readable?) && !readable?
|
30
30
|
|
31
31
|
case pattern
|
32
|
+
# A basic graph pattern (BGP) query:
|
32
33
|
when Query
|
33
|
-
|
34
|
+
if block_given?
|
35
|
+
query_execute(pattern, &block)
|
36
|
+
return self
|
37
|
+
else
|
38
|
+
return enum_for(:query_execute, pattern)
|
39
|
+
end
|
40
|
+
|
41
|
+
# A simple triple pattern query:
|
34
42
|
else
|
35
43
|
pattern = Query::Pattern.from(pattern)
|
36
|
-
|
37
44
|
if block_given?
|
38
45
|
query_pattern(pattern, &block)
|
39
|
-
return
|
46
|
+
return self
|
40
47
|
else
|
41
48
|
enum = enum_for(:query_pattern, pattern)
|
42
49
|
enum.extend(RDF::Queryable, RDF::Enumerable, RDF::Countable)
|
@@ -48,25 +55,56 @@ module RDF
|
|
48
55
|
end
|
49
56
|
end
|
50
57
|
|
58
|
+
##
|
59
|
+
# Queries `self` using the given basic graph pattern (BGP) query,
|
60
|
+
# yielding each matched solution to the given block.
|
61
|
+
#
|
62
|
+
# Since RDF.rb 0.3.0, repository implementations can override this
|
63
|
+
# method in order to provide for storage-specific optimized graph
|
64
|
+
# pattern query execution.
|
65
|
+
#
|
66
|
+
# @param [RDF::Query] query
|
67
|
+
# the query to execute
|
68
|
+
# @yield [solution]
|
69
|
+
# @yieldparam [RDF::Query::Solution] solution
|
70
|
+
# @yieldreturn [void] ignored
|
71
|
+
# @return [void] ignored
|
72
|
+
# @see RDF::Queryable#query
|
73
|
+
# @see RDF::Query#execute
|
74
|
+
# @since 0.3.0
|
75
|
+
def query_execute(query, &block)
|
76
|
+
# By default, we let RDF.rb's built-in `RDF::Query#execute` handle BGP
|
77
|
+
# query execution by breaking down the query into its constituent
|
78
|
+
# triple patterns and invoking `RDF::Query::Pattern#execute` on each
|
79
|
+
# pattern.
|
80
|
+
query.execute(self, &block)
|
81
|
+
end
|
82
|
+
protected :query_execute
|
83
|
+
|
51
84
|
##
|
52
85
|
# Queries `self` for RDF statements matching the given `pattern`,
|
53
86
|
# yielding each matched statement to the given block.
|
54
87
|
#
|
55
|
-
# Since RDF.rb 0.2.0,
|
56
|
-
#
|
57
|
-
#
|
88
|
+
# Since RDF.rb 0.2.0, repository implementations should override this
|
89
|
+
# method in order to provide for storage-specific optimized triple
|
90
|
+
# pattern matching.
|
58
91
|
#
|
59
92
|
# @param [RDF::Query::Pattern] pattern
|
93
|
+
# the query pattern to match
|
60
94
|
# @yield [statement]
|
61
|
-
# @yieldparam
|
62
|
-
# @
|
95
|
+
# @yieldparam [RDF::Statement] statement
|
96
|
+
# @yieldreturn [void] ignored
|
97
|
+
# @return [void] ignored
|
63
98
|
# @see RDF::Queryable#query
|
99
|
+
# @see RDF::Query::Pattern#execute
|
64
100
|
# @since 0.2.0
|
65
101
|
def query_pattern(pattern, &block)
|
102
|
+
# By default, we let Ruby's built-in `Enumerable#grep` handle the
|
103
|
+
# matching of statements by iterating over all statements and calling
|
104
|
+
# `RDF::Query::Pattern#===` on each statement.
|
66
105
|
# @see http://ruby-doc.org/core/classes/Enumerable.html#M003121
|
67
106
|
grep(pattern, &block)
|
68
107
|
end
|
69
|
-
|
70
108
|
protected :query_pattern
|
71
109
|
|
72
110
|
##
|
data/lib/rdf/mixin/writable.rb
CHANGED
@@ -6,7 +6,7 @@ module RDF
|
|
6
6
|
##
|
7
7
|
# Returns `true` if `self` is writable.
|
8
8
|
#
|
9
|
-
# @return [Boolean]
|
9
|
+
# @return [Boolean] `true` or `false`
|
10
10
|
# @see RDF::Readable#readable?
|
11
11
|
def writable?
|
12
12
|
true
|
@@ -16,7 +16,7 @@ module RDF
|
|
16
16
|
# Inserts RDF data into `self`.
|
17
17
|
#
|
18
18
|
# @param [RDF::Enumerable, RDF::Statement, #to_rdf] data
|
19
|
-
# @return [Writable]
|
19
|
+
# @return [RDF::Writable] `self`
|
20
20
|
def <<(data)
|
21
21
|
case data
|
22
22
|
when RDF::Reader
|
@@ -31,7 +31,7 @@ module RDF
|
|
31
31
|
when data.respond_to?(:to_rdf) && !data.equal?(rdf = data.to_rdf)
|
32
32
|
self << rdf
|
33
33
|
else
|
34
|
-
insert_statement(
|
34
|
+
insert_statement(Statement.from(data))
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -42,14 +42,14 @@ module RDF
|
|
42
42
|
# Inserts RDF statements into `self`.
|
43
43
|
#
|
44
44
|
# @param [Array<RDF::Statement>] statements
|
45
|
-
# @return [Writable]
|
45
|
+
# @return [RDF::Writable] `self`
|
46
46
|
def insert(*statements)
|
47
47
|
statements.map! do |value|
|
48
48
|
case
|
49
49
|
when value.respond_to?(:each_statement)
|
50
50
|
insert_statements(value)
|
51
51
|
nil
|
52
|
-
when (statement =
|
52
|
+
when (statement = Statement.from(value)).valid?
|
53
53
|
statement
|
54
54
|
else
|
55
55
|
raise ArgumentError.new("not a valid statement: #{value.inspect}")
|
@@ -60,7 +60,6 @@ module RDF
|
|
60
60
|
|
61
61
|
return self
|
62
62
|
end
|
63
|
-
|
64
63
|
alias_method :insert!, :insert
|
65
64
|
|
66
65
|
protected
|
@@ -119,6 +118,7 @@ module RDF
|
|
119
118
|
#
|
120
119
|
# @param [RDF::Enumerable] statements
|
121
120
|
# @return [void]
|
121
|
+
# @since 0.1.6
|
122
122
|
def insert_statements(statements)
|
123
123
|
each = statements.respond_to?(:each_statement) ? :each_statement : :each
|
124
124
|
statements.__send__(each) do |statement|
|
@@ -141,18 +141,7 @@ module RDF
|
|
141
141
|
raise NotImplementedError.new("#{self.class}#insert_statement")
|
142
142
|
end
|
143
143
|
|
144
|
-
##
|
145
|
-
# Transforms various input into an `RDF::Statement` instance.
|
146
|
-
#
|
147
|
-
# @param [RDF::Statement, Hash, Array, #to_a] statement
|
148
|
-
# @return [RDF::Statement]
|
149
|
-
# @deprecated
|
150
|
-
def create_statement(statement)
|
151
|
-
Statement.from(statement)
|
152
|
-
end
|
153
|
-
|
154
144
|
protected :insert_statements
|
155
145
|
protected :insert_statement
|
156
|
-
|
157
|
-
|
158
|
-
end
|
146
|
+
end # Writable
|
147
|
+
end # RDF
|