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