#cypher #redisgraph
Вопрос:
У меня есть DSL для запроса RedisGraph, который выглядит так:
App::Graph.query(movie: { title: 'Matrix' }, country: { value: 'Italy' , value: 'Spain', value: 'Greece' })
Который создает этот запрос на шифрование:
MATCH (m:Movie)lt;-[:ACTED_IN]-(a:Actor) WHERE m.title = 'Matrix' WITH m, collect(a) as actors WHERE 1 = 1 AND (movie)lt;-[:AVAILABLE_IN]-(:Country {value: 'Italy'}) AND (movie)lt;-[:AVAILABLE_IN]-(:Country {value: 'Spain'}) AND (movie)lt;-[:AVAILABLE_IN]-(:Country {value: 'Greece'}) RETURN actors, m
Вопрос: в некоторых случаях Country
узел, например Испания, не будет иметь edges
, и поэтому в настоящее время приведенный выше запрос на шифрование справедливо не вернет результатов. Но можно ли переписать приведенный выше запрос так, чтобы он игнорировал Country
узел, если у него нет ребер, совпадающих и возвращающих узлов, которые подключены к оставшемуся первоначально определенному списку стран, т. е. Италии, Греции?
Я перепробовал много вариантов, ниже приведен последний, но не нашел способа достичь этого
MATCH (m:Movie)lt;-[:ACTED_IN]-(a:Actor) WHERE m.title = 'Matrix' WITH m, collect(a) as actors MATCH (m)lt;-[:AVAILABLE_IN]-(connected_countries) WHERE connected_countries.value IN ['Italy', 'Spain', 'Greece'] WITH m, actors, collect(connected_countries.value) as relevant_countries WHERE 1 = 1 AND ((movie)lt;-[:AVAILABLE_IN]-(:Country {value: 'Italy'}) AND IN relevant_countries) AND ((movie)lt;-[:AVAILABLE_IN]-(:Country {value: 'Spain'}) AND IN relevant_countries) AND ((movie)lt;-[:AVAILABLE_IN]-(:Country {value: 'Greece'}) AND IN relevant_countries) RETURN actors, m
Ответ №1:
Пожалуйста, попробуйте:
MATCH (m:Movie {title:'Matrix'}) WITH m AS m UNWIND ['Italy', 'Spain', 'Greece'] AS country_name MATCH (:Country {value: country_name})-[:AVAILABLE_IN]-gt;(m)lt;-[:ACTED_IN]-(a:Actor) WITH m, collect(a) as actors RETURN actors, m
Комментарии:
1. Эй, @SWilly22 спасибо, что вернулись, при использовании вашего запроса я получаю дополнительные результаты, так как сопоставление выполняется по каждой стране по одному, а не по всем, и, возможно, я неправильно сформулировал вопрос, но, по сути, я ожидаю, что будут возвращены только фильмы, у которых есть границы для всех стран. Чтобы добавить, я получил возможность сделать это с момента публикации этого вопроса и сделал это, подсчитав количество ребер, однако теперь столкнулся с проблемой, когда некоторые из моих запросов должны обрабатывать (И) ИЛИ ) случаи, а также (И) И). Существует ли временная шкала для поддержки понимания шаблонов?