2016-07-12 4 views
0

私はこの質問をundestandに簡単にするための画像を含めました。CYPHERを使用して報告チェーン外のノードを見つける

私はマネージャーAで始まり、私が知りたいCYPHERクエリがあります。レポーティングチェーンでそれらを報告先:という

a)すべてのスタッフを。ダイアグラムを使用して、回答:B、C、D、B1、B2、B11、D1、D2

b)誰が報告書チェーンに属していないか。ダイアグラムを使用して、答え:Z、W、X

私はa)に答えることができますが、b)ではC、D1、D2を使用しません。 この問題を解決する方法は誰ですか?

私は

+0

単一のクエリを使用してa)とb)の両方を返そうとしていますか?または、報告チェーンにいる人がいなくても、b)の結果だけに興味がありますか? – InverseFalcon

答えて

0

Object network

私は、WITH句を使用して、2番目のクエリにレポートして、パイプの結果を見つけるために、クエリを実行しようとしていたが、私はCを除外することができなかった、D1およびDC私はそれが動作するクエリを見つけたと思うが、それは報告チェーンの外のノードだけを返す。同じクエリでa)とb)の両方を返すのは難しいかもしれません。

まず、グラフ(私は小文字を使用している以外、あなたの図と一致する必要があります)作成:今、クエリ

MATCH (:Person{name:"a"})<-[:REPORTS_TO*]-(reporter:Person)-[:KNOWS]-(other:Person) 
WITH COLLECT(reporter) AS reporters, COLLECT(other) AS others 
WITH FILTER (o IN others WHERE NOT o IN reporters) AS outsiders 
UNWIND outsiders AS outsider 
RETURN DISTINCT outsider 

のためにこれは人々Z、Wを返します

merge (a:Person{name:"a"}) 
merge (b:Person{name:"b"}) 
merge (c:Person{name:"c"}) 
merge (d:Person{name:"d"}) 
merge (b1:Person{name:"b1"}) 
merge (b2:Person{name:"b2"}) 
merge (b11:Person{name:"b11"}) 
merge (d1:Person{name:"d1"}) 
merge (d2:Person{name:"d2"}) 
merge (z:Person{name:"z"}) 
merge (w:Person{name:"w"}) 
merge (x:Person{name:"x"}) 

merge (b)-[:REPORTS_TO]->(a) 
merge (c)-[:REPORTS_TO]->(a) 
merge (d)-[:REPORTS_TO]->(a) 

merge (b1)-[:REPORTS_TO]->(b) 
merge (b2)-[:REPORTS_TO]->(b) 
merge (b11)-[:REPORTS_TO]->(b1) 

merge (d1)-[:REPORTS_TO]->(d) 
merge (d2)-[:REPORTS_TO]->(d) 

merge (z)-[:KNOWS]->(b) 
merge (z)-[:KNOWS]->(b11) 

merge (b2)-[:KNOWS]->(w) 
merge (b2)-[:KNOWS]->(c) 
merge (b2)-[:KNOWS]->(d1) 

merge (d1)-[:KNOWS]->(x) 

merge (c)-[:KNOWS]->(d2) 

をし、おそらくもっと洗練された解決策がありますが、私はまだそれを見つけていません。明白な目に隠れているのだろうか?

+0

Thx、私はそれを試してみる – PhilipM9000