Class: RDFObject::Resource

Inherits:
OpenStruct
  • Object
show all
Defined in:
lib/rdf_objects/rdf_resource.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri) ⇒ Resource

Returns a new instance of Resource.



40
41
42
43
44
45
46
# File 'lib/rdf_objects/rdf_resource.rb', line 40

def initialize(uri)        
  if uri.could_be_a_safe_curie?
    uri = Curie.parse uri
  end
  super(:uri=>uri)
  self.class.register(self)
end

Class Attribute Details

.instancesObject (readonly)

Returns the value of attribute instances.



9
10
11
# File 'lib/rdf_objects/rdf_resource.rb', line 9

def instances
  @instances
end

Class Method Details

.exists?(uri) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
33
34
35
36
37
# File 'lib/rdf_objects/rdf_resource.rb', line 30

def exists?(uri)
  instances
  if @instances.has_key?(uri)
    true
  else
    false
  end
end

.new(uri) ⇒ Object



207
208
209
210
211
212
# File 'lib/rdf_objects/rdf_resource.rb', line 207

def self.new(uri)
  if self.exists?(uri)
    return self.instances[uri]
  end
  super(uri)
end

.register(resource) ⇒ Object



20
21
22
23
# File 'lib/rdf_objects/rdf_resource.rb', line 20

def register(resource)
  instances
  @instances[resource.uri] = resource
end

.remove(resource) ⇒ Object



25
26
27
28
# File 'lib/rdf_objects/rdf_resource.rb', line 25

def remove(resource)
  instances      
  @instances.delete(resource.uri)
end

.reset!Object



16
17
18
# File 'lib/rdf_objects/rdf_resource.rb', line 16

def reset!
  @instances = {}
end

Instance Method Details

#[](uri) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/rdf_objects/rdf_resource.rb', line 77

def [](uri)
  curie = case
  when uri.could_be_a_safe_curie? then Curie.new_from_curie(uri)
  when Curie.curie_from_uri(uri) then Curie.curie_from_uri(uri)
  else 
    return nil
  end
  vocab = self.send(curie.prefix.to_sym)
  return nil unless vocab
  return vocab if curie.reference.empty?
  return vocab[curie.reference]
end

#assert(predicate, object) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/rdf_objects/rdf_resource.rb', line 48

def assert(predicate, object)
  curied_predicate = case
  when predicate.could_be_a_safe_curie? then Curie.new_from_curie(predicate)
  when Curie.curie_from_uri(predicate) then Curie.curie_from_uri(predicate)
  else Curie.create_from_uri(predicate)
  end
  self.register_vocabulary(curied_predicate.prefix)
  pred_attr = self.send(curied_predicate.prefix.to_sym)
  return if assertion_exists?(predicate, object)
  if pred_attr[curied_predicate.reference]
    unless pred_attr[curied_predicate.reference].is_a?(Array)
      pred_attr[curied_predicate.reference] = [pred_attr[curied_predicate.reference]]
    end
    pred_attr[curied_predicate.reference] << object
  else
    pred_attr[curied_predicate.reference] = object
  end
end

#assertion_exists?(predicate, object) ⇒ Boolean

Returns:

  • (Boolean)


67
68
69
70
71
72
73
74
75
# File 'lib/rdf_objects/rdf_resource.rb', line 67

def assertion_exists?(predicate, object)
  return false unless self[predicate]
  if self[predicate].is_a?(Array)
    return true if self[predicate].index(object)
  else
    return true if self[predicate] == object
  end
  return false
end

#describeObject



107
108
109
110
# File 'lib/rdf_objects/rdf_resource.rb', line 107

def describe
  rdf = HTTPClient.fetch(self.uri)
  Parser.parse(rdf)
end

#empty_graph?Boolean

Returns:

  • (Boolean)


112
113
114
115
116
117
# File 'lib/rdf_objects/rdf_resource.rb', line 112

def empty_graph?
  Curie.get_mappings.each do | prefix, uri |
    return false if self.respond_to?(prefix.to_sym)
  end
  return true
end

#prefix_for(uri) ⇒ Object



90
91
92
# File 'lib/rdf_objects/rdf_resource.rb', line 90

def prefix_for(uri)
  Curie.prefix_for(uri)
end

#register_vocabulary(name) ⇒ Object



94
95
96
97
98
# File 'lib/rdf_objects/rdf_resource.rb', line 94

def register_vocabulary(name)
  return if self.respond_to?(name.to_sym)
  self.new_ostruct_member(name)
  self.send("#{name}=".to_sym, {})
end

#relate(predicate, resource) ⇒ Object



100
101
102
103
104
105
# File 'lib/rdf_objects/rdf_resource.rb', line 100

def relate(predicate, resource)
  unless resource.is_a?(self.class)
    resource = self.class.new(resource)
  end
  self.assert(predicate, resource)
end

#to_rssObject



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/rdf_objects/rdf_resource.rb', line 162

def to_rss
  doc = Builder::XmlMarkup.new
  xmlns = {}
  i = 1
  @namespaces.each do | ns |
    next if ns == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
    xmlns["xmlns:n#{i}"] = ns
    i += 1
  end
  xmlns["xmlns:rss"] = "http://purl.org/rss/1.0/"
  doc.rdf :RDF, xmlns do | rdf |
    rdf.item :about=>uri do | item |
      self.instance_variables.each do | ivar |
        next unless ivar =~ /^@n[0-9]*_/
        prefix, tag = ivar.split('_',2)
        attrs = {}
        curr_attr = self.instance_variable_get("#{ivar}")
        prefix.sub!(/^@/,'')
        prefix = 'rdf' if prefix == 'n0'
        unless curr_attr.is_a?(Array)
          curr_attr = [curr_attr]
        end
        curr_attr.each do | val |
          if val.is_a?(RDFResource)
            attrs['rdf:resource'] = val.uri
          end
          if @modifiers[val.object_id]
            if @modifiers[val.object_id][:language]
              attrs['xml:lang'] = @modifiers[val.object_id][:language]
            end
            if @modifiers[val.object_id][:type]
              attrs['rdf:datatype'] = @modifiers[val.object_id][:type]
            end          
          end
          unless attrs['rdf:resource']
            item.tag!("#{prefix}:#{tag}", attrs, val)
          else
            item.tag!("#{prefix}:#{tag}", attrs)
          end
        end
      end
    end
  end
  doc.target!
end

#to_xmlObject



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/rdf_objects/rdf_resource.rb', line 119

def to_xml
  doc = Builder::XmlMarkup.new
  xmlns = {}
  i = 1
  @namespaces.each do | ns |
    next if ns == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
    xmlns["xmlns:n#{i}"] = ns
    i += 1
  end
  doc.rdf :Description,xmlns.merge({:about=>uri}) do | rdf |
    self.instance_variables.each do | ivar |
      next unless ivar =~ /^@n[0-9]*_/
      prefix, tag = ivar.split('_',2)
      attrs = {}
      curr_attr = self.instance_variable_get("#{ivar}")
      prefix.sub!(/^@/,'')
      prefix = 'rdf' if prefix == 'n0'
      unless curr_attr.is_a?(Array)
        curr_attr = [curr_attr]
      end
      curr_attr.each do | val |
        if val.is_a?(RDFResource)
          attrs['rdf:resource'] = val.uri
        end
        if @modifiers[val.object_id]
          if @modifiers[val.object_id][:language]
            attrs['xml:lang'] = @modifiers[val.object_id][:language]
          end
          if @modifiers[val.object_id][:type]
            attrs['rdf:datatype'] = @modifiers[val.object_id][:type]
          end          
        end
        unless attrs['rdf:resource']
          rdf.tag!("#{prefix}:#{tag}", attrs, val)
        else
          rdf.tag!("#{prefix}:#{tag}", attrs)
        end
      end
    end
  end
  doc.target!
end