Изтегляне на дипломната работа

Социална мрежа е структура от същности, свързани пряко или косвено една с друга чрез общи връзки. Тя се моделира като граф, наричан често социален граф. Същностите са върховете на графа, а ребро свързва два върха, ако върховете са свързани с връзка, която характеризира мрежата. Чрез социалните мрежи могат да се открият преки и косвени връзки между хора, групи и неща, с които си взаимодействат. Преки връзки се наблюдават, когато социални субекти са свързани доброволно по явен начин. Косвени връзки възникват от други отношения, които непряко свързват два или повече субекта чрез посредничество. Преките и косвените връзки са в основата на създаване на препоръки.

Ефективните препоръки са красноречив пример за генериране на стойност за крайния потребител чрез предположения.  Алгоритмите за препоръки са индуктивни и предполагащи. Те идентифицират хора, продукти или услуги, към които индивид или група е вероятно да има интерес, на базата на поведението на потребителите. Съществуват три основни подхода за генериране на препоръки - съвместно филтриране, филтриране по съдържание и хибриден подход, съчетаващ предните два. Съвместното филтриране е процес, при който се използва общност от потребители, за да се отдели съществената, свързана и важна информация от останалата. Процесът се базира на идеята, че ако потребители предпочитат еднакво нещо или неща, тогава техните предпочитания ще бъдат подобни за други неща, харесани от подобни потребители. От по-широка перспектива, след като веднъж потребителите са записали предпочитанията си в системата, последващите потребители могат да се възползват от знанието на предните потребители, откъдето идва и съвместният аспект на системата.

Етикирането е процесът на поставяне на дума от естествен език като метаинформация за описание на някакъв ресурс. Лексиката при етикирането обикновено е неконтролируема и потребителите сами решават коя дума или комбинация от думи са подходящи.

Етикетите съдържат метаинформация защо потребител харесва нещо. Ето защо социалните системи за етикиране са идеален избор за комбиниране със системи за съвместно филтриране. В приложението MyFirst ще съчетаем двата подхода. На базата на етикетите, които потребител поставя на нещата, които е направил за първи път, както и на етикетите, с които означава интересите си, ще намерим сходни други потребители. След това ще препоръчаме на потребителя нещо, предизвикало техния интерес, което той все още не е осъществил или поне системата не знае за това.

MyFirst представлява социална мрежа, в която потребителят има възможност да въвежда първите неща, които са му се случили или е направил. Потребителят може да въведе и списък от интереси под формата на етикети. Означава с етикети и първите неща, които е направил и е въвел в системата. На базата на тези етикети и чрез съвместно филтриране, системата открива група от социално подобни потребители и генерира предложения какво ново даден потребител може да направи за първи път. Системата също така генерира препоръки за приятели, има възможност за създаване на списък с планирани бъдещи дейности и добавяне на коментари към публикациите на потребителите. Всяка публикация на потребител има една от трите степени на публичност: лична (видима единствено от автора си), публична (видима от всички) и видима от потребителите, следвани от автора на публикацията.

3          Проектиране, реализация и тестване

Графовият модел за представяне на данните и графовите бази данни прилягат естествено към областта  на социалните мрежи, центрирана около връзките. За реализацията на MyFirst е избрана графовата база данни Neo4j заради производителността и скалируемостта си в сравнение с релационните бази данни. Други използвани технологии са Java, Spring, Spring Data Neo4j, JS, CSS, HTML.

Фундаменталните единици, които формират социалния граф на MyFirst, са възлите и връзките. В Neo4j и двете могат да съдържат свойства. Възлите често са използвани за представяне на същности, но в някои случаи връзките също са използвани за тази цел. Освен свойства и връзки, възлите могат да бъдат означени с един или няколко етикета. Етикетът е наименована графова конструкция, използвана за групиране на възлите в множества. Всички възли, обозначени с един и същи етикет, принадлежат към едно и също множество. Много от заявките над графа могат да работят само с тези множества, а не с целия граф. В модела на данните на MyFirst са използвани етикетите User, Role, Thing, FirstThing, Comment. User групира множеството от всички потребители и притежава свойствата потребителско име, парола, електронен адрес и др. Role групира множеството от роли, които потребителите могат да имат (администратор, обикновен потребител, бизнес потребител и т.н.). Притежава единственото свойство role, чиято стойност е число, обозначаващо ролята. Thing групира множествата от интереси и от етикети на първите неща. Притежава само едно свойство - tag, което има за стойност символен низ, представляващ етикета, с който се маркира интерес или първо нещо. FirstThing групира множествата от първи неща, които потребителите са направили или искат да направят в бъдеще. Притежава свойствата заглавие, описание, публичност и линк към изображение. Comment е етикетът за множеството от коментари, написани от потребителите към свои или чужди първи неща. Притежава две свойства - content (текстовото съдържание на коментара) и date (датата на написване на коментара).

Архитектурата на приложението MyFirst може да се раздели концептуално на четири слоя - презентационен слой, сървис слой, слой за достъп до базата данни и домейн слой. Шаблонът модел-изглед-контролер е реализиран в презентационния и домейн слоевете. Понеже MyFirst е Spring MVC приложение, реализиран е контролер, наричан още диспечер сървлет. Той имплементира шаблона за дизайн фронт контролер и всяка уеб заявка минава през него, за да може той да управлява целия жизнен цикъл на заявката.

Презентационният слой не съдържа бизнес логика. Целта му е да конвертира външните REST API заявки до нещо, което следващият сървис слой разбира и обратно. В него се съдържат контролерите - Java класовете без състояние (stateless), анотирани със Spring анотацията @Controller. Един контролер отговаря за един обект от домейн слоя, като манипулира всички действия, свързани с този обект, включително изброяване, добавяне, изтриване, преглед. Контролерите обработват всички заявки от презентационния слой, извършват валидация на параметрите, извикват необходимите сървиси, обработват отговорите на сървисите, опаковат данните от отговора по удобен начин и го връщат към презентационния слой. Презентационният слой съдържа и JSP страниците, които използват JSTL и библиотеката за тагове на Spring. Едно множество от jsp страници отговаря за един домейн обект. Презентационният слой съдържа и свързаните с потребителския интерфейс CSS файлове и изображения, шрифтове, външни JavaScript библиотеки и персонализиран JavaScript код. Потребителският интерфейс е изграден от следните модули: модул за вход в системата; Home модул, от който потребителите добавят публикации и следят тези на хората, които следват; Search модул за търсене на потребители; MyProfile модул за редакция на профилната информация; Followers модул за последователите и Following модул за хората, които потребителят следва; MyFirsts - модул за публикациите на потребителя.

Сървис слоят осигурява бизнес логиката на приложението. Този слой е отделен от презентационния слой, за да могат да се викат услуги от различни източници. Съдържа сървисите - Java класове без състояние, анотирани със Spring анотацията @Service, чиито методи са анотирани с @Transactional. Сървис слоят осигурява на приложението транзакционни операции за бизнес логиката. Идеята е, че сървис метод е най-малката атомарна операция, която приложението ще извърши в базата данни. Сървис методът или завършва изпълнението си успешно, като резултатът е консистентен статус на базата данни, или отменя промените, които е направил (rollback), оставяйки базата данни отново в консистентно състояние. Сървис слоят не знае нищо за уеб заявките и за базата данни. Сървисите получават класове от модела, извършват някаква биснес логика, извикват други сървиси, обръщат се към хранилищата и дават като резултат други класове от модела. Първоначално сървисите се извикват от контролерите. Те използват хранилищата от слоя за достъп до базата данни, за да заредят или съхранят информация в базата.

Слоят за достъп до данните има за цел да достъпва базата данни за изпълняване на заявки и запис, модификация и изтриване на същности. Този слой е съставен от Java интерфейси, които представляват хранилища и не изискват никакви анотации. Интерфейсите са разширение на интерфейса GraphRepository, част от Spring Data Neo4j библиотеката.

Домейн слоят съдържа домейн обектите. На всяка същност от базата данни е съпоставен домейн обект, който представлява Java клас, анотиран със Spring Data Neo4j анотацията @NodeEntity. Във всеки домейн клас задължително трябва да има графов идентификатор, обозначен с @GraphId. Домейн слоят комуникира с всички останали слоеве, като комуникацията с презентационния слой се осъществява с помощта на Mapper, който създава DTO от домейн обект и това DTO може свободно да се използва в изгледите с помощта на JSTL тагове.

Алгоритъмът за препоръки на първи неща е реализиран в слоя за достъп до данните с помощта на езика за работа с графови бази данни Cypher. Чрез съвместно филтриране се открива група от потребители, социално подобни на даден потребител. Откриват се такива потребители, които:

       са използвали най-много общи етикети с даден потребител;

       имат най-много общи интереси с даден потребител;

       използвали са най-много такива етикети, които потребителят е добавил като интереси;

       добавяли са най-много интереси, каквито потребителят е използвал за етикети.

След като групата от социално подобни потребители е идентифицирана, откриват се публично достъпни първи неща, направени от тези потребители и означени с етикет, какъвто потребителят все още не е използвал. Целта е да не се препоръчват неща, които потребителят вече е правил. Също така се премахват и първите неща, към които потребитят е отбелязал, че не проявява интерес, вече е направил или е добавил към бъдещите си планове.

Алгоритъмът за препоръки на приятели е доста по-прост - той генерира предложения на базата на общи познати.

При създаването на MyFirst е използван подходът за тестване “черна кутия”, при който изследваната програмна част се разглежда като елемент с неизвестно съдържание, към който се подават входни данни и се проверява дали крайният резултат съвпада с очаквания. Използвана е JUnit технологията за модулно тестване на програми, написани на Java.

 

MyFirst е специализирана социална мрежа за първи неща, която е реализирана с помощта на графова база данни и генерира предложения за нови дейности, неизвършвани до момента от потребителите, с помощта на алгоритъм за съвместно филтриране и етикиране.