Cypher查询分析依赖系统

时间:2013-11-14 14:40:40

标签: neo4j cypher

我需要创建一个查询来分析包依赖图。 有不同类型的包(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

由于

2 个答案:

答案 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方面给了我很多帮助。再次感谢。