2016-11-18 3 views
0

Не уверен, что название объясняет все, но я изучаю Cypher, используя Neo4j и базу данных фильмов (отсюда: https://neo4j.com/developer/example-data/), и я пытаюсь создать запрос, который даст мне каждый фильм, режиссер также действовал в нем.Поиск узлов с 2 отношениями

Чтобы привести пример такого фильма, «Криминальное чтиво» - Квентин Тарантино, действовали и режиссировали фильм.

Я придумал этот запрос для приведенного выше примера:

match (m:Movie)-[:ACTS_IN]-(d:Director)-[:DIRECTED]->(n:Movie) 
where d.name STARTS WITH 'Q' 
return * 

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

ответ

1

У вас уже было d и m, поэтому вы не присваиваете метки во втором операторе MATCH. Правильный запрос будет выглядеть следующим образом

MATCH (d:Director)-[:DIRECTED]->(m:Movie) 
WHERE d.name STARTS WITH 'Q'  
MATCH (d)-[:ACTS_IN]->(m) 
RETURN d, collect(m) AS movies 

Обратите внимание, что на основании вашего первоначального вопроса, я изменял оператор возврата, а также.

+1

Вы также можете проверить, работает ли режиссер в фильме как часть предиката. Вместо второго MATCH вы можете продолжить предложение WHERE с шаблоном, который вы хотите использовать: 'AND (d) - [: ACTS_IN] -> (m)' – InverseFalcon

0

Ого я просто понял это:

match (d:Director)-[:DIRECTED]->(m:Movie) 
match (d:Director)-[:ACTS_IN]->(m:Movie) 
where d.name STARTS WITH 'Q' 
return * 

Я честно ожидал, чтобы использовать какой-то оператор, чтобы присоединиться к двум, но я предполагаю, что я был неправ.

+0

Вы можете добавить дополнительное условие к вашему предложению 'where' в первом запросе, как' и n = m', но да, проще просто _use_ одну и ту же переменную дважды. –

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