rdf 0.0.6 → 0.0.7
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 -1
- data/VERSION +1 -1
- data/lib/rdf.rb +25 -22
- data/lib/rdf/enumerable.rb +554 -0
- data/lib/rdf/format.rb +239 -41
- data/lib/rdf/model/graph.rb +82 -0
- data/lib/rdf/{literal.rb → model/literal.rb} +47 -4
- data/lib/rdf/{node.rb → model/node.rb} +0 -0
- data/lib/rdf/{resource.rb → model/resource.rb} +0 -0
- data/lib/rdf/{statement.rb → model/statement.rb} +12 -0
- data/lib/rdf/{uri.rb → model/uri.rb} +20 -7
- data/lib/rdf/model/value.rb +135 -0
- data/lib/rdf/ntriples.rb +35 -2
- data/lib/rdf/ntriples/format.rb +4 -4
- data/lib/rdf/ntriples/reader.rb +2 -2
- data/lib/rdf/ntriples/writer.rb +26 -19
- data/lib/rdf/query.rb +4 -4
- data/lib/rdf/query/pattern.rb +3 -3
- data/lib/rdf/query/solution.rb +2 -2
- data/lib/rdf/query/variable.rb +3 -3
- data/lib/rdf/reader.rb +85 -16
- data/lib/rdf/repository.rb +104 -12
- data/lib/rdf/version.rb +1 -1
- data/lib/rdf/vocab.rb +171 -0
- data/lib/rdf/vocab/cc.rb +18 -0
- data/lib/rdf/vocab/dc.rb +63 -0
- data/lib/rdf/vocab/doap.rb +45 -0
- data/lib/rdf/vocab/exif.rb +168 -0
- data/lib/rdf/vocab/foaf.rb +69 -0
- data/lib/rdf/vocab/http.rb +26 -0
- data/lib/rdf/vocab/owl.rb +59 -0
- data/lib/rdf/{vocabulary → vocab}/rdf.rb +7 -1
- data/lib/rdf/vocab/rdfs.rb +17 -0
- data/lib/rdf/{vocabulary → vocab}/rss.rb +6 -1
- data/lib/rdf/vocab/sioc.rb +93 -0
- data/lib/rdf/vocab/skos.rb +36 -0
- data/lib/rdf/vocab/wot.rb +21 -0
- data/lib/rdf/vocab/xhtml.rb +9 -0
- data/lib/rdf/vocab/xsd.rb +58 -0
- data/lib/rdf/writer.rb +123 -16
- metadata +26 -27
- data/lib/rdf/graph.rb +0 -197
- data/lib/rdf/reader/ntriples.rb +0 -5
- data/lib/rdf/value.rb +0 -76
- data/lib/rdf/vocabulary.rb +0 -133
- data/lib/rdf/vocabulary/cc.rb +0 -9
- data/lib/rdf/vocabulary/dc.rb +0 -9
- data/lib/rdf/vocabulary/doap.rb +0 -9
- data/lib/rdf/vocabulary/exif.rb +0 -9
- data/lib/rdf/vocabulary/foaf.rb +0 -9
- data/lib/rdf/vocabulary/http.rb +0 -9
- data/lib/rdf/vocabulary/owl.rb +0 -9
- data/lib/rdf/vocabulary/rdfs.rb +0 -9
- data/lib/rdf/vocabulary/sioc.rb +0 -9
- data/lib/rdf/vocabulary/skos.rb +0 -9
- data/lib/rdf/vocabulary/wot.rb +0 -9
- data/lib/rdf/vocabulary/xhtml.rb +0 -9
- data/lib/rdf/vocabulary/xsd.rb +0 -9
- data/lib/rdf/writer/ntriples.rb +0 -5
data/lib/rdf/repository.rb
CHANGED
@@ -1,8 +1,47 @@
|
|
1
1
|
module RDF
|
2
2
|
##
|
3
3
|
# An RDF repository.
|
4
|
+
#
|
5
|
+
# @example Creating a transient in-memory repository
|
6
|
+
# repository = RDF::Repository.new
|
7
|
+
#
|
8
|
+
# @example Checking whether a repository is readable/writable
|
9
|
+
# repository.readable?
|
10
|
+
# repository.writable?
|
11
|
+
#
|
12
|
+
# @example Checking whether a repository is persistent or transient
|
13
|
+
# repository.persistent?
|
14
|
+
# repository.transient?
|
15
|
+
#
|
16
|
+
# @example Checking whether a repository is empty
|
17
|
+
# repository.empty?
|
18
|
+
#
|
19
|
+
# @example Checking how many statements a repository contains
|
20
|
+
# repository.count
|
21
|
+
#
|
22
|
+
# @example Checking whether a repository contains a specific statement
|
23
|
+
# repository.has_statement?(statement)
|
24
|
+
#
|
25
|
+
# @example Enumerating statements in a repository
|
26
|
+
# repository.each_statement { |statement| statement.inspect! }
|
27
|
+
#
|
28
|
+
# @example Inserting statements into a repository
|
29
|
+
# repository.insert(*statements)
|
30
|
+
# repository.insert(statement)
|
31
|
+
# repository.insert([subject, predicate, object])
|
32
|
+
# repository << statement
|
33
|
+
# repository << [subject, predicate, object]
|
34
|
+
#
|
35
|
+
# @example Deleting statements from a repository
|
36
|
+
# repository.delete(*statements)
|
37
|
+
# repository.delete(statement)
|
38
|
+
# repository.delete([subject, predicate, object])
|
39
|
+
#
|
40
|
+
# @example Deleting all statements from a repository
|
41
|
+
# repository.clear!
|
42
|
+
#
|
4
43
|
class Repository
|
5
|
-
include Enumerable
|
44
|
+
include RDF::Enumerable
|
6
45
|
|
7
46
|
# @return [URI]
|
8
47
|
attr_reader :uri
|
@@ -116,7 +155,7 @@ module RDF
|
|
116
155
|
##
|
117
156
|
# Returns the number of RDF statements in the repository.
|
118
157
|
#
|
119
|
-
# @return [Integer]
|
158
|
+
# @return [Integer]
|
120
159
|
def size
|
121
160
|
@data.size
|
122
161
|
end
|
@@ -124,7 +163,7 @@ module RDF
|
|
124
163
|
alias_method :count, :size
|
125
164
|
|
126
165
|
##
|
127
|
-
# Returns `true` if
|
166
|
+
# Returns `true` if this repository contains the given RDF `statement`.
|
128
167
|
#
|
129
168
|
# @param [Statement] statement
|
130
169
|
# @return [Boolean]
|
@@ -137,16 +176,13 @@ module RDF
|
|
137
176
|
##
|
138
177
|
# Enumerates each RDF statement in the repository.
|
139
178
|
#
|
140
|
-
# @yield
|
179
|
+
# @yield [statement]
|
141
180
|
# @yieldparam [Statement]
|
142
|
-
# @return [
|
143
|
-
def
|
181
|
+
# @return [Enumerator]
|
182
|
+
def each(&block)
|
144
183
|
@data.each(&block)
|
145
|
-
self
|
146
184
|
end
|
147
185
|
|
148
|
-
alias_method :each, :each_statement
|
149
|
-
|
150
186
|
##
|
151
187
|
# Queries the repository for RDF statements matching the given pattern.
|
152
188
|
#
|
@@ -189,7 +225,7 @@ module RDF
|
|
189
225
|
end
|
190
226
|
|
191
227
|
##
|
192
|
-
# Inserts an RDF statement
|
228
|
+
# Inserts an RDF statement into the repository.
|
193
229
|
#
|
194
230
|
# @param [Statement, Array(Value), #to_a] statement
|
195
231
|
# @return [Repository]
|
@@ -202,6 +238,22 @@ module RDF
|
|
202
238
|
self
|
203
239
|
end
|
204
240
|
|
241
|
+
##
|
242
|
+
# Updates RDF statements in the repository.
|
243
|
+
#
|
244
|
+
# @param [Array<Statement>] statements
|
245
|
+
# @raise [TypeError] if the repository is immutable
|
246
|
+
# @return [Repository]
|
247
|
+
def update(*statements)
|
248
|
+
raise TypeError.new("repository is immutable") if immutable?
|
249
|
+
statements.each do |statement|
|
250
|
+
if (statement = create_statement(statement))
|
251
|
+
delete([statement.subject, statement.predicate, nil])
|
252
|
+
insert(statement) if statement.has_object?
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
205
257
|
##
|
206
258
|
# Inserts RDF statements into the repository.
|
207
259
|
#
|
@@ -211,7 +263,11 @@ module RDF
|
|
211
263
|
def insert(*statements)
|
212
264
|
raise TypeError.new("repository is immutable") if immutable?
|
213
265
|
statements.each do |statement|
|
214
|
-
|
266
|
+
if (statement = create_statement(statement)).valid?
|
267
|
+
insert_statement(statement)
|
268
|
+
else
|
269
|
+
raise ArgumentError.new # FIXME
|
270
|
+
end
|
215
271
|
end
|
216
272
|
self
|
217
273
|
end
|
@@ -225,11 +281,38 @@ module RDF
|
|
225
281
|
def delete(*statements)
|
226
282
|
raise TypeError.new("repository is immutable") if immutable?
|
227
283
|
statements.each do |statement|
|
228
|
-
|
284
|
+
if (statement = create_statement(statement)).valid?
|
285
|
+
delete_statement(statement)
|
286
|
+
else
|
287
|
+
query(statement).each do |statement|
|
288
|
+
delete_statement(statement)
|
289
|
+
end
|
290
|
+
end
|
229
291
|
end
|
230
292
|
self
|
231
293
|
end
|
232
294
|
|
295
|
+
##
|
296
|
+
# Deletes all RDF statements from this repository.
|
297
|
+
#
|
298
|
+
# @return [Repository]
|
299
|
+
def clear
|
300
|
+
@data.clear
|
301
|
+
self
|
302
|
+
end
|
303
|
+
|
304
|
+
alias_method :clear!, :clear
|
305
|
+
|
306
|
+
##
|
307
|
+
# Outputs a developer-friendly representation of this repository to
|
308
|
+
# `stderr`.
|
309
|
+
#
|
310
|
+
# @return [void]
|
311
|
+
def inspect!
|
312
|
+
each_statement { |statement| statement.inspect! }
|
313
|
+
nil
|
314
|
+
end
|
315
|
+
|
233
316
|
protected
|
234
317
|
|
235
318
|
def insert_statement(statement)
|
@@ -240,5 +323,14 @@ module RDF
|
|
240
323
|
@data.delete(statement)
|
241
324
|
end
|
242
325
|
|
326
|
+
def create_statement(statement)
|
327
|
+
case statement
|
328
|
+
when Statement then statement
|
329
|
+
when Hash then Statement.new(statement)
|
330
|
+
when Array then Statement.new(*statement)
|
331
|
+
else raise ArgumentError.new # FIXME
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
243
335
|
end
|
244
336
|
end
|
data/lib/rdf/version.rb
CHANGED
data/lib/rdf/vocab.rb
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# A {Vocabulary} represents an RDFS or OWL vocabulary.
|
4
|
+
#
|
5
|
+
# ### Vocabularies:
|
6
|
+
#
|
7
|
+
# The following vocabularies are pre-defined for your convenience:
|
8
|
+
#
|
9
|
+
# * {RDF::CC} - Creative Commons (CC)
|
10
|
+
# * {RDF::DC} - Dublin Core (DC)
|
11
|
+
# * {RDF::DOAP} - Description of a Project (DOAP)
|
12
|
+
# * {RDF::EXIF} - Exchangeable Image File Format (EXIF)
|
13
|
+
# * {RDF::FOAF} - Friend of a Friend (FOAF)
|
14
|
+
# * {RDF::HTTP} - Hypertext Transfer Protocol (HTTP)
|
15
|
+
# * {RDF::OWL} - Web Ontology Language (OWL)
|
16
|
+
# * {RDF::RDFS} - RDF Schema (RDFS)
|
17
|
+
# * {RDF::RSS} - RDF Site Summary (RSS)
|
18
|
+
# * {RDF::SIOC} - Semantically-Interlinked Online Communities (SIOC)
|
19
|
+
# * {RDF::SKOS} - Simple Knowledge Organization System (SKOS)
|
20
|
+
# * {RDF::WOT} - Web of Trust (WOT)
|
21
|
+
# * {RDF::XHTML} - Extensible HyperText Markup Language (XHTML)
|
22
|
+
# * {RDF::XSD} - XML Schema (XSD)
|
23
|
+
#
|
24
|
+
# @example Using pre-defined RDF vocabularies
|
25
|
+
# include RDF
|
26
|
+
# DC.title #=> RDF::URI("http://purl.org/dc/terms/title")
|
27
|
+
# FOAF.knows #=> RDF::URI("http://xmlns.com/foaf/0.1/knows")
|
28
|
+
# RDFS.seeAlso #=> RDF::URI("http://www.w3.org/2000/01/rdf-schema#seeAlso")
|
29
|
+
# RSS.title #=> RDF::URI("http://purl.org/rss/1.0/title")
|
30
|
+
# OWL.sameAs #=> RDF::URI("http://www.w3.org/2002/07/owl#sameAs")
|
31
|
+
# XSD.dateTime #=> RDF::URI("http://www.w3.org/2001/XMLSchema#dateTime")
|
32
|
+
#
|
33
|
+
# @example Using ad-hoc RDF vocabularies
|
34
|
+
# foaf = RDF::Vocabulary.new("http://xmlns.com/foaf/0.1/")
|
35
|
+
# foaf.knows #=> RDF::URI("http://xmlns.com/foaf/0.1/knows")
|
36
|
+
# foaf[:name] #=> RDF::URI("http://xmlns.com/foaf/0.1/name")
|
37
|
+
# foaf['mbox'] #=> RDF::URI("http://xmlns.com/foaf/0.1/mbox")
|
38
|
+
#
|
39
|
+
# @see http://www.w3.org/TR/curie/
|
40
|
+
# @see http://en.wikipedia.org/wiki/QName
|
41
|
+
class Vocabulary
|
42
|
+
##
|
43
|
+
# Defines a vocabulary term called `property`.
|
44
|
+
#
|
45
|
+
# @param [Symbol]
|
46
|
+
# @return [void]
|
47
|
+
def self.property(property)
|
48
|
+
metaclass = class << self; self; end
|
49
|
+
metaclass.send(:define_method, property) { self[property] } # class method
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Returns the URI for the term `property` in this vocabulary.
|
54
|
+
#
|
55
|
+
# @param [#to_s] property
|
56
|
+
# @return [URI]
|
57
|
+
def self.[](property)
|
58
|
+
RDF::URI.new([to_s, property.to_s].join(''))
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Returns the base URI for this vocabulary class.
|
63
|
+
#
|
64
|
+
# @return [URI]
|
65
|
+
def self.to_uri
|
66
|
+
RDF::URI.new(to_s)
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Returns a string representation of this vocabulary class.
|
71
|
+
#
|
72
|
+
# @return [String]
|
73
|
+
def self.to_s
|
74
|
+
@@uris.has_key?(self) ? @@uris[self].to_s : super
|
75
|
+
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# Returns a developer-friendly representation of this vocabulary class.
|
79
|
+
#
|
80
|
+
# @return [String]
|
81
|
+
def self.inspect
|
82
|
+
if self == Vocabulary
|
83
|
+
self.to_s
|
84
|
+
else
|
85
|
+
sprintf("%s(%s)", superclass.to_s, to_s)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Undefine all superfluous instance methods:
|
90
|
+
undef_method *(instance_methods - %w(__id__ __send__ __class__ __eval__ instance_eval inspect class))
|
91
|
+
|
92
|
+
##
|
93
|
+
# @param [URI, String, #to_s]
|
94
|
+
def initialize(uri)
|
95
|
+
@uri = case uri
|
96
|
+
when RDF::URI then uri.to_s
|
97
|
+
else RDF::URI.parse(uri.to_s) ? uri.to_s : nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
##
|
102
|
+
# Returns the URI for the term `property` in this vocabulary.
|
103
|
+
#
|
104
|
+
# @param [#to_s] property
|
105
|
+
# @return [URI]
|
106
|
+
def [](property)
|
107
|
+
RDF::URI.new([to_s, property.to_s].join(''))
|
108
|
+
end
|
109
|
+
|
110
|
+
##
|
111
|
+
# Returns the base URI for this vocabulary.
|
112
|
+
#
|
113
|
+
# @return [URI]
|
114
|
+
def to_uri
|
115
|
+
RDF::URI.new(to_s)
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# Returns a string representation of this vocabulary.
|
120
|
+
#
|
121
|
+
# @return [String]
|
122
|
+
def to_s
|
123
|
+
@uri.to_s
|
124
|
+
end
|
125
|
+
|
126
|
+
##
|
127
|
+
# Returns a developer-friendly representation of this vocabulary.
|
128
|
+
#
|
129
|
+
# @return [String]
|
130
|
+
def inspect
|
131
|
+
sprintf("#<%s:%#0x(%s)>", self.class.name, __id__, to_s)
|
132
|
+
end
|
133
|
+
|
134
|
+
protected
|
135
|
+
|
136
|
+
def self.create(uri) # @private
|
137
|
+
@@uri = uri
|
138
|
+
self
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.inherited(subclass) # @private
|
142
|
+
unless @@uri.nil?
|
143
|
+
subclass.send(:private_class_method, :new)
|
144
|
+
@@uris[subclass] = @@uri
|
145
|
+
@@uri = nil
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.method_missing(property, *args, &block)
|
150
|
+
if args.empty? && @@uris.has_key?(self)
|
151
|
+
self[property]
|
152
|
+
else
|
153
|
+
super
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def method_missing(property, *args, &block)
|
158
|
+
if args.empty?
|
159
|
+
self[property]
|
160
|
+
else
|
161
|
+
raise ArgumentError.new("wrong number of arguments (#{args.size} for 0)")
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
@@uris = {} # @private
|
168
|
+
@@uri = nil # @private
|
169
|
+
|
170
|
+
end
|
171
|
+
end
|
data/lib/rdf/vocab/cc.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# Creative Commons (CC) vocabulary.
|
4
|
+
#
|
5
|
+
# @see http://creativecommons.org/ns
|
6
|
+
class CC < Vocabulary("http://creativecommons.org/ns#")
|
7
|
+
property :attributionName
|
8
|
+
property :attributionURL
|
9
|
+
property :deprecatedOn
|
10
|
+
property :jurisdiction
|
11
|
+
property :legalcode
|
12
|
+
property :license
|
13
|
+
property :morePermissions
|
14
|
+
property :permits
|
15
|
+
property :prohibits
|
16
|
+
property :requires
|
17
|
+
end
|
18
|
+
end
|
data/lib/rdf/vocab/dc.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
module RDF
|
2
|
+
##
|
3
|
+
# Dublin Core (DC) vocabulary.
|
4
|
+
#
|
5
|
+
# @see http://dublincore.org/schemas/rdfs/
|
6
|
+
class DC < Vocabulary("http://purl.org/dc/terms/")
|
7
|
+
property :abstract
|
8
|
+
property :accessRights
|
9
|
+
property :accrualMethod
|
10
|
+
property :accrualPeriodicity
|
11
|
+
property :accrualPolicy
|
12
|
+
property :alternative
|
13
|
+
property :audience
|
14
|
+
property :available
|
15
|
+
property :bibliographicCitation
|
16
|
+
property :conformsTo
|
17
|
+
property :contributor
|
18
|
+
property :coverage
|
19
|
+
property :created
|
20
|
+
property :creator
|
21
|
+
property :date
|
22
|
+
property :dateAccepted
|
23
|
+
property :dateCopyrighted
|
24
|
+
property :dateSubmitted
|
25
|
+
property :description
|
26
|
+
property :educationLevel
|
27
|
+
property :extent
|
28
|
+
property :format
|
29
|
+
property :hasFormat
|
30
|
+
property :hasPart
|
31
|
+
property :hasVersion
|
32
|
+
property :identifier
|
33
|
+
property :instructionalMethod
|
34
|
+
property :isFormatOf
|
35
|
+
property :isPartOf
|
36
|
+
property :isReferencedBy
|
37
|
+
property :isReplacedBy
|
38
|
+
property :isRequiredBy
|
39
|
+
property :isVersionOf
|
40
|
+
property :issued
|
41
|
+
property :language
|
42
|
+
property :license
|
43
|
+
property :mediator
|
44
|
+
property :medium
|
45
|
+
property :modified
|
46
|
+
property :provenance
|
47
|
+
property :publisher
|
48
|
+
property :references
|
49
|
+
property :relation
|
50
|
+
property :replaces
|
51
|
+
property :requires
|
52
|
+
property :rights
|
53
|
+
property :rightsHolder
|
54
|
+
property :source
|
55
|
+
property :spatial
|
56
|
+
property :subject
|
57
|
+
property :tableOfContents
|
58
|
+
property :temporal
|
59
|
+
property :title
|
60
|
+
property :type
|
61
|
+
property :valid
|
62
|
+
end
|
63
|
+
end
|