2016-07-12 13 views
0

Ich habe ein Bild eingefügt, damit diese Frage leichter zu verstehen ist.CYPHER verwenden, um Knoten außerhalb einer Berichtskette zu finden

Ich habe einen CYPHER Abfrage, wo ich mit Manager A beginnen und ich möchte herausfinden:

a) alle Mitarbeiter, dass: REPORTS_TO sie in der Meldekette. Mit Diagramm, Antwort: B, C, D, B1, B2, B11, D1, D2

b) wer die Berichte: WISSEN, die nicht in der Berichtskette sind. Mit Diagramm, Antwort: Z, W, X

Ich bin in der Lage, a), aber nicht b) zu beantworten, ohne C, D1 und D2 zu enthalten. Wer kann dieses Problem lösen?

hatte ich versuche, eine Abfrage auszuführen, die Berichte und dann die Ergebisse in einer zweiten Abfrage der WITH-Klausel zu finden, aber ich habe es nicht gelungen, C, D1 und DC

Object network

+0

Möchten Sie sowohl a) als auch b) mit einer einzigen Abfrage zurückgeben? Oder sind Sie nur an den Ergebnissen von b) interessiert, ohne dass Sie sich in der Berichtskette befinden müssen? – InverseFalcon

Antwort

0

ich ausschließen Ich glaube, ich habe eine funktionierende Abfrage gefunden, die jedoch nur die Knoten außerhalb der Berichtskette zurückgibt. Es kann schwierig sein, sowohl a) als auch b) in derselben Abfrage zurückzugeben.

Zuerst die Grafik zu schaffen (sollte Ihr Diagramm übereinstimmen, außer ich bin mit Klein):

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) 

Jetzt für die Abfrage

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 

Dies kehrt Menschen Z, W und X. Es gibt wahrscheinlich eine elegantere Lösung, aber ich bin noch nicht darüber gestolpert. Vielleicht versteckt es sich in Sichtweite?

+0

Thx, ich werde das versuchen – PhilipM9000

Verwandte Themen