2012-10-05 6 views
10

मैं सिर्फ ग्राफ डेटाबेस में जा रहा हूं, और मुझे "इंडेक्स नोड" या "नोड प्रकार" जैसी चीज़ों को ट्रैक करने के लिए "इंडेक्स नोड" या "अनुक्रमित संपत्ति" का उपयोग करने के बीच निर्णय लेने में एक समस्या में चलना प्रतीत होता है। चूंकि मेरे पास अब तक कोई वास्तविक अनुभव नहीं है, इसलिए मेरे पास निर्णय के आधार पर कोई जानकारी नहीं है और दोनों दृष्टिकोण समान रूप से मान्य प्रतीत होते हैं।ग्राफ डेटाबेस में इंडेक्स नोड्स या अनुक्रमित संपत्ति बेहतर क्यों होगी?

तो सवाल यह है कि: दो दृष्टिकोणों के बीच व्यापार क्या हैं, और पैमाने (यानी नोड्स की संख्या) निर्णय को कैसे प्रभावित करती है?

एक नमूना परिदृश्य के लिए, मान मान वहाँ दो "बातें" के प्रकार हैं: ProductUser और, और उपयोगकर्ता नोड्स के बीच किनारों और उत्पाद नोड्स बात इतना नहीं करते हैं, लेकिन क्या हम के बारे में परवाह है, तो है हम type: User और type: Product प्रत्येक नोड पर गुण चाहते हैं, या यदि हम चाहते हैं कि प्रत्येक नोड को क्रमशः User नोड और Product नोड पर इंगित करें।

किस परिस्थिति में कौन सा दृष्टिकोण बेहतर है?

नोट: मैं विशेष रूप से नियो 4j और टाइटन को देख रहा हूं, लेकिन मुझे लगता है कि यह अधिक आम तौर पर भी लागू होगा।

उत्तर

18

सबसे पहले, आप अपने आप से पूछना चाहिए: एक शीर्ष/नोड के प्रकार अनुक्रमित करने की आवश्यकता है? आईई। क्या आपको उनके प्रकार से चरम/नोड्स को पुनर्प्राप्त करने की आवश्यकता है, मान लीजिए, ग्राफ से सभी 'उपयोगकर्ता' कोष्ठक पुनर्प्राप्त करें या आपको किसी दिए गए प्रकार के सभी शीर्षकों को पुनर्प्राप्त करके प्रारंभ करने वाले प्रश्नों का उत्तर देने की आवश्यकता है और फिर उनको फ़िल्टर/संसाधित करें?

यदि इस प्रश्न का उत्तर हाँ है, तो मेरा सुझाव है कि आप प्रकार को एक स्ट्रिंग प्रॉपर्टी के रूप में संग्रहीत करें जो अनुक्रमित है। या, यदि आप किसी जेवीएम आधारित भाषा में विकास कर रहे हैं, तो आप एक प्रकार की enum परिभाषित कर सकते हैं और उस प्रकार का उपयोग कर सकते हैं क्योंकि अधिक प्रकार की सुरक्षा और स्वचालित त्रुटि जांच के लिए संपत्ति प्रकार। टाइटन मनमानी उपयोगकर्ता परिभाषित कक्षाओं/enums संपत्ति प्रकार के रूप में समर्थन करता है और कम स्मृति पदचिह्न के लिए उन लोगों को संपीड़ित करेगा।

हालांकि, इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह स्केल नहीं करेगा क्योंकि आप कम चयनशीलता सूचकांक बना रहे हैं। इसका अर्थ यह है कि 'उपयोगकर्ता' या 'उत्पाद' प्रकार के बहुत से शिखर होने की संभावना है और उन सभी को क्रमशः 'उपयोगकर्ता' या 'उत्पाद' के लिए इंडेक्स प्रविष्टि से जोड़ा जाना चाहिए। यह इस सूचकांक को बनाए रखने और पूछताछ को बहुत महंगा और स्केल करने में कठोर बनाता है (कल्पना करें कि फेसबुक के पास 'टाइप' इंडेक्स था: 'फोटो' एंट्री के तहत अरबों शिखर होंगे)। यदि आप स्केलिंग से संबंधित नहीं हैं (फिर भी), तो यह काम कर सकता है।

यदि प्रश्न का उत्तर कोई है, तो मैं ग्राफ में चरम/नोड्स के रूप में मॉडल प्रकारों का सुझाव देता हूं। अर्थात। एक 'उपयोगकर्ता' वर्टेक्स और 'उत्पाद' वर्टेक्स और प्रत्येक उपयोगकर्ता से 'उपयोगकर्ता' वर्टेक्स, '0' लेबल वाले किनारे

इस दृष्टिकोण का लाभ यह है कि आप अपने डेटा को मॉडल करने के लिए ग्राफ़ का उपयोग करते हैं आपके डेटाबेस के बाहर स्ट्रिंग मान रखने के बजाय महत्वपूर्ण प्रकार की जानकारी का प्रतिनिधित्व करते हैं। जैसे ही आप अपना आवेदन बनाते हैं, ग्राफ डेटाबेस इसका केंद्रीय घटक बन जाएगा और लंबे समय तक टिकेगा। चूंकि प्रोग्रामिंग भाषाएं और डेवलपर आते हैं और जाते हैं, आप डेटा मॉडलिंग और टाइप जानकारी को उनके साथ जाने के लिए नहीं चाहते हैं और इस सवाल का सामना कर रहे हैं: "SPECIAL_USER का क्या अर्थ है?" इसके बजाय, एक विशेष_यूएसईआर वर्टेक्स है और इसके लिए उद्भव जानकारी जोड़ें, यानी, इस प्रकार किसने बनाया, यह क्या दर्शाता है और एक संक्षिप्त विवरण - डेटाबेस में सभी।

इस दृष्टिकोण के साथ एक समस्या यह है कि 'उपयोगकर्ता' और 'उत्पाद' शिखर पर आपके आवेदन स्केल के रूप में बहुत से किनारों की घटना होगी। दूसरे शब्दों में, आप सुपरनोड बना रहे हैं जो स्केलिंग मुद्दों को बनाते हैं। यही कारण है कि टाइटन ने एक unidirectional किनारे की अवधारणा पेश की। एक यूनिडायरेक्शनल एज वेब पर एक लिंक की तरह है: प्रारंभिक वर्टेक्स एक और कशेरुका को इंगित करता है, लेकिन वह कशेरुक किनारे से अनजान है। चूंकि आप 'उपयोगकर्ता' वर्टेक्स से सभी उपयोगकर्ता शीर्षकों तक नहीं जाना चाहते हैं, इसलिए आप स्केलेबिलिटी और प्रदर्शन में कुछ भी खोना नहीं चाहते हैं।

+0

तो संक्षेप में, अनुक्रमित संपत्ति का उपयोग करके स्केलेबिलिटी के खर्च पर सभी नोड्स-ऑफ-ए-टाइप के साथ आसानी से काम करने की अनुमति मिलती है, जबकि इंडेक्स नोड्स का उपयोग करते समय स्केलेबिलिटी के खर्च पर एक अधिक प्राकृतिक (यानी संरचनात्मक) प्रतिनिधित्व होता है । क्या एक तरीका या दूसरा काफी हद तक सीमित करता है कि ग्राफ का उपयोग कैसे किया जा सकता है? – cdeszaq

+0

मुझे यकीन नहीं है कि मैं आपका अनुसरण कर रहा हूं। यदि कोई दूसरा समाधान का उपयोग करने के लिए आपकी सिफारिश का पालन करता है (इस प्रकार प्रकार निर्दिष्ट करने के लिए किनारे का उपयोग), तो वह उपयोगकर्ताओं की सूची कैसे ढूंढता है? क्योंकि वह उपयोगकर्ता कशेरुक से उपयोगकर्ताओं की सूची में नहीं जा सकता ... –

+0

महान उत्तर माथीस के लिए धन्यवाद। लेकिन क्या आप 'उपयोगकर्ता' नोड को यूनिडायरेक्शनल किनारों के बारे में कुछ और बात नहीं कर सकते? प्रत्येक दिशा में पूछताछ के संदर्भ में इसका क्या प्रभाव होगा? (मैं अनुमान लगा रहा हूं, और बड़ा प्रभाव नहीं, जब तक आप किनारे पर इंडेक्स गुण जोड़ते हैं)।और कैसंद्रा के साथ, यूनिडायरेक्शनल किनारों के साथ, आप उदाहरण के लिए <10 के लाखों नोड्स 'उपयोगकर्ता' प्रकार तक सीमित हैं। –

4

आप किस तरह की क्वेरी पूछना चाहते हैं? Neo4j में, आप एक User और एक Product सूचकांक बनाना होगा या फिर उन्हें एक में गठबंधन है, और फिर

start bob = node:User(name='Bob') match .... 

और यहां तक ​​कि प्रतिलिपि प्राप्त जैसे कार्य पूछना करने में सक्षम हो। यदि कोई नोड उपयोगकर्ता या उत्पाद है, तो आसान जांच के लिए, आप अभी भी सुविधाजनक और तेज़ ट्रैवर्सल के लिए नोड्स पर संपत्ति प्राप्त कर सकते हैं। यदि आप उपयोगकर्ता/उत्पाद से इंस्टेंस नोड्स पर ट्रैवर्स नहीं कर रहे हैं (आप इसके लिए इंडेक्स लुकअप करते हैं), तो आप PRODUCT या USER रिश्ते को वापस (सुपर) नोड्स पर रिलेशनशिप करके चेक भी कर सकते हैं, जिससे आप चेक इन कर सकते हैं

start s = node:User(name='Bob') match s-[r]-(product)-[typeRel:PRODUCT]->() return product 

HTH तरह -traversal

0

इंडेक्सिंग के लिए एक बहुत ही महत्वपूर्ण कारण इमो को याद किया गया है। मान लें कि आपके पास कई अलग-अलग गुणों और कई अलग-अलग नोड प्रकारों के साथ एक जटिल ग्राफ है, और आप एक "व्यक्ति" के साथ एक पैटर्न से मेल खाना चाहते हैं जिसमें गुणों का समूह है।

कोई अनुक्रमणिका के साथ, आपके पास ग्राफ को पार करने के अलावा कोई विकल्प नहीं है, एक ग्राफ जिसमें शायद 0.01% नोड्स प्रकार के व्यक्ति हैं। और ट्रैवर्सल ग्राफ के असंगत क्षेत्रों तक नहीं पहुंच सकते हैं।

इसके बजाय, अगर मैंने व्यक्ति को अनुक्रमित किया है, तो मैं बस हर व्यक्ति के माध्यम से पुन: प्रयास करता हूं, और प्रत्येक व्यक्ति के चारों ओर स्थानीय रूप से खोज करता हूं ताकि यह देखने के लिए कि उनका पैटर्न मेल खाता है या नहीं।

आपको तुरंत यह देखने में सक्षम होना चाहिए कि इन दृष्टिकोणों में से पहला ग्राफ के कुल आकार के साथ स्केल करता है, लेकिन ग्राफ़ में लोगों की कुल संख्या के साथ दूसरा केवल तराजू।

नैतिक: यदि आप एक उपयोग मामले पर विचार करते हैं जहां आपके पैटर्न में बाध्य नोड के रूप में किसी विशेष प्रकार के नोड के साथ ग्राफ की कई खोज होंगी (उदाहरण के लिए "पैटर्न एक्स वाले लोगों" के लिए बहुत सारी खोजें), तो बेहतर खोज प्रदर्शन के लिए आपको इन नोड्स को इंडेक्स करना चाहिए।

यदि आप "व्यक्तिगत पीटर के दो लिंक के भीतर सभी नोड्स" जैसी चीजों की खोज करने जा रहे हैं, तो उनके नाम से व्यक्ति को अनुक्रमणित करना महत्वपूर्ण होगा, और ग्राफ आकार के बावजूद निरंतर समय प्रदर्शन की अनुमति देगा - जैसा कि आप अनिवार्य रूप से देख रहे हैं एक हैश टेबल में पीटर का स्थान ऊपर।

+0

प्रश्न 'व्यक्ति नाम' जैसी फ्रीफॉर्म गुणों के बजाय, 'नोड टाइप' जैसी अलग-अलग गुणों पर केंद्रित है, इसलिए पीटर के नोड को ढूंढने के बारे में आपका बिंदु इस प्रश्न में कारक नहीं है। लेकिन यह एक अच्छा भेद है, क्योंकि एक फ्रीफॉर्म संपत्ति को इंडेक्स करने का एकमात्र समझदार तरीका पारंपरिक सूचकांक के साथ है। – cdeszaq

+0

इसके अलावा, सवाल यह है कि आपके नोड्स के .01% को कैसे संभालना है। सवाल यह है कि "इंडेक्स-नोड्स किस बिंदु पर अलग-अलग क्षेत्रों के लिए पारंपरिक इंडेक्स की तुलना में अधिक/कम समझ में आता है, जैसे नोड टाइप"। प्रश्न इंडेक्सिंग के लिए _reason_ के बारे में नहीं है, यह लगभग बेहतर तरीके से अनुक्रमणित करने की विधि के बारे में है, कब और क्यों? _ – cdeszaq

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