#neo4j #cypher #graphdb #property-graph
Вопрос:
У меня есть следующий график в Neo4j:
Книга: book_id, isbn, код языка, название, список изображений, список малых изображений, средние значения,
Автор: имя,
Читатель: идентификатор,
с 3 отношениями:
(Читатель)-[:Рейтинг]->(Книга)> имеет свойство {рейтинг: значение},
(Читатель)-[:Рекомендую]->(Книга)>,
(Автор)-[:Написать]->(Книга)>.
Я хочу найти книгу, которая была наиболее рекомендована, с запросом в Cypher.
Я написал запрос, но я не слишком уверен в этом, потому что я не знаком с использованием операторов count() и max ().
Вот моя попытка:
MATCH (r:Reader) - [rel:recommend] -> (b:Book)
RETURN count(rel), b
ORDER BY count
LIMIT 1
Комментарии:
1. Пожалуйста, укажите вашу попытку.
2. СОВПАДЕНИЕ (r:Читатель) — [r:рекомендую] -> (b:Книга) КОЛИЧЕСТВО ВОЗВРАЩАЕМЫХ(r), b ПОРЯДОК ПО количеству ЛИМИТ 1
3. Ну, переменная
r
запутана: относится ли она к читателям или к отношениям «рекомендовать»? В этом случае вы должны получить синтаксическую ошибку. Вам также может потребоваться СДЕЛАТЬ ЗАКАЗ ПО запросу.
Ответ №1:
Я бы попробовал это:
MATCH (:Reader) - [:recommend] -> (b:Book)
RETURN
count(1) AS `Number of Recommendations`,
b AS `Book`
ORDER BY `Number of Recommendations` DESC
LIMIT 1
Я бы оставил этот LIMIT
пункт без внимания, пока вы не убедитесь, что он делает то, что вы хотите. У меня нет вашей базы данных, поэтому я не могу это проверить, но, возможно, это сработает в качестве первого шага.
Комментарии:
1. Спасибо, но я все еще не понимаю, как count(1) может подсчитать количество рекомендаций для каждой книги.
2. И почему вы ставите DESC?
3. Вам нужно упорядочить значения в порядке убывания, чтобы первое значение было самым большим.
count(1)
просто подсчитывается в соответствии с группировкой — в данном случае по книге. Обычно это делается немного быстрееcount(1)
, чем нужноcount(r)
. Я протестировал версию этого кода в базе данных Neo4j, к которой у меня есть доступ, и она работает.