2016-02-28 8 views
6

Допустим, у нас есть база данных продуктов питания, таких как:ArangoDB - как реализовать пользовательский механизм рекомендаций с использованием графика?

item1 = {name: 'item1', tags: ['mexican', 'spicy']}; 
item2 = {name: 'item2', tags: ['sweet', 'chocolate', 'nuts']; 
item3 = {name: 'item3', tags: ['sweet', 'vanilla', 'cold']; 

И у нас есть пользователь ищет рекомендации питания, где они указывают на их вес предпочтение для некоторых тегов:

foodPref = {sweet: 4, chocolate: 11} 

Теперь мы нужно рассчитать, насколько хорошо каждый запись баллов и рекомендовать лучшие пункты:

item1 score = 0 (doesn't contain any of the tags user is looking for) 
item2 score = 4 (contains the tag 'sweet') 
item3 score = 15 (contains the tag 'sweet' and 'chocolate') 

Я смоделированные проблему в виде графика: sample graph

Каков правильный способ получить рекомендации - пользовательский объект обхода или просто фильтровать и подсчитывать с помощью AQL или просто реализовать его в Foxx (слой javascript)?

Также вы можете помочь с образцовой реализацией методов, которые вы предлагаете?

Заранее благодарен!

+0

Я делаю двигатель рекомендации по еде с arangodb, хочу связаться и поговорить об этом? –

+0

Конечно! Пожалуйста, напишите мне на stalemett по gmail. –

ответ

2

Прежде всего, создайте коллекции и их содержимое так, как вы их указали. Мы добавим второго пользователя.

db._create("user") 
db._create("tags") 
db._create("dishes") 

db.user.save({_key: 'user1'}) 
db.user.save({_key: 'user2'}) 

db.tags.save({_key: 'sweet'}) 
db.tags.save({_key: 'chocolate'}) 
db.tags.save({_key: 'vanilla'}) 
db.tags.save({_key: 'spicy'}) 

db.dishes.save({_key: 'item1'}) 
db.dishes.save({_key: 'item2'}) 
db.dishes.save({_key: 'item3'}) 

Теперь позволяет создавать краевые коллекции со своими краями:

db._createEdgeCollection("userPreferences") 
db._createEdgeCollection("dishTags") 

db.userPreferences.save("user/user1", "tags/sweet", {score: 4}) 
db.userPreferences.save("user/user1", "tags/chocolate", {score: 11}) 
db.userPreferences.save("user/user2", "tags/sweet", {score: 27}) 
db.userPreferences.save("user/user2", "tags/vanilla", {score: 7}) 

db.dishTags.save("tags/sweet", "dishes/item2", {score: 4}); 
db.dishTags.save("tags/sweet", "dishes/item3", {score: 7}) 
db.dishTags.save("tags/chocolate", "dishes/item2", {score: 2}) 
db.dishTags.save("tags/vanilla", "dishes/item3", {score: 3}) 
db.dishTags.save("tags/spicy", "dishes/item1", {score: 666}) 

Наши отношения так:

user-[userPreferences]->tags-[dishTags]->dishes 

выяснить, что user1 любит можно сделать с этим запросом:

FOR v, e IN 1..2 OUTBOUND "user/user1" userPreferences, dishTags 
    RETURN {item: v, connection: e} 

если вы теперь хотите, чтобы найти все блюда, которые user1 нравятся лучше:

FOR v, e IN 2..2 OUTBOUND "user/user1" userPreferences, dishTags 
    FILTER e.score > 4 RETURN v 

Мы фильтр для атрибута score.

Теперь мы хотим, чтобы найти другой пользователь, который имеет то же предпочтение, как user1 делает:

FOR v, e IN 2..2 ANY "user/user1" userPreferences RETURN v 

Заходит в ANY направления (вперед и назад), но только заинтересованы в коллекции userPreferences края, еще- ..2 также будет использовать посуду. То, как мы это делаем сейчас. мы возвращаемся в пользовательские коллекции, чтобы найти пользователей с аналогичными предпочтениями.

Независимо от того, является ли создание Foxx-сервиса хорошим вариантом, зависит от личных предпочтений. Foxx отлично подходит, если вы хотите комбинировать & результаты фильтрации на стороне сервера, поэтому общение с клиентами меньше. Вы также можете использовать его, если хотите разместить приложение скорее на микросервисах, чем на db-запросах. Тогда ваше приложение может оставаться свободным от кода, специфичного для базы данных, - это всего лишь operates with the microservice. Там могут быть случаи, когда Foxx

В общем, нет «правильного» способа - существуют разные способы, которые вы можете предпочесть выше других из-за производительности, чистоты кода, масштабируемости и т. Д.

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