我在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 会停止遍历。
如何撰写此查询?
我已经使用了一个路径和几个放松/收集语句,基本上是马****,哈哈。我想要一个更好的查询,但我现在很困惑,它不会发生。
答案 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
让我们分解一下:
为了表示我们只想遍历第一个标志为真,我们使用shortestPath
。
为了表达我们想要遍历到叶子,我们使用以下形式化:如果节点没有可以继续的关系,由WHERE NOT
filter on patterns捕获,则该节点是叶子。
这应该让我们知道用于此类查询的基本想法 - 请提供一些反馈,以便我可以改进答案。
答案 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..]
)。