2013-11-14 53 views
0

我需要创建一个查询来分析程序包依赖关系图。 有不同类型的包(hotfix,featurepack,servicepack)。Cypher查询来分析依赖关系系统

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则可能会在Where子句中更改过滤条件来此,J

感谢

回答

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。再次感谢。

1

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

这将过滤掉所有由一个包,它是包A的后代取代了b的,加上所有b的后代,

+0

嗨,谢谢你的回答。实际上它只返回一级包,而不是间接依赖包。也花费了太多时间(约63000毫秒)。 – yesil

+0

我可以看到性能很差,因为有这么多的可变长度路径模式。如果您事先知道一些长度,指定固定长度将会提高性能。不确定我是否理解仅获取直接依赖包的问题,​​因为它确实会返回样本的预期结果。我在这里创建一个控制台,以便您可以看到查询和结果。 http://console.neo4j.org/r/66ng0。也许你通过在不同的数据集上应用查询来解决问题? –

+0

非常感谢您为您提供的杰出范例。实际上,我在将它应用于我的真实用例时遇到了问题。我不明白是什么原因导致我的结果只包含一级包。 – yesil