我需要创建一个查询来分析包依赖图。 有不同类型的包(hotfix,featurepack,servicepack)。
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
由于
答案 0 :(得分:1)
您可以将Where子句中的过滤条件更改为
WHERE NOT(b<-[:DEPENDS_ON*0..]-()<-[:REPLACES*]-()<-[:DEPENDS_ON*]-n)
这将过滤掉所有被包裹替换的b,包裹是包A的后代,加上b的所有后代,
答案 1 :(得分: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方面给了我很多帮助。再次感谢。