2016-12-06 2 views
1

Пожалуйста, проверьте мой Cypher ниже, я получаю результат с запросом ниже() с низкими записями, но по мере увеличения записей требуется около 1601152 мс: Я нашел предложение добавить USING INDEX, и я применил запрос USING INDEX.Как я могу оптимизировать свой запрос neo4j cypher?

PROFILE MATCH (m:Movie)-[:IN_APP]->(a:App {app_id: '1'})<-[:USER_IN]-(p:Person)-[:WATCHED]->(ma:Movie)-[:HAS_TAG]->(t:Tag)<-[:HAS_TAG]-(mb:Movie)-[:IN_APP]->(a) 
USING INDEX a:App(app_id) WHERE p.person_id= '1' 
    AND NOT (p:Person)-[:WATCHED]-(mb) 
RETURN DISTINCT(mb.movie_id) , mb.title, mb.imdb_rating, mb.runtime, mb.award, mb.watch_count, COLLECT(DISTINCT(t.tag_id)) as Tag, count(DISTINCT(t.tag_id)) as matched_tags 
ORDER BY matched_tags DESC SKIP 0 LIMIT 50 

Помогите мне, что я могу сделать?

Я пытаюсь найти 100 фильмов для рекомендации на основе тегов, в том числе 100 фильмов, которые я не смотрю и не согласен с тегами фильмов, которые я смотрел.

ответ

2

Следующий запрос может работать лучше для вас [при условии, что у вас есть индексы как для :App(app_id), так и для :Person(person_id)]. Кстати, я предположил, что в вашем запросе идентификатор ma должен был быть m (или наоборот).

MATCH (m:Movie)-[:IN_APP]->(a:App {app_id: '1'})<-[:USER_IN]-(p:Person {person_id: '1'})-[:WATCHED]->(m) 
WITH a, p, COLLECT(m) AS movies 
UNWIND movies AS movie 
MATCH (movie)-[:HAS_TAG]->(t)<-[:HAS_TAG]-(mb:Movie)-[:IN_APP]->(a) 
WHERE NOT mb IN movies 
WITH DISTINCT mb, t 
RETURN mb.movie_id, mb.title, mb.imdb_rating, mb.runtime, mb.award, mb.watch_count, COLLECT(t.tag_id) as Tag, COUNT(t.tag_id) as matched_tags 
ORDER BY matched_tags DESC SKIP 0 LIMIT 50; 

Если вас PROFILE Этот запрос, вы должны видеть, что он выполняет NodeIndexSeek операции (вместо гораздо медленнее NodeByLabelScan), чтобы быстро выполнить первый MATCH. Запрос также собирает все movies, просматриваемые указанным человеком, и позже использует эту коллекцию для ускорения предложения WHERE (которое больше не нуждается в ударе по БД). Кроме того, запрос удалил некоторые ярлыки из некоторых шаблонов узлов (где это, казалось бы, было недвусмысленным), чтобы ускорить обработку.

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