rdf-do 0.2.1 → 0.3.0
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 +74 -12
- data/VERSION +1 -1
- data/lib/rdf/do/adapters/defaults.rb +4 -4
- data/lib/rdf/do/adapters/postgres.rb +9 -0
- data/lib/rdf/do/version.rb +23 -0
- data/lib/rdf/do.rb +46 -96
- metadata +9 -8
data/README
CHANGED
@@ -1,23 +1,28 @@
|
|
1
1
|
# RDF::DataObjects
|
2
2
|
|
3
3
|
DataObjects-backed RDF.rb repository, aiming for a simple use case and
|
4
|
-
currently targeting SQLite and Postgres.
|
5
|
-
database.
|
4
|
+
currently targeting SQLite and Postgres.
|
6
5
|
|
7
|
-
|
6
|
+
* <http://github.com/bhuga/rdf-do>
|
7
|
+
* <http://lists.w3.org/Archives/Public/public-rdf-ruby>
|
8
|
+
|
9
|
+
This was written for a tutorial, and is thus a pretty naive implementation so far.
|
8
10
|
RDF::DataObjects stores triples in a simple subject, predicate, object, context
|
9
|
-
table. Don't try to back a big website with it yet. Nonetheless, it works
|
11
|
+
table. Don't try to back a big website with it yet. Nonetheless, it works,
|
12
|
+
and it passes all its tests on Heroku as well.
|
10
13
|
|
11
14
|
Example:
|
15
|
+
|
12
16
|
repository = RDF::DataObjects::Repository.new "sqlite3:test.db"
|
13
17
|
repository.insert(statement)
|
14
18
|
repository.count #=> 1
|
15
19
|
repository.delete(statement)
|
16
20
|
|
17
|
-
You can use any DataObjects compatible connection options
|
18
|
-
Postgres are implemented for now. The
|
19
|
-
enough with their handling of unique
|
20
|
-
work is required
|
21
|
+
You can use any DataObjects compatible connection options to create a new
|
22
|
+
repository, but only SQLite3 and Postgres are implemented for now. The
|
23
|
+
different databases are *just* different enough with their handling of unique
|
24
|
+
constraints that some database-specific work is required for a new adapter, but
|
25
|
+
it's not much.
|
21
26
|
|
22
27
|
## Installation:
|
23
28
|
|
@@ -28,7 +33,8 @@ The greatly preferred installation method is via RubyGems:
|
|
28
33
|
Manual downloads are available at <http://github.com/bhuga/rdf-do/downloads>
|
29
34
|
|
30
35
|
## Connecting:
|
31
|
-
|
36
|
+
require 'do_postgres'
|
37
|
+
require 'do_sqlite3'
|
32
38
|
repo = RDF::DataObjects::Repository.new "postgres://localhost/database"
|
33
39
|
repo = RDF::DataObjects::Repository.new "sqlite3:test.db"
|
34
40
|
|
@@ -37,12 +43,68 @@ Manual downloads are available at <http://github.com/bhuga/rdf-do/downloads>
|
|
37
43
|
|
38
44
|
Your repository is a fully-functional RDF.rb `RDF::Repository`. As with any
|
39
45
|
RDF.rb repository, this includes the mixins `RDF::Enumerable`, `RDF::Mutable`,
|
40
|
-
`RDF::Durable`, and `RDF::Queryable`. Please see <http://rdf.rubyforge.org> for
|
46
|
+
`RDF::Durable`, and `RDF::Queryable`. Please see <http://rdf.rubyforge.org/RDF/Repository.html> for
|
41
47
|
more information.
|
42
48
|
|
49
|
+
Example:
|
50
|
+
|
51
|
+
require 'rdf'
|
52
|
+
require 'rdf/ntriples'
|
53
|
+
require 'data_objects'
|
54
|
+
require 'do_sqlite3'
|
55
|
+
require 'rdf/do'
|
56
|
+
|
57
|
+
repo = RDF::DataObjects::Repository.new('sqlite3:test.db')
|
58
|
+
# repo = RDF::DataObjects::Repository.new 'postgres://postgres@server/database'
|
59
|
+
# heroku_repo = RDF::DataObjects::Repository.new(ENV['DATABASE_URL'])
|
60
|
+
repo.load('http://datagraph.org/jhacker/foaf.nt')
|
61
|
+
|
62
|
+
# How many statements did we have?
|
63
|
+
repo.count
|
64
|
+
#=> 10
|
65
|
+
|
66
|
+
# Get the URI of the first subject
|
67
|
+
jhacker = repo.first.subject
|
68
|
+
#=> #<RDF::URI(http://datagraph.org/jhacker/foaf)>
|
69
|
+
|
70
|
+
# Delete everything to do with it
|
71
|
+
jhacker_statements = repo.query(:subject => jhacker)
|
72
|
+
repo.delete *jhacker_statements
|
73
|
+
repo.count
|
74
|
+
#=> 7
|
75
|
+
|
76
|
+
# with Postgres, we could have done this, but SQLite gives us a locking error:
|
77
|
+
# repo.delete(*repo.query(:subject => jhacker))
|
78
|
+
|
79
|
+
# Changed our mind--bring it back
|
80
|
+
repo.insert *jhacker_statements
|
81
|
+
repo.count
|
82
|
+
#=> 10
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
### Developing
|
87
|
+
|
88
|
+
The main project page is on Github, at <http://github.com/bhuga/rdf-do>. You
|
89
|
+
can get a working copy of the source tree with:
|
90
|
+
|
91
|
+
$ git clone git://github.com/bhuga/rdf-do.git
|
92
|
+
|
93
|
+
Or with:
|
94
|
+
|
95
|
+
$ wget http://github.com/bhuga/rdf-do/tarball/master
|
96
|
+
|
97
|
+
### Support
|
98
|
+
|
99
|
+
The preferred method to report issues is the issue queue at
|
100
|
+
<http://github.com/bhuga/rdf-do/issues>. You'll get the the most attention if
|
101
|
+
you submit a failing test for a bug, or a pending test for a feature.
|
102
|
+
|
103
|
+
We'd also like to hear from you on the mailing list:
|
104
|
+
<http://lists.w3.org/Archives/Public/public-rdf-ruby>
|
105
|
+
|
43
106
|
### Miscellany
|
44
107
|
|
45
|
-
* Author: Ben Lavender <blavender@gmail.com> <http://bhuga.net> <http://blog.datagraph.org>
|
108
|
+
* Author: Ben Lavender | <blavender@gmail.com> | <http://bhuga.net> | <http://blog.datagraph.org>
|
46
109
|
* 'License': RDF::DataObjects is free and unemcumbered software released into the public domain. For more information, see the included UNLICENSE file.
|
47
110
|
|
48
|
-
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -24,19 +24,19 @@ module RDF::DataObjects
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def each_subject_sql
|
27
|
-
'select subject from quads'
|
27
|
+
'select distinct subject from quads'
|
28
28
|
end
|
29
29
|
|
30
30
|
def each_predicate_sql
|
31
|
-
'select predicate from quads'
|
31
|
+
'select distinct predicate from quads'
|
32
32
|
end
|
33
33
|
|
34
34
|
def each_object_sql
|
35
|
-
'select object from quads'
|
35
|
+
'select distinct object from quads'
|
36
36
|
end
|
37
37
|
|
38
38
|
def each_context_sql
|
39
|
-
'select context from quads'
|
39
|
+
'select distinct context from quads'
|
40
40
|
end
|
41
41
|
|
42
42
|
##
|
@@ -31,6 +31,15 @@ module RDF::DataObjects
|
|
31
31
|
'insert into quads (subject, predicate, object, context) VALUES (?, ?, ?, ?)'
|
32
32
|
end
|
33
33
|
|
34
|
+
# SQL prepared statement for multiple insertion
|
35
|
+
#
|
36
|
+
# @param [Integer] The number of statements to be inserted
|
37
|
+
# @return [String]
|
38
|
+
def self.multiple_insert_sql(count)
|
39
|
+
sql = 'insert into quads (subject, predicate, object, context) VALUES '
|
40
|
+
sql + (1..count).map { "(?, ?, ?, ?)" }.join(',')
|
41
|
+
end
|
42
|
+
|
34
43
|
# SQL prepared statement for deletions
|
35
44
|
#
|
36
45
|
# @return [String]
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RDF::DataObjects
|
2
|
+
module VERSION
|
3
|
+
MAJOR = 0
|
4
|
+
MINOR = 3
|
5
|
+
TINY = 0
|
6
|
+
EXTRA = nil
|
7
|
+
|
8
|
+
STRING = [MAJOR, MINOR, TINY].join('.')
|
9
|
+
STRING << ".#{EXTRA}" if EXTRA
|
10
|
+
|
11
|
+
##
|
12
|
+
# @return [String]
|
13
|
+
def self.to_s() STRING end
|
14
|
+
|
15
|
+
##
|
16
|
+
# @return [String]
|
17
|
+
def self.to_str() STRING end
|
18
|
+
|
19
|
+
##
|
20
|
+
# @return [Array(Integer, Integer, Integer)]
|
21
|
+
def self.to_a() [MAJOR, MINOR, TINY] end
|
22
|
+
end
|
23
|
+
end
|
data/lib/rdf/do.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'data_objects'
|
2
2
|
require 'rdf/ntriples'
|
3
3
|
require 'enumerator'
|
4
|
+
require 'rdf/do/version'
|
4
5
|
|
5
6
|
module RDF
|
6
7
|
|
@@ -15,7 +16,6 @@ module RDF
|
|
15
16
|
# @see RDF::DataObjects::Adapters
|
16
17
|
# @see RDF::Repository
|
17
18
|
module DataObjects
|
18
|
-
|
19
19
|
##
|
20
20
|
# RDF::DataObjects::Repository is an RDF::Repository is backed by a
|
21
21
|
# DataObjects connection.
|
@@ -88,7 +88,7 @@ module RDF
|
|
88
88
|
# @param [RDF::Statement]
|
89
89
|
# @return [void]
|
90
90
|
def insert_statement(statement)
|
91
|
-
|
91
|
+
insert_statements [statement]
|
92
92
|
end
|
93
93
|
|
94
94
|
##
|
@@ -98,20 +98,44 @@ module RDF
|
|
98
98
|
# @param [RDF::Statement]
|
99
99
|
# @return [void]
|
100
100
|
def delete_statement(statement)
|
101
|
-
|
101
|
+
delete_statements [statement]
|
102
102
|
end
|
103
103
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
104
|
+
##
|
105
|
+
# Insert multiple statements into this repository
|
106
|
+
#
|
107
|
+
# @see RDF::Mutable#insert_statements
|
108
|
+
# @param [Array]
|
109
|
+
# @return [void]
|
110
|
+
def insert_statements(statements)
|
111
|
+
if @adapter.respond_to?(:multiple_insert_sql)
|
112
|
+
each = statements.respond_to?(:each_statement) ? :each_statement : :each
|
113
|
+
args = []
|
114
|
+
count = 0
|
115
|
+
statements.__send__(each) do |s|
|
116
|
+
count += 1
|
117
|
+
args += [serialize(s. subject),serialize(s.predicate), serialize(s.object), serialize(s.context)]
|
118
|
+
end
|
119
|
+
query = @adapter.multiple_insert_sql(count)
|
120
|
+
exec(query,*(args.flatten))
|
121
|
+
else
|
122
|
+
query = @adapter.insert_sql
|
123
|
+
statements.each do |s|
|
124
|
+
exec(query, serialize(s. subject),serialize(s.predicate), serialize(s.object), serialize(s.context))
|
125
|
+
end
|
108
126
|
end
|
109
127
|
end
|
110
128
|
|
111
|
-
|
129
|
+
##
|
130
|
+
# Remove multiple statements from this repository
|
131
|
+
#
|
132
|
+
# @see RDF::Mutable#delete_statements
|
133
|
+
# @param [Array]
|
134
|
+
# @return [void]
|
135
|
+
def delete_statements(statements)
|
112
136
|
query = @adapter.delete_sql
|
113
137
|
statements.each do |s|
|
114
|
-
exec(query,serialize(s. subject),serialize(s.predicate), serialize(s.object), serialize(s.context))
|
138
|
+
exec(query, serialize(s. subject), serialize(s.predicate), serialize(s.object), serialize(s.context))
|
115
139
|
end
|
116
140
|
end
|
117
141
|
|
@@ -165,72 +189,31 @@ module RDF
|
|
165
189
|
end
|
166
190
|
|
167
191
|
##
|
168
|
-
#
|
169
|
-
#
|
170
|
-
# Will call the given method with the given block is one is given.
|
171
|
-
# Will return an enumerator with the given method called as a block if no block is given.
|
192
|
+
# Iterate over all RDF::Statements in this repository.
|
172
193
|
#
|
173
|
-
# @
|
194
|
+
# @see RDF::Enumerable#each
|
174
195
|
# @param [Proc] &block
|
175
196
|
# @return [Enumerable::Enumerator, void]
|
176
|
-
|
177
|
-
|
178
|
-
def each_or_enumerator(method, &block)
|
179
|
-
if block_given?
|
180
|
-
self.send(method, &block)
|
181
|
-
else
|
182
|
-
::Enumerable::Enumerator.new(self,:each_or_enumerator)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
##
|
187
|
-
# Implementation of #each
|
188
|
-
#
|
189
|
-
# @nodoc
|
190
|
-
# @private
|
191
|
-
# @return [void]
|
192
|
-
# @see RDF::Enumerable#each
|
193
|
-
# @see RDF::DataObjects::Repository#each_or_enumerator
|
194
|
-
def each_block(&block)
|
197
|
+
def each(&block)
|
198
|
+
return ::Enumerable::Enumerator.new(self,:each) unless block_given?
|
195
199
|
reader = result(@adapter.each_sql)
|
196
200
|
while reader.next!
|
197
201
|
block.call(RDF::Statement.new(
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
+
:subject => unserialize(reader.values[0]),
|
203
|
+
:predicate => unserialize(reader.values[1]),
|
204
|
+
:object => unserialize(reader.values[2]),
|
205
|
+
:context => unserialize(reader.values[3])))
|
202
206
|
end
|
203
207
|
end
|
204
208
|
|
205
|
-
##
|
206
|
-
# Iterate over all RDF::Statements in this repository.
|
207
|
-
#
|
208
|
-
# @see RDF::Enumerable#each
|
209
|
-
# @param [Proc] &block
|
210
|
-
# @return [Enumerable::Enumerator, void]
|
211
|
-
def each(&block)
|
212
|
-
each_or_enumerator(:each_block, &block)
|
213
|
-
end
|
214
|
-
|
215
209
|
##
|
216
210
|
# Iterate over all RDF::Resource subjects in this repository.
|
217
211
|
#
|
218
212
|
# @see RDF::Enumerable#each_subject
|
219
213
|
# @param [Proc] &block
|
220
214
|
# @return [Enumerable::Enumerator, void]
|
221
|
-
def each_subject(&block)
|
222
|
-
|
223
|
-
end
|
224
|
-
|
225
|
-
##
|
226
|
-
# Implementation of #each_subject
|
227
|
-
#
|
228
|
-
# @nodoc
|
229
|
-
# @private
|
230
|
-
# @return [void]
|
231
|
-
# @see RDF::Enumerable#each_subject
|
232
|
-
# @see RDF::DataObjects::Repository#each_or_enumerator
|
233
|
-
def subject_block(&block)
|
215
|
+
def each_subject(&block)
|
216
|
+
return ::Enumerable::Enumerator.new(self,:each_subject) unless block_given?
|
234
217
|
reader = result(@adapter.each_subject_sql)
|
235
218
|
while reader.next!
|
236
219
|
block.call(unserialize(reader.values[0]))
|
@@ -244,18 +227,7 @@ module RDF
|
|
244
227
|
# @param [Proc] &block
|
245
228
|
# @return [Enumerable::Enumerator, void]
|
246
229
|
def each_predicate(&block)
|
247
|
-
|
248
|
-
end
|
249
|
-
|
250
|
-
##
|
251
|
-
# Implementation of #each_predicate
|
252
|
-
#
|
253
|
-
# @nodoc
|
254
|
-
# @private
|
255
|
-
# @return [void]
|
256
|
-
# @see RDF::Enumerable#each_predicate
|
257
|
-
# @see RDF::DataObjects::Repository#each_or_enumerator
|
258
|
-
def predicate_block(&block)
|
230
|
+
return ::Enumerable::Enumerator.new(self,:each_predicate) unless block_given?
|
259
231
|
reader = result(@adapter.each_predicate_sql)
|
260
232
|
while reader.next!
|
261
233
|
block.call(unserialize(reader.values[0]))
|
@@ -269,18 +241,7 @@ module RDF
|
|
269
241
|
# @param [Proc] &block
|
270
242
|
# @return [Enumerable::Enumerator, void]
|
271
243
|
def each_object(&block)
|
272
|
-
|
273
|
-
end
|
274
|
-
|
275
|
-
##
|
276
|
-
# Implementation of #each_object
|
277
|
-
#
|
278
|
-
# @nodoc
|
279
|
-
# @private
|
280
|
-
# @return [void]
|
281
|
-
# @see RDF::Enumerable#each_object
|
282
|
-
# @see RDF::DataObjects::Repository#each_or_enumerator
|
283
|
-
def object_block(&block)
|
244
|
+
return ::Enumerable::Enumerator.new(self,:each_object) unless block_given?
|
284
245
|
reader = result(@adapter.each_object_sql)
|
285
246
|
while reader.next!
|
286
247
|
block.call(unserialize(reader.values[0]))
|
@@ -294,18 +255,7 @@ module RDF
|
|
294
255
|
# @param [Proc] &block
|
295
256
|
# @return [Enumerable::Enumerator, void]
|
296
257
|
def each_context(&block)
|
297
|
-
|
298
|
-
end
|
299
|
-
|
300
|
-
##
|
301
|
-
# Implementation of #each_context
|
302
|
-
#
|
303
|
-
# @nodoc
|
304
|
-
# @private
|
305
|
-
# @return [void]
|
306
|
-
# @see RDF::Enumerable#each_context
|
307
|
-
# @see RDF::DataObjects::Repository#each_or_enumerator
|
308
|
-
def context_block(&block)
|
258
|
+
return ::Enumerable::Enumerator.new(self,:each_context) unless block_given?
|
309
259
|
reader = result(@adapter.each_context_sql)
|
310
260
|
while reader.next!
|
311
261
|
context = unserialize(reader.values[0])
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ben Lavender
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-17 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -27,8 +27,8 @@ dependencies:
|
|
27
27
|
segments:
|
28
28
|
- 0
|
29
29
|
- 1
|
30
|
-
-
|
31
|
-
version: 0.1.
|
30
|
+
- 7
|
31
|
+
version: 0.1.7
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
@@ -55,8 +55,8 @@ dependencies:
|
|
55
55
|
segments:
|
56
56
|
- 0
|
57
57
|
- 1
|
58
|
-
-
|
59
|
-
version: 0.1.
|
58
|
+
- 6
|
59
|
+
version: 0.1.6
|
60
60
|
type: :development
|
61
61
|
version_requirements: *id003
|
62
62
|
- !ruby/object:Gem::Dependency
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- lib/rdf/do/adapters/defaults.rb
|
104
104
|
- lib/rdf/do/adapters/postgres.rb
|
105
105
|
- lib/rdf/do/adapters/sqlite3.rb
|
106
|
+
- lib/rdf/do/version.rb
|
106
107
|
- lib/rdf/do.rb
|
107
108
|
has_rdoc: false
|
108
109
|
homepage: http://rdf.rubyforge.org/
|