簡體   English   中英

ArangoDB-如何使用圖形實現自定義推薦引擎?

[英]ArangoDB - how to implement a custom recommendation engine using graph?

假設我們有一個食品數據庫,例如:

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')

我已將問題建模為圖表: 樣本圖

獲取建議的正確方法是什么-自定義遍歷對象,或者僅使用AQL進行過濾和計數,或者僅在Foxx(javascript層)中實現它?

另外,您可以為您建議的方法提供示例實現嗎?

提前致謝!

首先,讓我們按照指定的方式創建集合及其內容。 我們將添加第二個用戶。

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相同的首選項的user1

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

我們朝着ANY方向(前進和后退)前進,但僅對userPreferences邊緣集合感興趣,否則2..2也將提供實用菜餚。 我們現在的方式。 我們返回到用戶集合中以查找具有相似偏好的用戶。

創建Foxx服務是否合適取決於個人喜好。 如果您想在服務器端合並和過濾結果,Foxx非常有用,因此客戶端通信較少。 如果您希望將應用程序置於微服務之上而不是數據庫查詢之上,則也可以使用它。 然后,您的應用程序可能沒有數據庫特定的代碼-它僅以微服務作為后端運行。 在某些情況下Foxx

通常,沒有“正確”的方法-由於性能,代碼簡潔性,可伸縮性等原因,您可能會優先選擇其他方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM