繁体   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