2016-02-28 97 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 .2也會提供使用菜餚。我們現在這樣做的方式。我們回到用戶集合中來查找具有類似偏好的用戶。

創建Foxx服務是否是一個好選擇取決於個人偏好。如果您想在服務器端結合&過濾器結果,Foxx非常棒,因此客戶端通信較少。如果您希望將應用程序放在微服務而不是db查詢上,也可以使用它。然後您的應用程序可以保持不含數據庫特定的代碼 - 它只有operates with the microservice作爲其後端。可能有些用戶Foxx

一般來說,沒有「正確」的方式 - 由於性能,代碼清潔度,可伸縮性等因素,您可能會偏向於其他方式。