代码之家  ›  专栏  ›  技术社区  ›  Tony Ennis

cypher中的叶节点和路径

  •  0
  • Tony Ennis  · 技术社区  · 7 年前

    我在Neo4J中有一个图,看起来像这样:

    (a {flag:any})<- (many, 0 or more) <-(b {flag:true})<- (many, 0 or more) <-(c {flag: any})
    -OR-
    (a {flag:any})<- (many, 0 or more) <-(d)
    -OR-
    (a {flag:any})
    

    其中a、b、c和d都具有相同的类型,并且关系也相同。所有节点都具有 标志:false 除非另有说明。当然,真正的图形是树,而不是藤蔓。

    简言之,每条路都应该从 并以 第一 flag=true节点,或应以开头 把所有的孩子都带到树上。根据最后一个示例, 不必有任何孩子-它可以是根和叶。最后,在第一种情况下,我们永远不会插手 c . b 停止遍历。

    如何编写此查询?

    我已经让它与一条路径和几个基本上是马****的展开/收集语句一起工作,哈哈。我想要一个更好的查询,但我现在很困惑,这不会发生。

    2 回复  |  直到 7 年前
        1
  •  1
  •   cybersam    7 年前

    以下查询应返回所有3种路径。我假设所有相关节点都已标记 Foo ,并且所有相关关系都具有 BAR 类型

    第一学期 WHERE 子句查找路径(由于在 MATCH clasue)在具有 true 带编号的标志 真的 路径中较早的标志(起始节点可能除外)。第二项查找以叶节点结尾的路径(长度为0或更多),其中没有节点(可能除了起始节点)具有 真的 旗帜

    MATCH p=(a:Foo)<-[:BAR*0..]-(b:Foo)
    WHERE
      (b.flag AND NONE(x IN NODES(p)[1..-1] WHERE x.flag)) OR
      ((NOT (b)<-[:BAR]-()) AND NONE(y IN NODES(p)[1..] WHERE y.flag))
    RETURN p;
    

    注意:没有上限的可变长度关系模式(如 [:BAR*0..] )可能非常昂贵,并且可能需要很长时间或导致内存不足错误。因此,您可能需要指定一个合理的上限(例如, [:BAR*0..5] ).

        2
  •  1
  •   Gabor Szarnyas    7 年前

    我将此查询作为 UNION 在这两种情况中:

    MATCH shortestPath((a)<-[:REL_TYPE*1..]-(end:Label {flag: true}))
    RETURN a, end
    UNION
    MATCH (a)<-[:REL_TYPE*0..]-(end:Label)
    WHERE NOT (end)<-[:REL_TYPE]-()
    RETURN a, end
    

    让我们把它分解一下:

    1. 表示我们只想在 第一 标志为真,我们使用 shortestPath .

    2. 为了表示我们想要向下遍历到叶,我们使用以下形式化:如果节点没有可以继续的关系,那么它就是叶,由 WHERE NOT filter on patterns .

    这应该给出了用于此类查询的基本想法——请提供一些反馈,以便我可以完善答案。