2017-11-23 5 views
0

A:AlphaとD:Alphaの間のすべてのパスを欲しい:これらの2つの間のベータノードのみ。 パスに同じタイプまたは他のタイプのノードが含まれている場合、それらのパスは破棄する必要があります。Neo4j:Cypherを持ついくつかのノードを持つフィルタリングパス

Sample data - 
A:Alpha->B:Beta->C:Beta->D:Alpha 
A:Alpha->M:Beta->Z:Gama->P:Beta->D:Alpha 
A:Alpha->S:Beta->F:Beta->I:Beta-->D:Alpha 
A:Alpha->U:Beta->X:Alpha->T:Alpha->W:Beta->D:Alpha 

Result should be - 
A:Alpha->B:Beta->C:Beta->D:Alpha 
A:Alpha->S:Beta->F:Beta->I:Beta-->D:Alpha 

いずれにせよ、サイファーと同じように助けてもらえますか?あなただけ路の途中のノードのラベル制限するために、可変長のパスと、すべての()述語が必要

おかげ

答えて

0

... // assume 'path' variable used in the match 
WHERE all(node in nodes(path)[1..-1] WHERE node:Beta) 
... 

代わりに、あなたはAPOC Proceduresを使用することができ、パスエキスパンダ用のオプションは、あなたが望むものを提供することができるはずよう:

MATCH (a:Alpha) 
CALL apoc.path.expandConfig(a, {relationshipFilter: '>', labelFilter:'/Alpha|+Beta' filterStartNode:false}) YIELD path 
RETURN path 

label filterはここで重要です。 /Alphaは、次のノードに対して終端ノードフィルタを作成します。つまり、パスは最初に見つかったAlphaノードまでしかトラバースされず、返されたパスは常にAlphaノードで終わります。 +Betaは、次の項目でホワイトリストフィルタを作成します。パス内のノードのベータノード(終了フィルタを使用する場合はエンドノードには適用されません)。filterStartNode:falseは、開始ノードがホワイトリストフィルタの対象外であることを意味します。

これにより、パスは最初の:Alphaノードのみになり、パス内のすべての中間ノードはベータノードである必要があります。

関連する問題