rdfobjects 0.5.0 → 0.6.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/lib/rdf_objects/collection.rb +29 -0
- data/lib/rdf_objects/parsers.rb +23 -43
- data/lib/rdf_objects/rdf_resource.rb +0 -48
- data/lib/rdf_objects.rb +2 -1
- metadata +2 -2
- data/lib/rdf_objects/rdfxml_parser.rb +0 -29
@@ -0,0 +1,29 @@
|
|
1
|
+
module RDFObject
|
2
|
+
class Collection < Hash
|
3
|
+
def uris
|
4
|
+
return self.keys
|
5
|
+
end
|
6
|
+
def find_by_type(type)
|
7
|
+
self.find_all {|r| r}
|
8
|
+
end
|
9
|
+
|
10
|
+
def find_or_create(uri)
|
11
|
+
if uri.could_be_a_safe_curie?
|
12
|
+
uri = Curie.parse uri
|
13
|
+
end
|
14
|
+
self[uri] = Resource.new(uri) unless self[uri]
|
15
|
+
self[uri]
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove(resource)
|
19
|
+
self.delete(resource.uri)
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse(data, format=nil)
|
23
|
+
parser = Parser.init_parser(data, format)
|
24
|
+
parser.collection = self
|
25
|
+
parser.parse
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/rdf_objects/parsers.rb
CHANGED
@@ -58,26 +58,15 @@ class UTF8Parser < StringScanner
|
|
58
58
|
raise StandardError, "Caught #{e.class}: #{e}"
|
59
59
|
end
|
60
60
|
end
|
61
|
-
module RDFObject
|
62
|
-
class Collection < Hash
|
63
|
-
attr_accessor :objects
|
64
|
-
def initialize(subjects=true)
|
65
|
-
@objects = Collection.new(false) if subjects
|
66
|
-
end
|
67
|
-
def uris
|
68
|
-
return self.keys
|
69
|
-
end
|
70
|
-
def find_by_type(type)
|
71
|
-
self.find_all {|r| r}
|
72
|
-
end
|
73
|
-
def resources
|
74
|
-
self.merge(@objects)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
61
|
+
module RDFObject
|
78
62
|
class Parser
|
79
63
|
# Choose the best format parser from an admittedly small group of choices.
|
80
64
|
def self.parse(rdf, format=nil)
|
65
|
+
parser = init_parser(rdf, format)
|
66
|
+
parser.parse
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.init_parser(rdf, format=nil)
|
81
70
|
if format
|
82
71
|
parser = case format
|
83
72
|
when 'rdfxml' then XMLParser.new(rdf)
|
@@ -112,17 +101,17 @@ module RDFObject
|
|
112
101
|
end
|
113
102
|
end
|
114
103
|
end
|
115
|
-
parser
|
116
|
-
end
|
104
|
+
parser
|
105
|
+
end
|
106
|
+
|
117
107
|
attr_reader :collection
|
118
108
|
def initialize(data=nil)
|
119
109
|
@collection = Collection.new
|
120
110
|
self.data=(data) if data
|
121
111
|
end
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
Resource.new(uri)
|
112
|
+
def collection=(collection)
|
113
|
+
raise ArgumentError unless collection.is_a?(RDFObject::Collection)
|
114
|
+
@collection = collection
|
126
115
|
end
|
127
116
|
end
|
128
117
|
class NTriplesParser < RDFObject::Parser
|
@@ -142,8 +131,7 @@ module RDFObject
|
|
142
131
|
tmp_object = scanner.scan_until(/>\s?\.\s*\n?$/)
|
143
132
|
tmp_object.sub!(/^</,'')
|
144
133
|
tmp_object.sub!(/>\s?\.\s*\n?$/,'')
|
145
|
-
object = find_or_create(tmp_object)
|
146
|
-
@collection[object.uri] = object
|
134
|
+
object = @collection.find_or_create(tmp_object)
|
147
135
|
else
|
148
136
|
language = nil
|
149
137
|
data_type = nil
|
@@ -185,9 +173,8 @@ module RDFObject
|
|
185
173
|
@ntriples.each do | assertion |
|
186
174
|
next if assertion[0, 1] == "#" # Ignore comments
|
187
175
|
triple = parse_ntriple(assertion)
|
188
|
-
resource = find_or_create(triple[0])
|
176
|
+
resource = @collection.find_or_create(triple[0])
|
189
177
|
resource.assert(triple[1], triple[2])
|
190
|
-
@collection[resource.uri] = resource
|
191
178
|
end
|
192
179
|
@collection
|
193
180
|
end
|
@@ -202,11 +189,10 @@ module RDFObject
|
|
202
189
|
#
|
203
190
|
|
204
191
|
def parse
|
205
|
-
|
206
|
-
if namespaces.index("http://purl.org/rss/1.0/")
|
192
|
+
if @rdfxml.namespaces.values.index("http://purl.org/rss/1.0/")
|
207
193
|
fix_rss10
|
208
194
|
end
|
209
|
-
if namespaces.index("http://www.w3.org/2005/sparql-results#")
|
195
|
+
if @rdfxml.namespaces.values.index("http://www.w3.org/2005/sparql-results#")
|
210
196
|
raise "Sorry, SPARQL not yet supported"
|
211
197
|
else
|
212
198
|
parse_rdfxml
|
@@ -223,17 +209,16 @@ module RDFObject
|
|
223
209
|
end
|
224
210
|
|
225
211
|
def parse_resource_node(resource_node, collection)
|
226
|
-
resource = find_or_create(resource_node.attribute_with_ns('about', "http://www.w3.org/1999/02/22-rdf-syntax-ns#").value)
|
212
|
+
resource = @collection.find_or_create(resource_node.attribute_with_ns('about', "http://www.w3.org/1999/02/22-rdf-syntax-ns#").value)
|
227
213
|
unless (resource_node.name == "Description" and resource_node.namespace.href == "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
|
228
|
-
resource.assert("[rdf:type]", find_or_create("#{resource_node.namespace.href}#{resource_node.name}"))
|
214
|
+
resource.assert("[rdf:type]", @collection.find_or_create("#{resource_node.namespace.href}#{resource_node.name}"))
|
229
215
|
end
|
230
216
|
resource_node.children.each do | child |
|
231
217
|
next if child.text?
|
232
218
|
predicate = "#{child.namespace.href}#{child.name}"
|
233
219
|
if object_uri = child.attribute_with_ns("resource", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
|
234
|
-
obj_resource = find_or_create(object_uri.value)
|
220
|
+
obj_resource = @collection.find_or_create(object_uri.value)
|
235
221
|
resource.assert(predicate, obj_resource)
|
236
|
-
@collection[obj_resource.uri] = obj_resource
|
237
222
|
elsif all_text?(child)
|
238
223
|
opts = {}
|
239
224
|
if lang = child.attribute_with_ns("lang", "http://www.w3.org/XML/1998/namespace")
|
@@ -245,13 +230,11 @@ module RDFObject
|
|
245
230
|
resource.assert(predicate, Literal.new(child.content.strip,opts))
|
246
231
|
end
|
247
232
|
child.xpath("./*[@rdf:about]").each do | grandchild |
|
248
|
-
gc_resource = find_or_create(grandchild.attribute_with_ns('about', "http://www.w3.org/1999/02/22-rdf-syntax-ns#").value)
|
233
|
+
gc_resource = @collection.find_or_create(grandchild.attribute_with_ns('about', "http://www.w3.org/1999/02/22-rdf-syntax-ns#").value)
|
249
234
|
resource.assert(predicate, gc_resource)
|
250
|
-
@collection[gc_resource.uri] = gc_resource
|
251
235
|
parse_resource_node(grandchild, collection)
|
252
236
|
end
|
253
237
|
end
|
254
|
-
@collection[resource.uri] = resource
|
255
238
|
end
|
256
239
|
|
257
240
|
def all_text?(node)
|
@@ -305,8 +288,7 @@ module RDFObject
|
|
305
288
|
|
306
289
|
def parse
|
307
290
|
@json.each_pair do |subject, assertions|
|
308
|
-
resource = find_or_create(subject)
|
309
|
-
@collection[resource.uri] = resource
|
291
|
+
resource = @collection.find_or_create(subject)
|
310
292
|
assertions.each_pair do |predicate, objects|
|
311
293
|
objects.each do | object |
|
312
294
|
if object['type'] == 'literal'
|
@@ -320,13 +302,11 @@ module RDFObject
|
|
320
302
|
literal = Literal.new(object['value'],opts)
|
321
303
|
resource.assert(predicate, literal)
|
322
304
|
elsif object['type'] == 'uri'
|
323
|
-
o = find_or_create(object['value'])
|
305
|
+
o = @collection.find_or_create(object['value'])
|
324
306
|
resource.assert(predicate, o)
|
325
|
-
@collection[o.uri] = o
|
326
307
|
elsif object['type'] == 'bnode' # For now, we're going to treat a blank node like a URI resource.
|
327
|
-
o = find_or_create(object['value'])
|
308
|
+
o = @collection.find_or_create(object['value'])
|
328
309
|
resource.assert(predicate, o)
|
329
|
-
@collection[o.uri] = o
|
330
310
|
end
|
331
311
|
end
|
332
312
|
end
|
@@ -5,42 +5,6 @@ require 'weakref'
|
|
5
5
|
|
6
6
|
module RDFObject
|
7
7
|
class Resource < OpenStruct
|
8
|
-
class << self
|
9
|
-
def instances
|
10
|
-
instances = {}
|
11
|
-
ObjectSpace.each_object(self) { | rdf_object |
|
12
|
-
next unless rdf_object.uri
|
13
|
-
instances[rdf_object.uri] = rdf_object
|
14
|
-
}
|
15
|
-
instances
|
16
|
-
end
|
17
|
-
|
18
|
-
def reset!
|
19
|
-
# @instances = {}
|
20
|
-
ObjectSpace.each_object(self) { | rdf_object |
|
21
|
-
rdf_object.uri = nil
|
22
|
-
Curie.get_mappings.each do | prefix, uri |
|
23
|
-
if rdf_object.respond_to?(prefix.to_sym)
|
24
|
-
rdf_object.send("#{prefix}=".to_sym, nil)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
}
|
28
|
-
ObjectSpace.garbage_collect
|
29
|
-
end
|
30
|
-
|
31
|
-
def remove(resource)
|
32
|
-
to_del = instances[resource.uri]
|
33
|
-
to_del.uri = nil
|
34
|
-
end
|
35
|
-
|
36
|
-
def exists?(uri)
|
37
|
-
ObjectSpace.each_object(self) { | rdf_object |
|
38
|
-
return true if rdf_object.uri == uri
|
39
|
-
}
|
40
|
-
false
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
8
|
def initialize(uri)
|
45
9
|
if uri.could_be_a_safe_curie?
|
46
10
|
uri = Curie.parse uri
|
@@ -121,18 +85,6 @@ module RDFObject
|
|
121
85
|
end
|
122
86
|
return true
|
123
87
|
end
|
124
|
-
|
125
|
-
def self.new(uri, *opts)
|
126
|
-
#if self.exists?(uri)
|
127
|
-
# return self.instances[uri]
|
128
|
-
#end
|
129
|
-
if exists = self.instances[uri]
|
130
|
-
unless opts.index(:force)
|
131
|
-
return exists
|
132
|
-
end
|
133
|
-
end
|
134
|
-
super(uri)
|
135
|
-
end
|
136
88
|
end
|
137
89
|
|
138
90
|
class ResourceReference
|
data/lib/rdf_objects.rb
CHANGED
@@ -6,6 +6,7 @@ module RDFObject
|
|
6
6
|
require File.dirname(__FILE__) + '/rdf_objects/rdf_resource'
|
7
7
|
require File.dirname(__FILE__) + '/rdf_objects/curies'
|
8
8
|
require File.dirname(__FILE__) + '/rdf_objects/data_types'
|
9
|
-
require File.dirname(__FILE__) + '/rdf_objects/http_client'
|
9
|
+
require File.dirname(__FILE__) + '/rdf_objects/http_client'
|
10
|
+
require File.dirname(__FILE__) + '/rdf_objects/collection'
|
10
11
|
Curie.remove_prefixes!(:http)
|
11
12
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdfobjects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Singer
|
@@ -55,12 +55,12 @@ files:
|
|
55
55
|
- LICENSE
|
56
56
|
- README
|
57
57
|
- lib/rdf_objects.rb
|
58
|
+
- lib/rdf_objects/collection.rb
|
58
59
|
- lib/rdf_objects/curies.rb
|
59
60
|
- lib/rdf_objects/data_types.rb
|
60
61
|
- lib/rdf_objects/http_client.rb
|
61
62
|
- lib/rdf_objects/parsers.rb
|
62
63
|
- lib/rdf_objects/rdf_resource.rb
|
63
|
-
- lib/rdf_objects/rdfxml_parser.rb
|
64
64
|
- lib/rdf_objects/serializers.rb
|
65
65
|
- lib/xsl/RDFa2RDFXML.xsl
|
66
66
|
- lib/xsl/rdf2nt.xsl
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
|
-
module RDFObject
|
4
|
-
|
5
|
-
class XMLParser
|
6
|
-
def self.parse(doc)
|
7
|
-
parser = Nokogiri::XML::SAX::Parser.new(RDFXMLDocument.new())
|
8
|
-
parser.parse(doc.to_s)
|
9
|
-
return parser.document.collection.uniq
|
10
|
-
end
|
11
|
-
end
|
12
|
-
class RDFXMLDocument < Nokogiri::XML::SAX::Document
|
13
|
-
attr_reader :collection
|
14
|
-
def initialize
|
15
|
-
@collection = []
|
16
|
-
@resource_path = []
|
17
|
-
@predicate_path = []
|
18
|
-
end
|
19
|
-
|
20
|
-
def start_element_namespace name, attributes = [], prefix = nil, uri = nil, ns = {}
|
21
|
-
attributes.each do | attribute |
|
22
|
-
if attribute.localname == "about" && attribute.uri == "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
23
|
-
resource = Resource.new(attribute.value)
|
24
|
-
@collection << resource
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|