2015-01-03 2 views
1

Я хочу создать базу данных, где: Человек может оценивать: Фильм по критерию. Я хочу, чтобы критические характеристики были динамическими:Агрегация Neo4j в зависимости от свойства отношения

Например, Джон мог оценить Титаник 3,8/5 для действующих и 4/5 для специальных эффектов. Анна могла оценить Титаника 4/5 по актерскому и 5/5 на декоре

На данный момент, моя стратегия:

  • два типа узлов: Человек и: Фильм
  • соотношению: Person - [: Оценить {критерии: строка, оценка: поплавок}] ->: фильм

Мой вопрос: есть ли способ Cypher запроса рейтинги фильма агрегирование ранги по критериям?

Этот запрос на фильм Титаник должен вернуть что-то вроде:

[ {criteria: acting, avg_m.grade : 3.9},{criteria: special effects, avg_m.grade : 4},{criteria: decor, avg_m.grade : 5}] 

ответ

2

Вы должны использовать функцию avg Cypher в. Предполагая, что вы хотите иметь средние значения в фильме с заголовком «abc»:

MATCH (:Movie {title:'abc'})<-[r:Rate]-() 
RETURN r.criteria as criteria, avg(r.grade) as avg_grade 
+1

Не имеет смысла менять название отношения вместо того, чтобы иметь свойство, указывающее критерии? Например. '(: Person) - [: RATED_ACTING {рейтинг: 5}] -> (: Movie)', '(: Person) - [: RATED_SPECIAL_EFFECTS {рейтинг: 4}] -> (: Movie)' и т. Д. –

+0

Оба делают смысл, ваш вариант будет быстрее nicole, но если вам все равно нужно получить доступ к свойствам (рейтинг), то это не будет иметь такой разницы, а запрос легче читать/писать для критериев как свойство. –

+0

Решение Nicole действительно может работать, но я хочу, чтобы критерии были динамическими (генерируемыми пользователями): как я могу запросить отношение, о котором я не знаю типа? – Hugo

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