2017-02-10 8 views
1

Я построил эту базу данных на Neo4jКак использовать предложения WHERE в Cypher/Neo4j

enter image description here

Я пытаюсь найти актеров, которые играли в фильмах, в которых Киану Ривз также играл. Мой код:

MATCH (a:Actor)-[r:ACTS_IN]->(m:Movie) 
WHERE (m:Movie)<-[r:ACTS_IN]-(:Actor { name:"Keanu Reeves" }) 
RETURN a.name 

Но это не работает. Я новичок в этом языке, и я даже не уверен, что я должен использовать WHERE или WITH или что-то еще.

ответ

1

Во-первых:. найти список фильмов, которые Киану действовали в

Второе:WITH Киану и каждый из фильмов найти других актеров в этих фильмах, которые не Киану.

Третье: вернуть отчетливый список коллег Киану, с которым он выступал по всему списку фильмов

match (k:Actor {name: 'Keanu Reeves'})-[r:ACTS_IN]->(m:Movie) 
with k,m 
match (m)<-[:ACTS_IN]-(colleague:Actor) 
where colleague <> k 
return distinct(colleague) 
+0

Спасибо большое! – vivi11130704

3

Ваш запрос использует тот же идентификатор, r, в MATCH и WHERE статей. Это означает, что отношения 2 ACTS_IN должны быть одинаковыми. Поэтому a всегда будет узлом для Keanu Reeves.

Эта форма запроса должна вернуть все соответствующие стороны (в том числе Keanu), но, вероятно, не очень производительный:

MATCH (a:Actor)-[r:ACTS_IN]->(m:Movie) 
WHERE (m)<-[:ACTS_IN]-(:Actor { name:"Keanu Reeves" }) 
RETURN DISTINCT a.name; 

Этот запрос должен быть быстрее (и устранить Киану из результата), особенно если вы сначала создаете индекс на :Actor(name):

MATCH (a:Actor)-[:ACTS_IN]->(:Movie)<-[:ACTS_IN]-(:Actor { name:"Keanu Reeves" }) 
RETURN DISTINCT a.name; 

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

  • Нет связанных вопросов^_^