Базирана на съдържание система за възстановяване в neo4j за голям набор от данни

Опитвам се да направя уебсайт за препоръки за книги. Обходих някои сайтове за книги и имам около 15 милиона отделни книги в базата данни, която е в neo4j.

Сега за някои жанрове, като мистерия и трилър, има поне около 1 милион книги. Трябва да съставя топ 20 списък с препоръки. Сегашният ми подход-

  1. вземете книгите
  2. изпълнете сравнение на подобие (век-косинус или Pearsons)
  3. сортиране и показване

са скъпи и отнемат време, никак не са добри за система в реално време. Мислех да поддържам сортиран списък по жанр, като свързвам neo4j с традиционна DB и вземам най-добрите от тази db чрез neo4j. Но това също е бавно (отнема няколко десетки секунди). Има ли по-прост и по-интуитивен начин да направите това? Всякакви идеи ще помогнат.


person goelakash    schedule 08.02.2015    source източник


Отговори (1)


Би било добре да знаете на какви други критерии бихте искали да базирате препоръките си, напр. как точно измервате приликите между книгите. Предполагам, че не е чисто жанрово.

Един подход, който сме възприели с тези плътни възли (като вашите жанрове или градове, в които хората живеят и т.н.), е да намерим препоръки първо въз основа на някои други критерии, след което да увеличим оценката за уместност на препоръката, ако е свързана с правилния плътен възел. Такава заявка е много по-производителна.

Например, когато препоръчвам 20 души, с които трябва да сте приятели, бих намерил 100 кандидати въз основа на всички други критерии и след това ще повиша резултатите на кандидатите, живеещи на същото място като потребителя, за когото препоръчваме. Това са 100 обхождания с един скок, което ще бъде много бързо.

Разгледайте този скорошен запис на уебинар, може да намерите малко вдъхновение в него.

По отношение на мерките за сходство, може да се наложи те да бъдат предварително изчислени, свързвайки подобни книги чрез SIMILAR_TO отношения. Такова предварително изчисление може да се извърши с помощта на Runtime на GraphAware Framework, който изпълнява това изчисление на заден план само през тихи периоди, като по този начин не пречи на обичайната ви обработка на транзакции. Вижте модула NodeRank, който изчислява PageRank в Neo4j по време на тихи периоди.

person Michal Bachman    schedule 08.02.2015