2017-02-16 3 views
0

Условия: Эмильneo4j: как построить правильный запрос?

  • Пользователь знает, Дэн и Питер.

  • Emil добавляет 1 звезду видео «о кошках»

  • Dan добавляет 5 звезд к видео «крутому фильму» и 3 звезды на видео «о кошках»

  • Петр добавляет 1 звезду к видео "крутой фильм" и 3 звезды на видео "смешное видео"

Проблема:

Эмиль должен знать все V идеологов, которых он знакомил, и других пользователей, которые его сняли. Но он не интересовался видео, с которым он уже снялся. Кроме того, ему нужно получить видео, отсортированное по общей оценке.

В нашем случае выход должен быть:

1) "крутой фильм", 6 звезд, снимались Дэн и Питер

2) "забавное видео", 3 звезды, избранные Петром

Вопрос: как может выглядеть запрос? Спасибо.


Запрос для заполнения базы данных:

CREATE 
    (emil:User { name: "Emil" }), 
    (dan:User { name: "Dan" }), 
    (peter:User { name: "Peter" }), 
    (emil)-[:KNOWS]->(dan), 
    (emil)-[:KNOWS]->(peter), 
    (cool:Video { title: "cool film" }), 
    (funny:Video { title: "funny video" }), 
    (cats:Video { title: "about cats" }), 
    (emil)-[:RATE { score: 1 }]->(cats), 
    (dan)-[:RATE { score: 5 }]->(cool), 
    (dan)-[:RATE { score: 3 }]->(cats), 
    (peter)-[:RATE { score: 1 }]->(cool), 
    (peter)-[:RATE { score: 3 }]->(funny) 

graph image

+0

Вы еще не пытались выполнить запрос? Иногда это помогает попробовать и посмотреть, как далеко вы сможете добраться. – InverseFalcon

+0

Мой самый длинный пробег - ** MATCH (источник: Пользователь) - [: KNOWS] -> (пользователи) - [r: RATE] -> (видео), где source.name = 'Emil' и NOT (source) - [: RATE] -> (видео) возвращает videos.title, sum (r.score) в качестве порядка оценки по счету desc **. Выглядит почти близко, но не знаю, как агрегировать информацию пользователя в запрос :) –

ответ

0

Ваш запрос к довольно много пятно на!

Единственное, чего не хватает, это включение пользователей, которые оценили каждый фильм. Простой COLLECT(users) должен сделать трюк.

MATCH (source:User)-[:KNOWS]->(users)-[r:RATE]->(videos) 
where source.name = 'Emil' and NOT (source)-[:RATE]->(videos) 
return videos.title, sum(r.score) as score, COLLECT(users) as starredBy 
order by score desc 
+0

MATCH (источник: Пользователь) - [: KNOWS] -> (пользователи) - [r: RATE] -> (видео), где source.name = 'Emil' и NOT (source) - [: RATE] -> (видео) возвращают videos.title, SUM (r.score) в качестве оценки, COLLECT (users.name), поскольку пользователи заказывают по счету desc –

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