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) 

これにより、パッケージ A の子孫であるパッケージに置き換えられたすべての b と、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 に答える