Кратчайшие пути, исключая один узел - PullRequest
0 голосов
/ 27 февраля 2019

Я работаю над запросом к базе данных фильмов, чтобы проверить кратчайшие пути между n узлами.В этом упрощенном примере нам нужны все кратчайшие пути между двумя фильмами:

match p=allShortestPaths((n)-[*]-(m)) where id(n) = 87 and id(m) = 121 return p;

all

Теперь я хочу получитьвсе кратчайшие пути, в которые не входит Киану Ривз.Я попробовал это:

match p=allShortestPaths((n)-[*]-(m)) where id(n) = 87 and id(m) = 121 and NONE(n in nodes(p) where n.name = "Keanu Reeves") return p;

Однако загрузка занимает целую вечность, даже после того, как я проиндексировал поле имени Person ...

Затем In попробовалследующее:

match p=allShortestPaths((n)-[*]-(m)) where id(n) = 87 and id(m) = 121 with p WHERE NONE(n in nodes(p) where n.name = "Keanu Reeves") return p;

Это, однако, не дает мне никаких результатов.Я неверно истолковал это, думая, что он просто вернет те пути, между которыми нет Киану Ривза:

(no changes, no records)

Я проверил, смогу ли я получить только те, у которых Киану Ривз междуфункция any().Это прекрасно работает:

match p=allShortestPaths((n)-[*]-(m)) where id(n) = 87 and id(m) = 121 with p WHERE ANY(n in nodes(p) where n.name = "Keanu Reeves") return p;

any()

Каков наилучший подход для решения этой проблемы?Должен сказать, что мой производственный запрос гораздо сложнее, но все сводится к этой проблеме.Это должно быть эффективное решение.

1 Ответ

0 голосов
/ 27 февраля 2019

Проблема в том, что если один из узлов пути не имеет свойства name, то вся проверка не будет пройдена.

Так или же мы проверяем существованиесвойства :

match p=allShortestPaths((n)-[*]-(m)) 
where 
    n.title = 'The Replacements' and 
    m.title = 'Speed Racer' and
    NONE(n in nodes(p) where EXISTS(n.name) and n.name = "Keanu Reeves")
return p

Или используйте функцию COALESCE:

match p=allShortestPaths((n)-[*]-(m)) 
where 
    n.title = 'The Replacements' and 
    m.title = 'Speed Racer' and
    NONE(n in nodes(p) where COALESCE(n.name, '') = "Keanu Reeves")
return p
...