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
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
|