2015-08-22 5 views
1

Я тренируюсь в базе данных фильмов Neo4j, которая поставляется вместе с ней при установке Neo4j. По какой-то причине, эти два запроса возвращают разные результаты:Почему эти запросы в Neo4j возвращают разные результаты?

match (keanu:Person {name: "Keanu Reeves"})-[:ACTED_IN]->() 
<-[:ACTED_IN]-(actor), (actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(other) 
where NOT ((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)) and 
other <>keanu return other.name, count(other) as count order by count DESC; 

match (keanu:Person {name: "Keanu Reeves"})-[:ACTED_IN]->(movie) 
<-[:ACTED_IN]-(actor), (actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(other) 
where NOT ((keanu)-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(other)) and 
other <>keanu return other.name, count(other) as count order by count DESC; 

Единственное отличие состоит в том, что я указал «фильм» переменную. Я просто хочу посмотреть актеров, которые не играли с Киану, но чаще всего играли с его коллегами. Результаты те же, за исключением случаев, когда я указываю переменную 'movie', в верхнюю часть результатов добавляется новый актер (чаще всего играющий с созвездиями Киану). Этот актер вообще не появляется в первых результатах запроса, но только во втором и вершинах результатов.

ответ

1

Первый вариант содержит

where NOT ((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)) 

Второй

where NOT ((keanu)-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(other)) 

Таким образом, первый один отфильтровывает все пути, где keanu действует вместе с other в любой фильм. Второй фильтр отфильтровывает все пути, где keanu действует вместе с other в этот фильм.

+0

Но в первой строке матча переменная «movie» будет содержать все фильмы, которые когда-либо играл Киану, не так ли? Поэтому, когда я использую его в where-clause, не должно быть никакого другого фильма, в котором играл Киану, кроме тех, которые содержатся в переменной «movie»? Итак, почему это не имеет значения, кроме добавления одного актера? – giorgimode

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