Проблемы с простым Cypher Query: сложное выражение соответствия - PullRequest
1 голос
/ 04 июня 2019

Я новичок в Neo4J и Cypher и решил поиграться с образцами данных Movie, которые предоставляются при установке рабочего стола Neo4J.

Я хочу выполнить очень простой запрос, а именно получить названия фильмов, в которых участвовали 3 человека: Лив Тайлер, Шарлиз Терон и Бонни Хант . Совпадение двух человек - не проблема (см. Код ниже), но включить третьего сложно.

В SQL это не будет проблемой для меня, но Сайфер вызывает серьезные головные боли. Вот запрос на данный момент:

MATCH (Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(Person {name: "Bonnie Hunt"}) 
RETURN  movie.title AS Title

Я пытался использовать AND операторы, но ничего не работает. Так как же включить в этот запрос Шарлиз Терон ?

Ответы [ 2 ]

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

Вы можете использовать несколько шаблонов для сопоставления трех или более соединений с одним узлом.

Вы можете использовать переменную movie, которую вы используете в своем запросе, чтобы ссылаться на нее *Узел 1006 * для включения шаблона (:Person {name: "Charlize Thero"})-[:ACTED_IN]->(movie).

MATCH (:Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(:Person {name: "Bonnie Hunt"}),
(:Person {name: "Charlize Theron"})-[:ACTED_IN]->(movie) 
RETURN  movie.title AS Title

Вы также можете переписать приведенный выше запрос следующим образом:

MATCH (:Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie),
    (:Person {name: "Bonnie Hunt"})-[:DIRECTED]->(movie),
    (:Person {name: "Charlize Theron"})-[:ACTED_IN]->(movie) 
RETURN  movie.title AS Title
0 голосов
/ 04 июня 2019

Если у вас есть произвольное количество действующих лиц (параметризованных), где вы не можете жестко закодировать рассматриваемые узлы: Person, вместо этого вы можете сопоставить узлы: Person с их именами в списке параметров, а затем выполнить фильтрацию на основе количестванайденных шаблонов (необходимо убедиться, что все люди, которые участвовали в фильме, были учтены).

Но если мы сделаем это сначала для режиссеров, то у нас уже есть несколько совпадений в кино, и мы можем применить предикат all() в списке актеров, чтобы убедиться, что они все сыграли в фильме.

Предполагая два списка параметров, один для актеров, один для режиссеров:

MATCH (director:Person)-[:DIRECTED]->(m:Movie)
WHERE director.name in $directors
WITH m, count(director) as directorCount
WHERE directorCount = size($directors)
AND all(actor IN $actors WHERE (:Person {name:actor})-[:ACTED_IN]->(m))
RETURN m.title as Title
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...