【问题标题】:Cypher: Depth First Search on Paths by Relationship TypeCypher:按关系类型对路径进行深度优先搜索
【发布时间】:2016-06-29 08:15:32
【问题描述】:

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

我将如何对路径进行排序,以便以深度优先搜索顺序始终优先考虑左侧关系?我知道我可以拉路径并且可能在我自己的代码中做到这一点。但是有没有办法使用 Cypher 来做到这一点?

类似:match path=(n)-[r*]->(n:Terminal) order by left first return path

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

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

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

    1. 路径中的关系索引
    2. 然后使用case语句我选择'1'代表左边,'2'代表右边

    其次,将每个关系字符串与 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      相关资源
      最近更新 更多