2016-02-28 6 views
6

चलें कहते हैं कि हम इस तरह के रूप खाद्य पदार्थों के एक डेटाबेस है:ArangoDB - ग्राफ का उपयोग कर कस्टम अनुशंसा इंजन को कैसे कार्यान्वित करें?

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

मैं एक ग्राफ के रूप में समस्या मॉडलिंग की है: कितनी अच्छी तरह प्रत्येक आइटम स्कोर सबसे अच्छा आइटम की गणना करने और सिफारिश करने के लिए की जरूरत है ०१२३५८८६४७८

सिफारिशों को प्राप्त करने का सही तरीका क्या है - एक कस्टम ट्रैवर्सल ऑब्जेक्ट या केवल फ़िल्टर करें और एक्यूएल का उपयोग करके गिनें या इसे फॉक्सक्स (जावास्क्रिप्ट लेयर) में कार्यान्वित करें?

इसके अलावा, क्या आप सुझाए गए तरीकों के लिए नमूना कार्यान्वयन में मदद कर सकते हैं?

अग्रिम धन्यवाद!

+0

मैं अरंगोडब के साथ एक खाद्य अनुशंसा इंजन कर रहा हूं, संपर्क में रहना चाहता हूं और उस बारे में बात करना चाहता हूं? –

+0

ज़रूर! जीमेल पर स्टेलेमेट पर मुझे ईमेल करें। –

उत्तर

2

सबसे पहले, संग्रह और उनकी सामग्री को आपके द्वारा निर्दिष्ट तरीके से बनाने दें। हम एक दूसरा उपयोगकर्ता जोड़ देंगे।

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 पसंद इस क्वेरी के साथ किया जा सकता है:

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

अब उनके किनारों के साथ बढ़त संग्रह बनाने की सुविधा देता है

FOR v, e IN 1..2 OUTBOUND "user/user1" userPreferences, dishTags 
    RETURN {item: v, connection: e} 
,210

अगर आप अब सभी व्यंजनों कि 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 भी व्यंजन का उपयोग करेगा। जिस तरह से हम इसे करते हैं। हम समान प्राथमिकताओं वाले उपयोगकर्ताओं को ढूंढने के लिए उपयोगकर्ता संग्रह में वापस जाते हैं।

फॉक्सक्स-सेवा बनाना चाहे या नहीं, एक अच्छा विकल्प व्यक्तिगत वरीयताओं पर निर्भर करता है। फॉक्सक्स बहुत अच्छा है यदि आप & सर्वर पक्ष पर फ़िल्टर परिणाम जोड़ना चाहते हैं, तो क्लाइंट संचार कम है। यदि आप डीबी-प्रश्नों की तुलना में माइक्रोस्कोप के शीर्ष पर अपना आवेदन रखना चाहते हैं तो आप इसका भी उपयोग कर सकते हैं। आपका एप्लिकेशन तब डेटाबेस विशिष्ट कोड से मुक्त रह सकता है - यह केवल operates with the microservice इसके बैकएंड के रूप में है। ऐसे उपयोगकाज हो सकते हैं जहां फॉक्सएक्स

सामान्यतः, कोई "सही" तरीका नहीं है - प्रदर्शन, कोड स्वच्छता, स्केलेबिलिटी इत्यादि के कारण आप विभिन्न तरीकों से बेहतर हो सकते हैं।

संबंधित मुद्दे