Skip to content

Simple Graphs

topofocus edited this page May 8, 2019 · 8 revisions

The basic setup: A basic-node-class and an ExtraNode class. The connection is realized through Connects-Edges.

 V.create_class :base, :node
 Node.create_class :extra_node 
 c= E.create_class :connects
 c.uniq_index

Linear Graph

Base --> Connects --> ExtraNode ---> Connects ---> ExtraNode ...

Vertex#assign creates an Edge (via argument) and connects to the spcified vertex. It returns the vertex and thus supports chaining.

def linear_elements vertex, count 
 (1..count).each{|n| vertex = vertex.assign(via: Connects, vertex: ExtraNode.create(note_count: n))}
end

# call with
 start =  Base.create some_label: 'some_value'
 linear_elements start, 200   # for 200 list-elements

Its elements (vertices) an be accessed through

vertex.traverse in_or_out, via: /pattern/, depth: some_value`, start_at: 1

### Receive a List of Nodes

> start.traverse :out, via: /con/ , depth: 100 

returns a list with 100 connected vertices. The set can be narrowed by specifying a start_vertex.

Then the following query is fired:

> select  from  ( traverse  outE('connects').in  from #{vertex}  while $depth <= #{depth}   ) 
>	  where $depth >= #{start_at} 

Apply a Function on the ResultSet

The database offers some functions, which can applied to the resultset. Vertex.traverse can return the query to fetch all list-elements. This is input to a OrientQuery

> the_collection = start_point.traverse :out, via: /con/, depth: 100, execute: false 
> the_query     = OrientSupport::OrientQuery.new from: the_collecion, 
	                             projection: 'median(note_count)', 
	 				  where: '$depth>=50 '
> Base.query_dataset the_query
  => [75]

Clone this wiki locally