Cypher (Neo4j) - Найти все отношения, если одно отношение из узла удовлетворяет условию независимо от пути поиска? - PullRequest
0 голосов
/ 11 октября 2018

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

У меня очень простая настройка графика с User узлами и Movieузлы и существует отношение от User к Movie, называемое :REVIEWED, которое имеет свойство rating, которое несет рейтинг пользователей (1,0-5,0 включительно).См. Диаграмму ниже:

enter image description here

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

  • Найти десятку лучших фильмов, у которых хотя бы один отзыв был меньше 3.

То есть мы хотим отсортировать фильмы по их средней оценке, однако хотя бы один отзыв должен быть меньше 3,0.Запрос, который я использовал для сортировки фильмов на основе их среднего рейтинга:

MATCH (movie:Movie)<-[review:REVIEWED]-(user:User) 
RETURN movie.movieTitle, avg(review.rating) as avgRating 
ORDER BY avgRating DESC 
LIMIT 10

Это имеет смысл для меня, однако, когда я пытаюсь ограничить путь к обзорам с рейтингом менее 3, см. Ниже:

MATCH (movie:Movie)<-[review:REVIEWED]-(:User) 
WHERE review.rating < 3
RETURN movie.movieTitle, avg(review.rating) as avgRating 
ORDER BY avgRating DESC 
LIMIT 10

Подбираются только пути, имеющие отношения с рейтингом менее 3, что я и должен получить.Тем не менее, проблема в том, что, когда мы усредняем рейтинги, они усредняют только оценки менее 3,0.

В идеале мы хотим иметь все отзывы для этого фильма, если существует обзор для этого фильма с рейтингом менее 3,0, независимо от того, находится ли он в согласованном пути.Это где я запутался.Поскольку Cypher использует шаблоны для сопоставления путей в графе, как мы можем использовать его для проверки всех путей из узла и проверки соответствия условию, а затем продолжения сопоставления всех путей на основе этого результата.

С нетерпением ждем, что вы, ребята, думаете, заранее спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Вам нужен запрос из двух разделов, сначала сопоставьте фильмы, у которых есть оценка отзыва ниже 3, а затем усредните их оценки,

MATCH (movie:Movie)<-[review:REVIEWED]-(:User) 
WHERE review.rating < 3
WITH DISTINCT movie
MATCH (movie)<-[review:REVIEWED]-(:User)
RETURN avg(review.rating) as avgRating 
ORDER BY avgRating DESC 
LIMIT 10
...