module Redgraph::Graph::NodeMethods

Public Instance Methods

add_node(node) click to toggle source

Adds a node. If successul it returns the created object, otherwise false

# File lib/redgraph/graph/node_methods.rb, line 8
def add_node(node)
  merge_or_add_node(node, :create)
end
count_nodes(label: nil, properties: nil) click to toggle source

Counts nodes. Options:

  • label: filter by label

  • properties: filter by properties

# File lib/redgraph/graph/node_methods.rb, line 67
def count_nodes(label: nil, properties: nil)
  node = Node.new(label: label, properties: properties)

  cmd = "MATCH #{node.to_query_string} RETURN COUNT(node)"
  # RedisGraph bug: if there are no matches COUNT returns zero rows
  # https://github.com/RedisGraph/RedisGraph/issues/1455
  query(cmd).flatten[0] || 0
end
destroy_node(node) click to toggle source
# File lib/redgraph/graph/node_methods.rb, line 87
def destroy_node(node)
  return false unless node.persisted?
  cmd = "MATCH (node) WHERE ID(node) = #{node.id} DELETE node"
  result = _query(cmd)
  result.stats["nodes_deleted"] == 1
end
find_node_by_id(id) click to toggle source
# File lib/redgraph/graph/node_methods.rb, line 19
def find_node_by_id(id)
  result = _query("MATCH (node) WHERE ID(node) = #{id} RETURN node")
  return nil if result.resultset.empty?
  (node_id, labels, properties) = result.resultset.first["node"]
  attrs = {}

  properties.each do |(index, type, value)|
    attrs[get_property(index)] = value
  end
  Node.new(label: get_label(labels.first), properties: attrs).tap do |node|
    node.id = node_id
  end
end
merge_node(node) click to toggle source

Merges (creates a node unless one with the same label and properties exists). If successul it returns the object, otherwise false

# File lib/redgraph/graph/node_methods.rb, line 15
def merge_node(node)
  merge_or_add_node(node, :merge)
end
nodes(label: nil, properties: nil, order: nil, limit: nil, skip: nil) click to toggle source

Returns nodes. Options:

  • label: filter by label

  • properties: filter by properties

  • order: node.name ASC, node.year DESC

  • limit: number of items

  • skip: items offset (useful for pagination)

# File lib/redgraph/graph/node_methods.rb, line 42
def nodes(label: nil, properties: nil, order: nil, limit: nil, skip: nil)
  _label = ":`#{label}`" if label
  _order = if order
    raise MissingAliasPrefixError unless order.include?("node.")
    "ORDER BY #{order}"
  end
  _limit = "LIMIT #{limit}" if limit
  _skip = "SKIP #{skip}" if skip

  node = Node.new(label: label, properties: properties)

  cmd = "MATCH #{node.to_query_string} RETURN node #{_order} #{_skip} #{_limit}"

  result = _query(cmd)

  result.resultset.map do |item|
    node_from_resultset_item(item["node"])
  end
end
update_node(node) click to toggle source
# File lib/redgraph/graph/node_methods.rb, line 76
def update_node(node)
  return false unless node.persisted?
  _set = node.properties.map do |(key, val)|
    "node.#{key} = #{escape_value(val)}"
  end.join(", ")

  cmd = "MATCH (node) WHERE ID(node) = #{node.id} SET #{_set} RETURN node"
  result = _query(cmd)
  node_from_resultset_item(result.resultset.first["node"])
end

Private Instance Methods

merge_or_add_node(node, verb = :create) click to toggle source
# File lib/redgraph/graph/node_methods.rb, line 110
def merge_or_add_node(node, verb = :create)
  verb = verb == :create ? "CREATE" : "MERGE"
  result = _query("#{verb} #{node.to_query_string} RETURN ID(node)")
  # Should we treat this case differently?
  # return false if result.stats[:nodes_created] != 1
  id = result.resultset.first["ID(node)"]
  node.id = id
  node
end
node_from_resultset_item(item) click to toggle source

Builds a Node object from the raw data

# File lib/redgraph/graph/node_methods.rb, line 98
def node_from_resultset_item(item)
  (node_id, labels, props) = item
  attrs = HashWithIndifferentAccess.new

  props.each do |(index, type, value)|
    attrs[get_property(index)] = value
  end
  Node.new(label: get_label(labels.first), properties: attrs).tap do |node|
    node.id = node_id
  end
end