TRAVERSAL_TREE in 3.0

70 views
Skip to first unread message

Marko Marinkovic

unread,
Aug 9, 2016, 6:45:58 AM8/9/16
to ArangoDB
Hi all,
TRAVERSAL_TREE has been removed from version 3.0, but there is no example in a Migration Guide of how to return results as a "tree" in native traversal. Could you provide a simple example?
Thanks a lot, Marko.
Message has been deleted

Simran Brucherseifer

unread,
Aug 10, 2016, 8:38:13 AM8/10/16
to ArangoDB
Hi Marko,

there is no direct substitute for this function, but you can use native AQL traversal to return something similar:

FOR v, e, p IN 1..5 ANY "company/9" careerEdges
    LET other 
= (
        FOR vv
, ee IN ANY v careerEdges
            FILTER ee 
!= e
            LIMIT 
1
            RETURN 
1
    
)
    FILTER LENGTH
(other) == 0 || LENGTH(p.edges) == 5
    RETURN p

A traversal is started at vertex company/9 with a minimum depth = 1 and maximum depth = 5, following edges in careerEdges collection while ignoring their direction.

You could immediately RETURN p to get the full traversal paths, but it would include e.g. A-B as well as A-B-C and A-B-C-D, so not just the "longest" paths.
Therefore, a second traversal with depth = 1 is started to check if we reached a leaf node (= no more incoming or outgoing edges). Based on this information, the "short" paths can be filtered out.
Note that a second condition is required: it is possible that the last node in a traversal is not a leaf node, e.g. because the max depth is exceeded. Thus, we need to also let paths through, which contain as many edges as hops we do in the traversal (here: 5).

Excerpt of a possible result to illustrate the data structure returned:

[
  
{
    
"vertices": [
      
{
        
"_id": "company/9",
        
"_rev": "14256942884",
        
"_key": "9"
      
},
      
{
        
"_id": "company/3",
        
"_rev": "14243770148",
        
"_key": "3"
      
},
      
{
        
"_id": "company/7",
        
"_rev": "14256680740",
        
"_key": "7"
      
},
      
{
        
"_id": "company/8",
        
"_rev": "14256811812",
        
"_key": "8"
      
}
    
],
    
"edges": [
      
{
        
"order": 2,
        
"beginAt": "2010-02-10T16:53:32.898Z",
        
"_id": "careerEdges/266196397352",
        
"_rev": "14725456474",
        
"_key": "266196397352",
        
"_from": "company/9",
        
"_to": "company/3"
      
},
      
{
        
"order": 2,
        
"_id": "careerEdges/266196397818",
        
"_rev": "14726505050",
        
"_key": "266196397818",
        
"_from": "company/3",
        
"_to": "company/7"
      
},
      
{
        
"order": 2,
        
"_id": "careerEdges/266196397834",
        
"_rev": "14725980762",
        
"_key": "266196397834",
        
"_from": "company/7",
        
"_to": "company/8"
      
}
    
]
  
},
  
{
    
"vertices": [
      
{
        
...

It does not return a tree-like structure, but it could be constructed on client-side if really needed - all the required information is there, even including the edge documents:

result[n].vertices[0] -- result[n].edge[0] -- result[n].vertices[1]
and so on
Reply all
Reply to author
Forward
0 new messages