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, 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).
    


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

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:



117
118
119
# File 'lib/json/ld/utils.rb', line 117

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)


102
103
104
105
106
107
108
109
110
111
# File 'lib/json/ld/utils.rb', line 102

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)


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

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



134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/json/ld/utils.rb', line 134

def compare_values(v1, v2)
  case
  when node_or_ref?(v1) && node_or_ref?(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

#graph?(value) ⇒ Boolean

Is value an expaned @graph?

Note: A value is a simple 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)


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

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



189
190
191
192
# File 'lib/json/ld/utils.rb', line 189

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.



201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/json/ld/utils.rb', line 201

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)


84
85
86
# File 'lib/json/ld/utils.rb', line 84

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)


75
76
77
# File 'lib/json/ld/utils.rb', line 75

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_or_ref?(value) ⇒ Boolean

Is value a node or a node reference reference?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


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

def node_or_ref?(value)
  value.is_a?(Hash) &&
    !(value.has_key?('@value') || value.has_key?('@list') || value.has_key?('@set'))
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.length == 1 && value.key?('@id')
end

#simple_graph?(value) ⇒ Boolean

Is value a simple @graph (lacking @id)?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


66
67
68
# File 'lib/json/ld/utils.rb', line 66

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

#value?(value) ⇒ Boolean

Is value literal?

Parameters:

  • value (Object)

Returns:

  • (Boolean)


93
94
95
# File 'lib/json/ld/utils.rb', line 93

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