首先,让我们按照您指定的方式创建集合及其内容。我们将添加第二个用户。
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
一般来说,没有“正确”的方式 - 由于性能,代码清洁度,可伸缩性等因素,您可能会偏向于其他方式。
我正在用arangodb做一个食物推荐引擎,想与我联系并讨论一下吗? –
当然!请发邮件给我stalemett上的Gmail。 –