首先,讓我們按照您指定的方式創建集合及其內容。我們將添加第二個用戶。
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。 –