Module: JSON::LD::Utils

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

Instance Method Summary collapse

Instance Method Details

#add_value(subject, property, value, property_is_array: false, value_is_array: false, allow_duplicate: true) ⇒ 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.

  • property_is_array (Boolean) (defaults to: false)

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

  • value_is_array (Boolean) (defaults to: false)

    (false) true if the value to be added should be preserved as an array (lists)

  • allow_duplicate (Boolean) (defaults to: true)

    (true) true to allow duplicates, false not to (uses

    a simple shallow comparison of subject ID or value).
    


163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/json/ld/utils.rb', line 163

def add_value(subject, property, value, property_is_array: false, value_is_array: false, allow_duplicate: true)
  if value_is_array
    subject[property] = value
  elsif value.is_a?(Array)
    subject[property] = [] if value.empty? && property_is_array
    value.each do |v|
      add_value(subject, property, v,
        property_is_array: property_is_array, allow_duplicate: allow_duplicate)
    end
  elsif subject[property]
    # check if subject already has value if duplicates not allowed
    _has_value = !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 || property_is_array)
      subject[property] =
        [subject[property]]
    end
    subject[property] << value unless _has_value
  else
    subject[property] = property_is_array ? [value] : value
  end
end

#as_array(object) ⇒ Array<Object>

Represent as an array

Parameters:

  • object (Object)

Returns:



120
121
122
# File 'lib/json/ld/utils.rb', line 120

def as_array(object)
  object.is_a?(Array) ? object : [object]
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)


105
106
107
108
109
110
111
112
113
114
# File 'lib/json/ld/utils.rb', line 105

def as_resource(id, base = nil)
  @nodes ||= {} # Re-use BNodes
  if id.start_with?('_:')
    (@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)


41
42
43
44
45
46
47
48
# File 'lib/json/ld/utils.rb', line 41

def blank_node?(value)
  case value
  when nil    then true
  when String then value.start_with?('_:')
  else
    (node?(value) || node_reference?(value)) && value.fetch('@id', '_:').start_with?('_:')
  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



137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/json/ld/utils.rb', line 137

def compare_values(v1, v2)
  if node_or_ref?(v1) && node_or_ref?(v2)
    v1['@id'] && v1['@id'] == v2['@id']
  elsif 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

#graph?(value) ⇒ Boolean

Is value an expaned @graph?

Note: A value is a graph if all of these hold true:

  1. It is an object.

  2. It has an ‘@graph` key.

  3. It may have ‘@context’, ‘@id’ or ‘@index’

Parameters:

  • value (Object)

Returns:

  • (Boolean)


60
61
62
# File 'lib/json/ld/utils.rb', line 60

def graph?(value)
  value.is_a?(Hash) && (value.keys - UTIL_GRAPH_KEYS) == ['@graph']
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.



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/json/ld/utils.rb', line 206

def has_value?(subject, property, value)
  if 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)


87
88
89
# File 'lib/json/ld/utils.rb', line 87

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

#list?(value) ⇒ Boolean

Is value an expaned @list?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


78
79
80
# File 'lib/json/ld/utils.rb', line 78

def list?(value)
  value.is_a?(Hash) && value.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)


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

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

#node_or_ref?(value) ⇒ Boolean

Is value a node or a node reference reference?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


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

def node_or_ref?(value)
  value.is_a?(Hash) &&
    !(value.key?('@value') || value.key?('@list') || value.key?('@set'))
end

#node_reference?(value) ⇒ Boolean

Is value a node reference?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


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

def node_reference?(value)
  value.is_a?(Hash) && value.length == 1 && value.key?('@id')
end

#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.



193
194
195
196
197
# File 'lib/json/ld/utils.rb', line 193

def property?(subject, property)
  return false unless (value = subject[property])

  !value.is_a?(Array) || !value.empty?
end

#simple_graph?(value) ⇒ Boolean

Is value a simple graph (lacking @id)?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


69
70
71
# File 'lib/json/ld/utils.rb', line 69

def simple_graph?(value)
  graph?(value) && !value.key?('@id')
end

#value?(value) ⇒ Boolean

Is value literal?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


96
97
98
# File 'lib/json/ld/utils.rb', line 96

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