2013-11-14 55 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