ArangoDB-如何使用graph实现自定义推荐引擎?

ArangoDB-如何使用graph实现自定义推荐引擎?,graph,arangodb,aql,Graph,Arangodb,Aql,假设我们有一个食品数据库,例如: item1 = {name: 'item1', tags: ['mexican', 'spicy']}; item2 = {name: 'item2', tags: ['sweet', 'chocolate', 'nuts']}; item3 = {name: 'item3', tags: ['sweet', 'vanilla', 'cold']}; 我们有一位用户在寻找食物推荐,他们在推荐中指出了他们对某些标签的偏好重量: foodPref = {sweet

假设我们有一个食品数据库,例如:

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
使用此查询可以找出用户1喜欢什么:

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
我们过滤
得分
属性

现在,我们希望找到另一个与
user1
具有相同偏好的用户:

FOR v, e IN 2..2 ANY "user/user1" userPreferences RETURN v
我们进入
任何方向(向前和向后),但只对
用户首选项
边缘集合感兴趣,否则2..2也会使用盘子。我们现在的做法。我们回到用户集合中,找到具有类似偏好的用户

创建Foxx服务是否是一个好的选择取决于个人喜好。如果您想在服务器端合并和过滤结果,那么Foxx非常好,这样客户机通信就更少了。如果您希望将应用程序置于微服务之上而不是数据库查询之上,也可以使用它。然后,您的应用程序可能不包含特定于数据库的代码—它仅作为后端。在某些用例中,Foxx


总的来说,没有“正确”的方法-由于性能、代码清洁度、可伸缩性等原因,您可能更喜欢不同的方法。

我正在与arangodb开发一个食品推荐引擎,想联系并讨论一下吗?当然!请通过gmail向我发送电子邮件至stalemett。