密码中的叶节点和路径

时间:2018-01-09 22:47:34

标签: neo4j cypher

我在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 。当然,真正的图形是树,而不是藤蔓。

简而言之,每条路径应以 a 开头,以第一个 flag = true节点结束,或以 a 开头并获取所有的孩子都到了树的叶子。根据最后一个例子, a 不必拥有任何子项 - 它可以是根和叶。最后,在第一种情况下,我们永远不会进入 c b 会停止遍历。

如何撰写此查询?

我已经使用了一个路径和几个放松/收集语句,基本上是马****,哈哈。我想要一个更好的查询,但我现在很困惑,它不会发生。

2 个答案:

答案 0 :(得分:1)

我会将此查询视为两种情况的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捕获,则该节点是叶子。

  3. 这应该让我们知道用于此类查询的基本想法 - 请提供一些反馈,以便我可以改进答案。

答案 1 :(得分:1)

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

WHERE子句的第一项查找路径(长度为0或更长,因为MATCH clasue中使用的可变长度关系模式)以具有{的节点结束{1}}标志路径中较早的标志没有true标志(可能是起始节点除外)。第二个术语查找以叶节点结尾的路径(长度为0或更长),其中没有节点(可能是起始节点除外)具有true标志。

true

注意:没有上限的可变长度关系模式(如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..])。