class RDFResource::Resource
Attributes
Public Class Methods
# File lib/rdf-resource/resource.rb, line 8 def self.http_head_request(url) uri = nil begin response = RestClient.head(url) uri = response.args[:url] rescue @@config.logger.error "RestClient.head failed for #{url}" begin response = RestClient.get(url) uri = response.args[:url] rescue @@config.logger.error "RestClient.get failed for #{url}" end end uri end
# File lib/rdf-resource/resource.rb, line 28 def initialize(uri=nil) @@agent ||= RDFResource::AGENT @@config ||= RDFResource.configuration if uri =~ /\A#{URI::regexp}\z/ uri = Addressable::URI.parse(uri.to_s) rescue nil end raise 'invalid uri' unless uri.instance_of? Addressable::URI @iri = uri end
Public Instance Methods
A json-ld object for the rdf resource
# File lib/rdf-resource/resource.rb, line 247 def as_jsonld JSON::LD::API::fromRdf(rdf) end
# File lib/rdf-resource/resource.rb, line 38 def id @iri.basename end
# File lib/rdf-resource/resource.rb, line 42 def iri_type?(type) iri_types.include? RDF::URI.parse(type) end
# File lib/rdf-resource/resource.rb, line 46 def iri_types q = [rdf_uri, RDF.type, :o] rdf.query(q).collect {|s| s.object } end
Assert PROV.SoftwareAgent and PROV.generatedAtTime
# File lib/rdf-resource/resource.rb, line 52 def provenance s = [rdf_uri, RDF::PROV.SoftwareAgent, @@agent] rdf.insert(s) s = [rdf_uri, RDF::PROV.generatedAtTime, rdf_now] rdf.insert(s) end
RDF
query to find all objects of a predicate @param predicate [RDF::URI] An RDF
predicate, the ?p in ?s ?p ?o @return [Array] The objects of predicate, the ?o in ?s ?p ?o
# File lib/rdf-resource/resource.rb, line 84 def query_predicate_objects(predicate) q = [:s, predicate, :o] rdf.query(q).collect {|s| s.object } end
RDF
query to find all subjects with a predicate @param predicate [RDF::URI] An RDF
predicate, the ?p in ?s ?p ?o @return [Array] The subjects with predicate, the ?s in ?s ?p ?o
# File lib/rdf-resource/resource.rb, line 92 def query_predicate_subjects(predicate) q = [:s, predicate, :o] rdf.query(q).collect {|s| s.subject } end
Retrieve RDF
graph from iri; the results may be cached when the RDF::Graph.load method uses RestClient and it is configured to cache results. This method is often overloaded in subclasses because RDF
services use variations in the URL 'extension' patterns. @return [RDF::Graph|nil] an RDF
graph
# File lib/rdf-resource/resource.rb, line 65 def rdf return @rdf unless @rdf.nil? uri4rdf = @iri.to_s tries = 0 begin tries += 1 @rdf = RDF::Graph.load(uri4rdf) rescue sleep 1*tries retry if tries < 3 binding.pry if @@config.debug @@config.logger.error("Failed to retrieve RDF for #{uri4rdf}") @rdf = nil end end
@param object [RDF::Node] An RDF
blank node @return [RDF::Graph] graph of recursive resolution for a blank node
# File lib/rdf-resource/resource.rb, line 123 def rdf_expand_blank_nodes(object) g = RDF::Graph.new if object.node? rdf.query([object, nil, nil]) do |s,p,o| g << [s,p,o] g << rdf_expand_blank_nodes(o) if o.node? end end g end
Regexp search to find an object matching a string, if it belongs to @iri @param id [String] A string literal used to construct a Regexp @return [RDF::URI] The first object matching the Regexp
# File lib/rdf-resource/resource.rb, line 100 def rdf_find_object(id) return nil unless rdf_valid? rdf.each_statement do |s| if s.subject == @iri.to_s return s.object if s.object.to_s =~ Regexp.new(id, Regexp::IGNORECASE) end end nil end
Regexp search to find a subject matching a string @param id [String] A string literal used to construct a Regexp @return [RDF::URI] The first subject matching the Regexp
# File lib/rdf-resource/resource.rb, line 113 def rdf_find_subject(id) return nil unless rdf_valid? rdf.each_subject do |s| return s if s.to_s =~ Regexp.new(id, Regexp::IGNORECASE) end nil end
RDF::Graph convenience wrappers
# File lib/rdf-resource/resource.rb, line 137 def rdf_insert(uriS, uriP, uriO) @rdf.insert RDF::Statement(uriS, uriP, uriO) end
# File lib/rdf-resource/resource.rb, line 149 def rdf_insert_contributor(uriS, uriO) rdf_insert(uriS, RDF::SCHEMA.contributor, uriO) end
# File lib/rdf-resource/resource.rb, line 146 def rdf_insert_creator(uriS, uriO) rdf_insert(uriS, RDF::SCHEMA.creator, uriO) end
# File lib/rdf-resource/resource.rb, line 152 def rdf_insert_editor(uriS, uriO) rdf_insert(uriS, RDF::SCHEMA.editor, uriO) end
# File lib/rdf-resource/resource.rb, line 155 def rdf_insert_exampleOfWork(uriS, uriO) rdf_insert(uriS, RDF::SCHEMA.exampleOfWork, uriO) end
# File lib/rdf-resource/resource.rb, line 158 def rdf_insert_foafFocus(uriS, uriO) # http://xmlns.com/foaf/spec/#term_focus # relates SKOS:Concept to a 'real world thing' rdf_insert(uriS, RDF::FOAF.focus, uriO) end
# File lib/rdf-resource/resource.rb, line 163 def rdf_insert_name(uriS, name) rdf_insert(uriS, RDF::FOAF.name, name) if @@config.use_foaf rdf_insert(uriS, RDF::SCHEMA.name, name) if @@config.use_schema end
# File lib/rdf-resource/resource.rb, line 140 def rdf_insert_sameAs(uriS, uriO) rdf_insert(uriS, RDF::OWL.sameAs, uriO) end
# File lib/rdf-resource/resource.rb, line 143 def rdf_insert_seeAlso(uriS, uriO) rdf_insert(uriS, RDF::RDFS.seeAlso, uriO) end
Methods that assert RDF.type
# File lib/rdf-resource/resource.rb, line 178 def rdf_insert_type(uriS, uriO) rdf_insert(uriS, RDF.type, uriO) end
# File lib/rdf-resource/resource.rb, line 168 def rdf_now RDF::Literal.new(Time.now.utc, :datatype => RDF::XSD.dateTime) end
# File lib/rdf-resource/resource.rb, line 182 def rdf_type_agent(uriS) # Note: schema.org has no immediate parent for Person or Organization rdf_insert_type(uriS, RDF::FOAF.Agent) if @@config.use_foaf rdf_insert_type(uriS, RDF::SCHEMA.Thing) if @@config.use_schema end
# File lib/rdf-resource/resource.rb, line 188 def rdf_type_concept(uriS) rdf_insert_type(uriS, RDF::SKOS.Concept) end
# File lib/rdf-resource/resource.rb, line 192 def rdf_type_organization(uriS) rdf_insert_type(uriS, RDF::FOAF.Organization) if @@config.use_foaf rdf_insert_type(uriS, RDF::SCHEMA.Organization) if @@config.use_schema end
# File lib/rdf-resource/resource.rb, line 197 def rdf_type_person(uriS) rdf_insert_type(uriS, RDF::FOAF.Person) if @@config.use_foaf rdf_insert_type(uriS, RDF::SCHEMA.Person) if @@config.use_schema end
# File lib/rdf-resource/resource.rb, line 172 def rdf_uri RDF::URI.new(@iri) end
# File lib/rdf-resource/resource.rb, line 202 def rdf_valid? iri_types.length > 0 end
@param url [String|URI] A URL that can be resolved via HTTP request @return [String|nil] the URL, after resolving redirections
# File lib/rdf-resource/resource.rb, line 213 def resolve_url(url) begin # RestClient does all the response code handling and redirection. url = Resource.http_head_request(url) if url.nil? @@config.logger.warn "#{@iri}\t// #{url}" else @@config.logger.debug "Mapped #{@iri}\t-> #{url}" end rescue binding.pry if @@config.debug @@config.logger.error "unknown http error for #{@iri}" url = nil end url end
# File lib/rdf-resource/resource.rb, line 230 def same_as_org_graph return @same_as_org_graph unless @same_as_org_graph.nil? same_as_url = 'http://sameas.org/rdf?uri=' + URI.encode(@iri.to_s) @same_as_org_graph = RDF::Graph.load(same_as_url) end
# File lib/rdf-resource/resource.rb, line 235 def same_as_org_query # q = SPARQL.parse("SELECT * WHERE { <#{@iri}> <http://www.w3.org/2002/07/owl#sameAs> ?o }") q = [rdf_uri, RDF::OWL.sameAs, nil] same_as_org_graph.query(q).collect {|s| s.object } end
A json-ld serialization of the rdf resource
# File lib/rdf-resource/resource.rb, line 252 def to_jsonld rdf.dump(:jsonld, standard_prefixes: true) end
A turtle serialization of the rdf resource
# File lib/rdf-resource/resource.rb, line 257 def to_ttl rdf.dump(:ttl, standard_prefixes: true) end