2016-07-12 2 views
0

Я включил изображение, чтобы этот вопрос был легче узнать.Использование CYPHER для поиска узлов за пределами цепочки отчётов

У меня есть Cypher запрос, где я начинаю с Диспетчера A, и я хочу узнать:

а) все сотрудники, которые: Reports_To их в цепи отчетности. Используя диаграмму, ответьте: B, C, D, B1, B2, B11, D1, D2

b) кто сообщает: ЗНАЕТ, кто не входит в цепочку отчетности. Используя диаграмму, ответ: Z, W, X

Я могу ответить a), но не b) без включения C, D1 и D2. Кто-нибудь, кто может решить эту проблему?

я был попытаться выполнить запрос, чтобы найти отчеты, а затем обработать результаты второго запроса с помощью С п, но я был не в состоянии исключить C, D1 и DC

Object network

+0

Вы хотите вернуть оба a) и b) используя один запрос? Или вас интересуют только результаты из б), без необходимости того, кто входит в цепочку отчетности? – InverseFalcon

ответ

0

I думаю, я нашел запрос, который работает, хотя он возвращает только узлы за пределами цепочки отчетов. В одном и том же запросе может быть сложно возвратить как a), так и b).

Во-первых, создание графика (должно соответствовать вашей диаграмме, за исключением того, я использую в нижнем регистре):

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) 

Теперь для запроса

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, и X. Возможно, есть более элегантное решение, но я еще не наткнулся на него. Может быть, он прячется на виду?

+0

Thx, я попробую это – PhilipM9000

Смежные вопросы