首页 文章

匹配可变长度的分支路径

提问于
浏览
-1

我有一个如下图:

enter image description here

以下是neo4j控制台中图表的链接:http://console.neo4j.org/?id=av3001

基本上,您有两个可变长度的分支路径 . 我想匹配橙色节点和黄色节点之间的两条路径 . 我想为每个路径返回一行数据,包括所有遍历的节点 . 我还希望能够在不同的中间节点上包含不同的WHERE子句 .

最后,我需要有一个数据表,如下所示:

  • a - b - c - d

  • neo - morpheus - null - leo

  • neo - morpheus - trinity - cypher

我怎么能这样做?我尝试过使用OPTIONAL MATCH,但我不能分别得到这两行 .

我尝试使用可变长度路径,它返回两个路径,但不允许我访问和过滤中间节点 . 另外,它返回一个列表,而不是一个数据表 .

我见过这个问题:Cypher - matching two different possible paths and return both

它是在同一主题上,但示例非常复杂,这个更简单的问题的更通用的解决方案是我正在寻找的 .

3 回答

  • 2

    您可以使用 WHERE 语句定义终端节点 . 所以在你的情况下,终端节点没有传出关系 . 不知道为什么你期望在返回时返回null,因为你说 neo - morpheus - null - leo

    MATCH p=(n:Person{name:"Neo"})-[*]->(end) where not (end)-->()
    RETURN extract(x IN nodes(p) | x.name)
    

    编辑:

    可能不是最好的选择,因为我不知道如何以编程方式执行此操作 . 如果我使用 UNWIND ,我只回来一行 . 所以这是一个虚拟解决方案

    MATCH p=(n{name:"Neo"})-[*]->(end) where not (end)-->() 
    with nodes(p) as list 
    return list[0].name,list[1].name,list[2].name,list[3].name
    
  • 1

    您可以使用Cypher匹配像这样的路径 MATCH p=(:a)-[*]->(:d) RETURN p ,p将是路径中的节点/关系列表,按其遍历的顺序排列 . 您可以应用WHERE来过滤路径,就像使用节点匹配一样,并应用您需要的任何列表函数 .

    我也会添加这些例子

    // Where on path
    MATCH p=(:a)-[*]-(:d) WHERE NONE(n in NODES(p) WHERE n.name="Trinity") WITH NODES(p) as p RETURN p[0], p[1], p[2], p[3]
    
    // Spit path into columns
    MATCH p=(:a)-[*]-(:d) WITH NODES(p) as p RETURN p[0], p[1], p[2], p[3]
    
    // Match path, filter on label
    MATCH p=(:a)-[*]-(:d) WITH NODES(p) as p RETURN FILTER(n in p WHERE "a" in LABELS(n)) as a, FILTER(n in p WHERE "b" in LABELS(n)) as b, FILTER(n in p WHERE "c" in LABELS(n)) as c, FILTER(n in p WHERE "d" in LABELS(n)) as d
    

    不幸的是,您必须为每列明确设置一些逻辑 . 你不能制作动态列(我知道) . 在您的表示例中,哪个列获取'null'的规则是什么?在最后一个示例中,我将每列设置为标签的节点集 .

  • 0

    I.m.o.你要求对简单查询的结果进行广泛的后处理(给我从Neo开始的所有路径) . 我这样说是因为:

    • 您声明您需要能够为每个路径指定特定的WHERE子句(但是您没有指定哪个路径的哪个子句......表明这可能是一个动态的东西?)

    • 您事先不知道最长路径的大小...但您仍然希望结果是一个相同大小的所有结果表 . 那么 null 列是否总是在结束节点之前?为什么(除了方便之外没有真正的意义)?

    • ......

    因此(以及i.m.o.)您需要以(Java或任何您喜欢的)程序处理结果 . 在那里,您可以完全控制结果集,并可以根据需要切片和切块 . Cypher(事实上就像SQL一样)只能做很多事情而且看起来你已经超越了它 .

    希望这可以帮助,

    问候,汤姆

    附:这可能看起来很容易选择退出,但是看看你的查询是如何与必须尝试回答你的逻辑的结构相比较的 . 所以... separate the concerns .

相关问题