0

我需要创建一个查询来分析包依赖关系图。有不同类型的包(修补程序、功能包、服务包)。

package-A --DEPENDS_ON--> package-B
package-A --DEPENDS_ON--> package-F
package-B -- DEPENDS_ON --> package-C
package-B --> DEPENDS_ON --> package-D
package-B -- DEPENDS_ON --> package-E
package-D --> DEPENDS_ON --> package-J
package-E --DEPENDS_ON--> package-H
package-F --REPLACES--> package-E
package-K --REPLACES--> package-F  // package-K is not a dependency of A

该图在节点深度方面确实很复杂。目前我尝试使用下面的查询,但它不起作用。

START n = node(1501) // package A
MATCH n-[:DEPENDS_ON*]->b
WHERE NOT(b<-[:REPLACES*]-())    // an indirect dependency package is replaced.
// so it has to be filtered but, the replacing package must be a dependency of A.
RETURN DISTINCT b, b.full_name, b.created?
ORDER BY b.created?

我想得到下面的包列表:B、F、C、D、J

谢谢

4

2 回答 2

1

您可以将 Where 子句中的过滤条件更改为此,

WHERE NOT(b<-[:DEPENDS_ON*0..]-()<-[:REPLACES*]-()<-[:DEPENDS_ON*]-n) 

这将过滤掉所有被一个包替换的 b,该包是包 A 的后代,加上 b 的所有后代,

于 2013-11-14T16:18:49.270 回答
0

我想我找到了一种更快的方法,在我的情况下效果很好。

MATCH p-[DEPENDS_ON*]->()-[:REPLACES*]->()-[:DEPENDS_ON*0..]->r 
WITH p, collect(r) AS replaces 
MATCH p-[:DEPENDS_ON*]->d 
WHERE p.name = 'A' AND NOT (d IN replaces) 
RETURN DISTINCT d, d.name

@Lisa 您的查询对我学习 Cypher 有很大帮助。再次感谢。

于 2013-12-04T12:59:57.483 回答