2016-04-06 8 views
4

neo4jのパスを取得する際に問題が発生しました。Neo4jの一致パス特定のラベルを持つノードを除外

敵例、私はhノードがDeletedラベルを持っていると

   -->(h)-->(j) 
      /
(a)-->(b)-->(c)-->(d)-->(i) 
     \   
     -->(f)-->(g) 

を持っています。

私は、クエリ

MATCH path = (n)-[*]->(child) where id(n)={id of node a} and NOT child:Deleted RETURN path 

を持って、私はこのクエリは完全なパスを返しますが、ノードhDeletedであるため、ノードhのサブツリーを除外したいです。

リターンツリーは

(a)-->(b)-->(c)-->(d)-->(i) 
     \   
     -->(f)-->(g) 

ようにする必要があります。しかし、クエリが動作していないようです。

これを手伝ってもらえますか?あなたはラベルのための両方のノードをチェックする必要があり

おかげ

答えて

-1

match p=((a)-[r:NEXT]->(b)) 
where not (a:Deleted or b:Deleted) 
return p 

ここで別の例です:

match (a)-[r:NEXT]->(b) 
where not (("Deleted" in labels(a)) or 
      ("Deleted" in labels(b))) 
return a, r, b 
+0

こんにちはTim、私は実際にaとbだけでなく、すべてのノードをチェックしたいと考えています。 – jasonfungsing

+0

これは一致するパターンなので、すべてのノードをチェックします。私はここにあなたのグラフを複製し、これはあなたが望むことをします。 –

+0

私は正しく理解していますかわかりません。このように見えるのは、bノードまでしか検索せず、さらにcノードまたはfノードに移動しないか、さらにはそれ以上のノードに移動しないように見えます。 – jasonfungsing

1

何私のために働いたことは、パス内のノードを超えるリストの内包あります:

MATCH path =()-[*]->() 
WHERE NONE(n IN nodes(path) WHERE n:Deleted) 
RETURN path 
1

APOC Proceduresには、パスエクスパンダ機能とブラックリストを使用して、トラバーサル中のブラックリスト内のラベルを持つノードへの展開を防ぐことができます。

match (a) 
where id(a) = {id of node a} 
call apoc.path.expandConfig(a, {labelFilter:'-Deleted'}) yield path 
return path 
関連する問題