class JSON::LD::Resource

Simple Ruby reflector class to provide native access to JSON-LD objects

Attributes

attributes[R]

@return [Hash<String => Object] Object representation of resource

context[R]

@return [JSON::LD::Context] Context associated with this resource

id[R]

@return [String] ID of this resource

Public Class Methods

new(node_definition, **options) click to toggle source

A new resource from the parsed graph @param [Hash{String => Object}] node_definition @param [Hash{Symbol => Object}] options @option options [String] :context

Resource context, used for finding
appropriate collection and JSON-LD context.

@option options [Boolean] :clean (false) @option options [Boolean] :compact (false)

Assume `node_definition` is in expanded form
and compact using `context`.

@option options [Boolean] :reconciled (!new)

node_definition is not based on Mongo IDs
and must be reconciled against Mongo, or merged
into another resource.

@option options [Boolean] :new (true)

This is a new resource, not yet saved to Mongo

@option options [Boolean] :stub (false)

This is a stand-in for another resource that has
not yet been retrieved (or created) from Mongo
# File lib/json/ld/resource.rb, line 94
def initialize(node_definition, **options)
  @context = options[:context]
  @clean = options.fetch(:clean, false)
  @new = options.fetch(:new, true)
  @reconciled = options.fetch(:reconciled, !@new)
  @resolved = false
  @attributes = if options[:compact]
    JSON::LD::API.compact(node_definition, @context)
  else
    node_definition
  end
  @id = @attributes['@id']
  @anon = @id.nil? || @id.to_s.start_with?('_:')
end

Public Instance Methods

anonymous?() click to toggle source

Anonymous resources have BNode ids or no schema:url

@return [Boolean]

# File lib/json/ld/resource.rb, line 56
def anonymous?
  @anon
end
clean?() click to toggle source

Is this resource clean (i.e., saved to mongo?)

@return [Boolean]

# File lib/json/ld/resource.rb, line 23
def clean?
  @clean
end
deresolve() click to toggle source

Reverse resolution of resource attributes. Just returns ‘attributes` if resource is unresolved. Otherwise, replaces `Resource` values with node references.

Result is expanded and re-compacted to get to normalized representation.

@return [Hash] deresolved attribute hash

# File lib/json/ld/resource.rb, line 126
def deresolve
  node_definition = if resolved?
    deresolved = [].tap do |memo|
      attributes.each_pair do |prop, value|
        memo[prop] = case value
        when Resource
          { 'id' => value.id }
        when Array
          value.map do |v|
            v.is_a?(Resource) ? { 'id' => v.id } : v
          end
        else
          value
        end
      end
    end
    deresolved
  else
    attributes
  end

  compacted = nil
  JSON::LD::API.expand(node_definition, expandContext: @context) do |expanded|
    compacted = JSON::LD::API.compact(expanded, @context)
  end
  compacted.delete_if { |k, _v| k == '@context' }
end
dirty?() click to toggle source

Is this resource dirty (i.e., not yet saved to mongo?)

@return [Boolean]

# File lib/json/ld/resource.rb, line 31
def dirty?
  !clean?
end
each(&block) click to toggle source

Enumerate over statements associated with this resource

# File lib/json/ld/resource.rb, line 166
def each(&block)
  JSON::LD::API.toRdf(attributes, expandContext: context, &block)
end
hash() click to toggle source

Return a hash of this object, suitable for use by for ETag @return [Integer]

# File lib/json/ld/resource.rb, line 112
def hash
  deresolve.hash
end
inspect() click to toggle source
# File lib/json/ld/resource.rb, line 240
def inspect
  "<Resource" +
    attributes.map do |k, v|
      "\n  #{k}: #{v.inspect}"
    end.join(" ") +
    ">"
end
method_missing(method, *_args) click to toggle source

Access individual fields, from subject definition

# File lib/json/ld/resource.rb, line 236
def method_missing(method, *_args)
  property(method.to_s)
end
new?() click to toggle source

Is this a new resource, which has not yet been synched or created within the DB?

# File lib/json/ld/resource.rb, line 70
def new?
  !!@new
end
property(prop_name) click to toggle source

Access individual fields, from subject definition

# File lib/json/ld/resource.rb, line 230
def property(prop_name)
  @attributes.fetch(prop_name, nil)
end
reconciled?() click to toggle source

Has this resource been reconciled against a mongo ID?

@return [Boolean]

# File lib/json/ld/resource.rb, line 39
def reconciled?
  @reconciled
end
resolve(reference_map) click to toggle source

Update node references using the provided map. This replaces node references with Resources, either stub or instantiated.

Node references with ids not in the reference_map will cause stub resources to be added to the map.

@param [Hash{String => Resource}] reference_map @return [Resource] self

# File lib/json/ld/resource.rb, line 180
def resolve(reference_map)
  return if resolved?

  def update_obj(obj, reference_map)
    case obj
    when Array
      obj.map { |o| update_obj(o, reference_map) }
    when Hash
      if node_reference?(obj)
        reference_map[obj['id']] ||= Resource.new(obj,
          context: @context_name,
          clean: false,
          stub: true)
      else
        obj.each_key do |k|
          obj[k] = update_obj(obj[k], reference_map)
        end
        obj
      end
    else
      obj
    end
  end

  # $logger.debug "resolve(0): #{attributes.inspect}"
  @attributes.each do |k, _v|
    next if %w[id type].include?(k)

    @attributes[k] = update_obj(@attributes[k], reference_map)
  end
  # $logger.debug "resolve(1): #{attributes.inspect}"
  @resolved = true
  self
end
resolved?() click to toggle source

Has this resource been resolved so that all references are to other Resources?

@return [Boolean]

# File lib/json/ld/resource.rb, line 48
def resolved?
  @resolved
end
save() click to toggle source

Override this method to implement save using an appropriate storage mechanism.

Save the object to the Mongo collection use Upsert to create things that don’t exist. First makes sure that the resource is valid.

@return [Boolean] true or false if resource not saved

# File lib/json/ld/resource.rb, line 224
def save
  raise NotImplementedError
end
stub?() click to toggle source

Is this a stub resource, which has not yet been synched or created within the DB?

# File lib/json/ld/resource.rb, line 63
def stub?
  !!@stub
end
to_json(**options) click to toggle source

Serialize to JSON-LD, minus ‘@context` using a deresolved version of the attributes

@param [Hash] options @return [String] serizlied JSON representation of resource

# File lib/json/ld/resource.rb, line 160
def to_json(**options)
  deresolve.to_json(**options)
end
update_obj(obj, reference_map) click to toggle source
# File lib/json/ld/resource.rb, line 183
def update_obj(obj, reference_map)
  case obj
  when Array
    obj.map { |o| update_obj(o, reference_map) }
  when Hash
    if node_reference?(obj)
      reference_map[obj['id']] ||= Resource.new(obj,
        context: @context_name,
        clean: false,
        stub: true)
    else
      obj.each_key do |k|
        obj[k] = update_obj(obj[k], reference_map)
      end
      obj
    end
  else
    obj
  end
end