Как отфильтровать определенные узлы для обнаружения путей - PullRequest
0 голосов
/ 11 июня 2019

Я играл с набором данных Movie Graph, и я хотел бы найти кратчайший путь между двумя актерами, но пропуская узлы фильма (узлы могут иметь метку Person или Movie).

Этот запрос возвращает кратчайший путь от Кевина Бэкона к Мег Райан:

MATCH p=shortestPath((bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})) 
RETURN p

Теперь я хочу исключить узлы фильма, но как?Это то, что я придумал, но, к сожалению, он не дает никаких результатов:

MATCH path=shortestPath( (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"}) )
WITH nodes(path) AS ns
WHERE 
  ALL(node IN ns 
    WHERE NOT node:Movie)
RETURN ns AS path_without_movies;

Запрос выполняется, но только с таким результатом:

«(без изменений, без записей)».

Есть идеи, как мне улучшить запрос?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Проблема вашего второго запроса в том, что ключевое слово WITH создает в запросе логический раздел.

Таким образом, если вы удалили строку WITH nodes(path) AS ns, во время матча будет применено следующее ГДЕ. С этой строкой Сайфер находит результаты матча, а затем удаляет результаты из этого списка. (обычно эта разница не заметна, но кратчайший путь уменьшает результаты, изменяя конечные результаты)

Как указывает Радж , вы можете просто переместить извлечение (nodes(path)) из WITH во ALL, чтобы избежать разделения.

MATCH path=shortestPath( (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"}) )
WHERE 
  ALL(node IN nodes(path)
    WHERE NOT node:Movie)
RETURN nodes(path) AS path_without_movies;
1 голос
/ 11 июня 2019

Чтобы отфильтровать Узлы на Путь по Метка , вы можете изменить свой запрос следующим образом:

MATCH (bacon:Person {name:"Kevin Bacon"}), (meg:Person {name:"Meg Ryan"})
MATCH path=shortestPath( (bacon)-[*]-(meg) )
WHERE 
  ALL(node IN nodes(path) 
    WHERE NOT 'Movie' IN labels(node))
RETURN path AS path_without_movies;

ИЛИ

MATCH (bacon:Person {name:"Kevin Bacon"}), (meg:Person {name:"Meg Ryan"})
MATCH path=shortestPath( (bacon)-[*]-(meg) )
WHERE 
  ALL(node IN nodes(path) 
    WHERE NOT node:Movie)
RETURN path AS path_without_movies;
...