Cypher-запрос не возвращает результатов - PullRequest
0 голосов
/ 08 октября 2018

У меня есть запрос, который находит кратчайший путь между 2 узлами.Эти узлы помечены как устройства, но они также подключены к узлам приложений.Итак, у меня есть 2 app_ids, и я хотел бы по этим идентификаторам найти все соединения между двумя устройствами, связанные с этими app_ids, а также информацию обо всех задействованных устройствах в этих соединениях.Итак, у меня был этот запрос:

WITH ["000001", "000002"] as IDS
UNWIND IDS as app_ids
MATCH (d:Device)-[:DEV_APP]->(a:Apps {app_id: app_ids})
WITH COLLECT(d) as device, COLLECT(distinct a) as app
WITH device[1] as first, device[7] as second, app
WITH first.device_id AS id1, second.device_id as id2, application
MATCH path=allShortestPaths((d1:Device {device_id:id1})-[:DEV_COL1|DEV_COL2|:DEV_COL3*..5]->(d2:Device {device_id:id2}))
RETURN path, application

Этот запрос возвращает все пути между узлами, однако мне также нужны данные обо всех подключенных приложениях к уязвимым устройствам.В то время как в результате я получаю только данные всех узлов устройств плюс 2 данных узлов приложений.Я понимаю, что это происходит потому, что я фильтрую узлы Apps в первом запросе Match.Поэтому я попытался сделать что-то вроде этого, чтобы найти все данные приложений, связанные с затронутыми устройствами, в запросе:

WITH ["000001", "000002"] as IDS
UNWIND IDS as app_ids
MATCH (d:Device)-[:DEV_APP]->(a:Apps {app_id: app_ids})
WITH COLLECT(d) as device, COLLECT(distinct a) as app, COLLECT(distinct d.device_id) as device_ids
MATCH (d_all:Device {device_id: device_ids})-[:DEV_APP]->(a_all:Apps)
WITH device[1] as first, device[7] as second, app, COLLECT(a_all) as apps
WITH first.device_id AS id1, second.device_id as id2, application, apps
MATCH path=allShortestPaths((d1:Device {device_id:id1})-[:DEV_COL1|DEV_COL2|:DEV_COL3*..5]->(d2:Device {device_id:id2}))
RETURN path, application, apps

Проблема в том, что в результате я не получаю никаких записей.Хотя я проверил, что список узлов device_ids не пуст.И когда я запускаю части этого запроса отдельно, результаты отображаются нормально.В чем может быть ошибка в этом запросе?

1 Ответ

0 голосов
/ 08 октября 2018

Проблема в 4-й строке:

MATCH (d_all:Device {device_id: device_ids})-[:DEV_APP]->(a_all:Apps)

В частности device_ids.Это коллекция из предыдущей строки, но я предполагаю, что нет: Device, где device_id - это список со всеми этими элементами списка в указанном порядке.

Я предполагаю, что вы должны соответствоватьустройства с идентификатором устройства в этом списке, и вы не можете сделать это с помощью этого подхода.

Вот один способ сделать то, что вы хотите:

...
MATCH (d_all:Device)-[:DEV_APP]->(a_all:Apps)
WHERE d_all.device_id IN device_ids
...

или поочередно:

...
UNWIND device_ids as device_id
MATCH (d_all:Device {device_id:device_id)-[:DEV_APP]->(a_all:Apps)
...

или, если набор устройств включает в себя все нужные вам устройства:

...
// using plurals for variable names of lists
WITH COLLECT(d) as devices, COLLECT(distinct a) as apps, COLLECT(distinct d.device_id) as device_ids
UNWIND devices as device 
MATCH (device)-[:DEV_APP]->(a_all:Apps)
...
...