Cypher:按关系类型对路径进行深度优先搜索

时间:2016-06-29 08:15:32

标签: neo4j cypher

我有一个树设置,其中每个关系可以与下一个节点具有“左”或“右”关系类型。除终端节点外,节点都是相同的类型。

我如何对路径进行排序,以便我在深度优先搜索顺序中将它们排在第一位?我知道我可以拉动路径,并可能在我自己的代码中执行此操作。但有没有办法用Cypher做到这一点?

类似:匹配路径=(n) - [r *] - >(n:终端)按左移第一回路路径

enter image description here

1 个答案:

答案 0 :(得分:1)

我似乎找到了一种使用reduce和extract组合的方法。我不确定这是否是最有效的方式,但它确实有效。

首先,为路径中的每个关系构建2条信息,并将它们组合成一个字符串。

  1. 路径中关系的索引
  2. 然后使用案例陈述我选择左边的'1',右边的'2'
  3. 其次,将每个关系字符串与reduce组合成一个长字符串,用于路径中的所有关系,以获得第一条路径的011121。首先按深度排序此字符串顺序,因为它有效地按级别排序然后左/右。

    match 
        p=(n)-[r*]->(terminal_node) 
        where n.id = 'root node id'
    with
        p,
        terminal_node,
        extract(
            r IN relationships(p) | 
            REDUCE(
                c=-1, 
                indx in range(0, size(relationships(p))-1) | 
                case when relationships(p)[indx] = r then indx else c end 
            ) + case when type(r) = 'LEFT' then '1' else '2' end
        ) as rel_index_and_order
    return 
        p, 
        terminal_node,
        REDUCE(s='', r in rel_index_and_order | s+r ) as path_sort
    order by path_sort