module Redgraph::Graph::EdgeMethods

Public Instance Methods

add_edge(edge) click to toggle source

Adds an edge. If successul it returns the created object, otherwise false

# File lib/redgraph/graph/edge_methods.rb, line 8
def add_edge(edge)
  merge_or_add_edge(edge, :create)
end
count_edges(type: nil, properties: nil) click to toggle source

Counts edges. Options:

  • type: filter by type

  • properties: filter by properties

# File lib/redgraph/graph/edge_methods.rb, line 68
def count_edges(type: nil, properties: nil)
  edge = Edge.new(type: type, properties: properties)

  cmd = "MATCH #{edge.to_query_string} RETURN COUNT(edge)"
  query(cmd).flatten[0]
end
edges(type: nil, src: nil, dest: nil, properties: nil, order: nil, limit: nil, skip: nil) click to toggle source

Finds edges. Options:

  • type

  • src

  • dest

  • properties

  • order

  • limit

  • skip

# File lib/redgraph/graph/edge_methods.rb, line 29
def edges(type: nil, src: nil, dest: nil, properties: nil, order: nil, limit: nil, skip: nil)
  _order = if order
    raise MissingAliasPrefixError unless order.include?("edge.")
    "ORDER BY #{order}"
  end
  _limit = "LIMIT #{limit}" if limit
  _skip = "SKIP #{skip}" if skip

  _where = if src || dest
    clauses = [
      ("ID(src) = #{src.id}" if src),
      ("ID(dest) = #{dest.id}" if dest)
    ].compact.join(" AND ")
    "WHERE #{clauses}"
  end

  edge = Edge.new(type: type, src: src, dest: dest, properties: properties)

  cmd = "MATCH #{edge.to_query_string} #{_where}
         RETURN src, edge, dest #{_order} #{_skip} #{_limit}"
  result = _query(cmd)

  result.resultset.map do |item|
    src = node_from_resultset_item(item["src"])
    dest = node_from_resultset_item(item["dest"])
    edge = edge_from_resultset_item(item["edge"])

    edge.src = src
    edge.dest = dest

    edge
  end
end
merge_edge(edge) click to toggle source

Merges (creates an edge unless one with the same type and properties exists) an edge. If successul it returns the object, otherwise false

# File lib/redgraph/graph/edge_methods.rb, line 15
def merge_edge(edge)
  merge_or_add_edge(edge, :merge)
end

Private Instance Methods

edge_from_resultset_item(item) click to toggle source
# File lib/redgraph/graph/edge_methods.rb, line 78
def edge_from_resultset_item(item)
  (edge_id, type_id, _src_id, _dest_id, props) = item
  attrs = HashWithIndifferentAccess.new

  props.each do |(index, type, value)|
    attrs[get_property(index)] = value
  end

  Edge.new.tap do |edge|
    edge.id = edge_id
    edge.type = get_relationship_type(type_id)
    edge.properties = attrs
  end
end
merge_or_add_edge(edge, verb = :create) click to toggle source
# File lib/redgraph/graph/edge_methods.rb, line 93
def merge_or_add_edge(edge, verb = :create)
  verb = verb == :create ? "CREATE" : "MERGE"
  result = _query("MATCH (src), (dest)
                  WHERE ID(src) = #{edge.src.id} AND ID(dest) = #{edge.dest.id}
                  #{verb} #{edge.to_query_string} RETURN ID(edge)")
  return false if result.stats[:relationships_created] != 1
  id = result.resultset.first["ID(edge)"]
  edge.id = id
  edge
end