Оптимизировать шифрованный запрос

Как я могу оптимизировать этот шифрованный запрос? Это в 3-4 раза медленнее, чем аналогичный запрос с использованием Gremlin.

START movie=node:vertices(movieId="100") 
MATCH genera1<--movie<--()-[ratedRel:rated]->anotherMovie-->genera1 
WHERE ratedRel.stars > 3 
RETURN anotherMovie.title as title, anotherMovie.movieId as id, 
genera1.genera as genera, 
COUNT(anotherMovie) as count ORDER BY count(anotherMovie) DESC LIMIT 20;

Я просто пытаюсь получить фильмы с рейтингом более 3 звезд и те же роды, что и узел START: http://markorodriguez.files.wordpress.com/2011/09/movielens-schema.png?w=350

Я запускаю запрос в консоли и использую Neo4j 1.9.

Запрос Гремлина:

m = [:];
x = [] as Set;
v = g.v(node_id);

v.out('hasGenera').aggregate(x).back(2).inE('rated').
filter{it.getProperty('stars') > 3}.outV.outE('rated').
filter{it.getProperty('stars') > 3}.
inV.filter{it != v}.
filter{it.out('hasGenera').toSet().equals(x)}.
groupCount(m){\"${it.id}:${it.title.replaceAll(',',' ')}\"}.iterate();

m.sort{a,b -> b.value <=> a.value}[0..24];

person Manuel Palacio    schedule 13.12.2012    source источник
comment
Пожалуйста, вставьте запрос гремлина тоже   -  person ulkas    schedule 14.12.2012
comment
Вы можете попробовать запрос с Neo4j 1.9.M02 и посмотреть, будет ли он все еще медленнее? Набор данных тот же, что и Марко в своем примере?   -  person Michael Hunger    schedule 17.12.2012
comment
Да, это тот же набор данных, и я пробовал с M02. Это было еще медленнее.   -  person Manuel Palacio    schedule 17.12.2012
comment
а можно ли убрать дифферент, он тебе все равно не нужен.   -  person Michael Hunger    schedule 19.12.2012


Ответы (1)


START movie=node:vertices(movieId="100") 
MATCH movie-->genera1<-anotherMovie<-[ratedRel:rated]-user
WHERE ratedRel.stars > 3 
RETURN anotherMovie.title as title, anotherMovie.movieId as id, genera1.genera as genera, 
COUNT(ratedRel) as cnt ORDER BY cnt DESC LIMIT 20;

обновление: на основе вашего запроса гремлина, не могли бы вы попробовать этот?

START movie=node:vertices(movieId="100") 
MATCH movie-[:hasGenera]->genera1<-[:hasGenera]-anotherMovie<-[ratedRel:rated]-user
WITH anotherMovie,count(ratedRel) as allVotes, sum(ratedRel) as allStars,genera1
WHERE allStars/allVotes>3 
RETURN anotherMovie.title as title, anotherMovie.movieId as id, genera1.genera as genera, 
allStars ORDER BY allStars DESC LIMIT 20;

дело в том, чтобы точно определить как можно больше элементов в пути (в этом случае мы пропустили имена rels) и опустить узел user, который я не знаю, как это сделать в шифре, но он, очевидно, не указан в списке. код гремлина.

person ulkas    schedule 14.12.2012
comment
Да, это работает, но все равно почти в 3 раза медленнее, чем Gremlin. Я предполагаю, что Gremlin более эффективен, поскольку вы точно указываете, что и как это делать. - person Manuel Palacio; 16.12.2012
comment
это нормально в очень структурированных запросах, потому что в гремлине вы можете точно описать свой алгоритм обхода, тогда как в шифровании движок сам пытается найти наилучший обход. Однако я не могу сказать, может ли ваш запрос относиться к этому случаю, поскольку я не работаю с гремлином. возможно, вы пытались запустить шифрование несколько раз подряд, чтобы кеш полностью включился? и сравните лучшее время с лучшим временем выполнения серии кэширования гремлина... - person ulkas; 17.12.2012
comment
Если я запускаю запрос несколько раз, то запрос Gremlin (3 с) полностью превосходит запрос Cypher (19 с). - person Manuel Palacio; 20.12.2012
comment
Спасибо. Получил исключение после выполнения такого запроса: Разработчик: Андрес утверждает, что: агрегаты не должны использоваться таким образом. Кстати, сейчас я использую Neo4j 1.8.1, так как эта версия доступна на Heroku. - person Manuel Palacio; 06.01.2013
comment
вероятно, что-то с функциями агрегации count() и sum(), используемыми в одной строке. попробуйте как-то обновить запрос или взломать эту строку. так как у меня нет вашего варианта использования, я написал запрос жестко, не проверяя его в реальности. - person ulkas; 07.01.2013