2017-05-23 6 views
1

私はneo4jに木のような構造を持ち、先祖へのパスを持つ最初のノードを特定したいそのパス内に同じタイプのノードを持たない。Neo4jは、祖先へのパスに他の同様にラベル付けされたノードを持たないノードを取得します。

例えば

:この場合

/(:Y) <- (a:X) 
A <- (:Y) <- (c:X) <- (:Y) <- (d:X) <- (e:X) 
    \ (b:X)<- (f:X) 
    \ (g:X) 

'先祖であり、それらはラベル「X」を有し、分離されていないので、私は、ノードに、B、C、Gが欲しいですラベルを持つ別のノードによって祖先「X」

Iは、クエリを開始:

match (c :X)-[:X*1]->(A) return c 

しかし間の他の標識されたノードがあるので、それだけ、[B、G]としない[C、G]を返します祖先とnとラベル付けされた 'X' odes

答えて

1

まず、祖先ノードを取得します(この場合はAncestorラベルがあると思われますが、現実を反映するようにクエリを調整することをお勧めします)。次いで

MATCH (a:Ancestor)と接続されているすべてのノードを取得:深い最大2つのレベルのためのXラベル:MATCH (a)<-[*0..2]-(n:X)、これらn個のノードがその間に他のXに接続されていないことを保証:WHERE NOT (n)-->(:X)と戻り:RETURN n

したがって、サイパークエリ全体は、 MATCH (a:Ancestor) MATCH (a)<-[*0..2]-(n:X) WHERE NOT (n)-->(:X) RETURN nのようになります。

2

これにはAPOC Proceduresが必要ですが、ご希望の通りに設定するのは、path expander proceduresの設定オプションがあります。

終了演算子/を使用してlabelFilterを使用する必要があります。これは、パス展開が指定されたラベルの最初のノードで停止し、それらのラベルのノードのみが返されることを意味します。開始ノードからの各経路に沿ってXノード:最初のを返すべき

... 
// assume you've already matched to ancester 'a' 
CALL apoc.path.subgraphNodes(a, {labelFilter:'/X'}) YIELD node 
RETURN node 

:様

何か。

関連する問題