Module: JSON::LD::Utils

Included in:
Compact, Context, Expand, Flatten, Frame, FromRDF, ToRDF, Writer
Defined in:
lib/json/ld/utils.rb

Instance Method Summary collapse

Instance Method Details

#add_value(subject, property, value, options = {}) ⇒ Object

Adds a value to a subject. If the value is an array, all values in the array will be added.

Parameters:

  • subject (Hash)

    the hash to add the value to.

  • property (String)

    the property that relates the value to the subject.

  • value (Object)

    the value to add.

  • options (Hash{Symbol => Object}) (defaults to: {})

Options Hash (options):

  • :property_is_array (Boolean)

    true if the property is always (false) an array, false if not.

  • :allow_duplicate (Boolean) — default: true

    true to allow duplicates, false not to (uses

    a simple shallow comparison of subject ID or value).
    


122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/json/ld/utils.rb', line 122

def add_value(subject, property, value, options = {})
  options = {property_is_array: false, allow_duplicate: true}.merge!(options)

  if value.is_a?(Array)
    subject[property] = [] if value.empty? && options[:property_is_array]
    value.each {|v| add_value(subject, property, v, options)}
  elsif subject[property]
    # check if subject already has value if duplicates not allowed
    _has_value = !options[:allow_duplicate] && has_value(subject, property, value)

    # make property an array if value not present or always an array
    if !subject[property].is_a?(Array) && (!_has_value || options[:property_is_array])
      subject[property] = [subject[property]]
    end
    subject[property] << value unless _has_value
  else
    subject[property] = options[:property_is_array] ? [value] : value
  end
end

#as_resource(id, base = nil) ⇒ RDF::Resource

Represent an id as an IRI or Blank Node

Parameters:

  • id (String)
  • base (RDF::URI) (defaults to: nil)

    (nil)

Returns:

  • (RDF::Resource)


72
73
74
75
76
77
78
79
80
81
# File 'lib/json/ld/utils.rb', line 72

def as_resource(id, base = nil)
  @nodes ||= {} # Re-use BNodes
  if id[0,2] == '_:'
    (@nodes[id] ||= RDF::Node.new(namer.get_sym(id)))
  elsif base
    base.join(id)
  else
    RDF::URI(id)
  end
end

#blank_node?(value) ⇒ Boolean

Is value a blank node? Value is a blank node

Parameters:

  • value (Object)

Returns:

  • (Boolean)


31
32
33
34
35
36
37
38
# File 'lib/json/ld/utils.rb', line 31

def blank_node?(value)
  case value
  when nil    then true
  when String then value[0,2] == '_:'
  else
    (node?(value) || node_reference?(value)) && value.fetch('@id', '_:')[0,2] == '_:'
  end
end

#compare_values(v1, v2) ⇒ Boolean

Compares two JSON-LD values for equality. Two JSON-LD values will be considered equal if:

  1. They are both primitives of the same type and value.

  2. They are both @values with the same @value, @type, @language,

and @index, OR
  1. They both have @ids that are the same.

Parameters:

  • v1 (Object)

    the first value.

  • v2 (Object)

    the second value.

Returns:

  • (Boolean)

    v1 and v2 are considered equal



96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/json/ld/utils.rb', line 96

def compare_values(v1, v2)
  case
  when node?(v1) && node?(v2) then v1['@id'] && v1['@id'] == v2['@id']
  when value?(v1) && value?(v2)
    v1['@value'] == v2['@value'] &&
    v1['@type'] == v2['@type'] &&
    v1['@language'] == v2['@language'] &&
    v1['@index'] == v2['@index']
  else
    v1 == v2
  end
end

#has_property(subject, property) ⇒ Boolean

Returns True if the given subject has the given property.

Parameters:

  • subject

    the subject to check.

  • property

    the property to look for.

Returns:

  • (Boolean)

    true if the subject has the given property, false if not.



148
149
150
151
# File 'lib/json/ld/utils.rb', line 148

def has_property(subject, property)
  return false unless value = subject[property]
  !value.is_a?(Array) || !value.empty?
end

#has_value(subject, property, value) ⇒ Boolean

Determines if the given value is a property of the given subject.

Parameters:

  • subject (Hash)

    the subject to check.

  • property (String)

    the property to check.

  • value (Object)

    the value to check.

Returns:

  • (Boolean)

    true if the value exists, false if not.



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/json/ld/utils.rb', line 160

def has_value(subject, property, value)
  if has_property(subject, property)
    val = subject[property]
    is_list = list?(val)
    if val.is_a?(Array) || is_list
      val = val['@list'] if is_list
      val.any? {|v| compare_values(value, v)}
    elsif !val.is_a?(Array)
      compare_values(value, val)
    else
      false
    end
  else
    false
  end
end

#index?(value) ⇒ Boolean

Is value annotated?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


54
55
56
# File 'lib/json/ld/utils.rb', line 54

def index?(value)
  value.is_a?(Hash) && value.has_key?('@index')
end

#list?(value) ⇒ Boolean

Is value an expaned @list?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


45
46
47
# File 'lib/json/ld/utils.rb', line 45

def list?(value)
  value.is_a?(Hash) && value.has_key?('@list')
end

#node?(value) ⇒ Boolean

Is value a node? A value is a node if

  • it is a Hash

  • it is not a @value, @set or @list

  • it has more than 1 key or any key is not @id

Parameters:

  • value (Object)

Returns:

  • (Boolean)


12
13
14
15
16
# File 'lib/json/ld/utils.rb', line 12

def node?(value)
  value.is_a?(Hash) &&
    !(value.has_key?('@value') || value.has_key?('@list') || value.has_key?('@set')) &&
    (value.length > 1 || !value.has_key?('@id'))
end

#node_reference?(value) ⇒ Boolean

Is value a node reference?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


22
23
24
# File 'lib/json/ld/utils.rb', line 22

def node_reference?(value)
  value.is_a?(Hash) && value.keys == %w(@id)
end

#value?(value) ⇒ Boolean

Is value literal?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


63
64
65
# File 'lib/json/ld/utils.rb', line 63

def value?(value)
  value.is_a?(Hash) && value.has_key?('@value')
end