Neo4J

2011-05-11 16 views
15

में एकाधिक ग्राफ संग्रहीत करना मेरे पास एक ऐसा एप्लिकेशन है जो एक MySQL तालिका (contact_id, other_contact_id, power, record_at) में रिश्ते की जानकारी संग्रहीत करता है। यह ठीक है अगर मुझे बस इतना करना है कि दो संपर्कों के लिए आपसी संपर्कों की सूची उत्पन्न करने के लिए संपर्क संपर्क कौन हैं या यहां तक ​​कि यह भी है।Neo4J

लेकिन अब मुझे आंकड़े उत्पन्न करने की आवश्यकता है: 'जनवरी 2011 में ताकत 3 या बेहतर तरीके से 2-चरणीय कनेक्शन की कुल संख्या क्या थी' या (मान लीजिए कि प्रत्येक संपर्क समूह का हिस्सा है) 'किस समूह में है अन्य समूहों के लिए कनेक्शन की अधिकांश संख्या इत्यादि।

मैंने तुरंत पाया कि इन आंकड़ों को उत्पन्न करने के लिए एसक्यूएल अनावश्यक वास्तविक तेज़ बन गया है।

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

मेरा अगला विचार उन ग्राफों को कैश करना था, इसलिए जब भी मुझे एक नई स्थिति चलाने की आवश्यकता होती है (या बाद में ग्राफ उत्पन्न होता है: उदाहरण के ग्राफ के लिए मैं कल का ग्राफ लेता हूं और कल से होने वाले किसी भी बदलाव को लागू करता हूं) । मैंने memcached की कोशिश की जो ग्राफ तक बढ़ने तक महान काम किया> 1 एमबी।

तो अब मैं Neo4J जैसे ग्राफ डेटाबेस का उपयोग करने के बारे में सोच रहा हूं।

केवल समस्या है, मेरे पास सिर्फ एक ग्राफ नहीं है। या मैं करता हूं, लेकिन यह वह समय है जो समय के साथ बदलता है और मुझे इसे अलग-अलग संदर्भ समय से पूछने में सक्षम होना चाहिए।

तो, मैं कर सकते हैं: Neo4J और rertrieve में

  • दुकान एकाधिक रेखांकन/उन लोगों के साथ अलग से बातचीत? मैं फिर प्रत्येक तारीख के लिए अलग-अलग सामाजिक ग्राफ बना और स्टोर करूंगा।

या

  • प्रत्येक किनारे करने के लिए और timestamps से मान्य जोड़ सकते हैं और उचित रूप से ग्राफ फिल्टर करें: यदि ऐसा है तो मैं के लिए "1st सकता है-" एक ग्राफ चाहता था मैं केवल दो noeds के बीच नवीनतम बढ़त का पालन होता है कि "1 मई" से पहले बनाया गया था (और यदि सभी किनारों को 1 मई के बाद बनाया गया था तो उन नोड्स को कनेक्ट नहीं किया जाएगा)।

मैं ग्राफ डेटाबेस के लिए बहुत नया हूं इसलिए किसी भी मदद/पॉइंटर्स/संकेतों की सराहना की जाएगी।

+1

कुछ पढ़ने के बाद मैं सोच रहा हूं कि संदर्भ नोड्स कुंजी हैं या नहीं? मैं प्रत्येक दिन के लिए एक संदर्भ नोड बना सकता हूं और फिर उस दिन के ग्राफ़ को इसके संदर्भ नोड से बना सकता हूं ... – emh

+0

हाय वहाँ, मुझे ग्राफ के लिए एक्सेंट्री नोड्स का उपयोग करना लगता है, और हो सकता है कि उन्हें कुछ संपत्ति के साथ इंडेक्स करें ताकि आप उन्हें न केवल बंद कर सकें एक संदर्भ नोड लेकिन इंडेक्स लुकअप द्वारा यहां सहायता कर सकते हैं। क्या आपके सबग्राफ एंट्री नोड्स के कुछ "मेटा डेटा" गुणों को अनुक्रमणित करना आपको सही प्रारंभिक बिंदु देता है? –

उत्तर

14

अभी आप एक ही Neo4j उदाहरण में सिर्फ एक ग्राफ डेटाबेस स्टोर कर सकते हैं, लेकिन जैसा कि आप की तरह इस एक graphdb के रूप में कई विभिन्न उप-रेखांकन हो सकते हैं। ग्लोबल ऑपरेशंस (इंडेक्स प्रश्नों की तरह) करते समय आपको केवल इसे ध्यान में रखना होगा, लेकिन वहां आप यौगिक प्रश्नों को कर सकते हैं जिनमें टाइमस्टैम्प गुण भी शामिल हैं और परिणामों को सीमित करने के लिए भी शामिल हैं। कि ऐसा करने का

एक ही रास्ता है, जैसा कि आप किनारों को अस्थायी जानकारी जोड़ने किसी दिए गए दिनांक आप तो ग्राफ की संरचना पार कर सकते हैं वापस तो के लिए एक ग्राफ की संरचना का प्रतिनिधित्व करने के लिए कहा।

संदर्भ नोड का नियो 4j में एक अलग अर्थ है।

का उपयोग प्रतिदिन श्रेणी नोड्स (और उन्हें जोड़ने और उन्हें उच्च स्तर timespans के लिए एकत्रित) अनुक्रमित गुण से नोड्स के वर्गीकरण का अधिक graphy तरीका है। (प्रभावी रूप से ये इन-ग्राफ़ इंडेक्स हैं जिन्हें आप आसानी से अपने ट्रैवर्सल और ग्राफ़ क्वेरीज़ में शामिल कर सकते हैं)।

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

आपका डोमेन ग्राफ़ डेटाबेस के लिए बहुत उपयुक्त लगता है। यदि आपके पास अधिक विस्तृत प्रश्न हैं Neo4j mailing list में शामिल होने के लिए स्वतंत्र महसूस करें।

+0

मेलिंग सूची लिंक मृत है – keyser

5

सबसे आसान समाधान नहीं है (मुझे लगता है कि आप केवल एक मशीन के साथ काम करते हैं), लेकिन यदि आप वास्तव में अपने ग्राफ को अलग करना चाहते हैं, तो आपको केवल यह याद रखना होगा कि एक ग्राफ एक निर्देशिका है।

फिर आप एक गतिशील लोडर क्लास बना सकते हैं जो आपके इच्छित डेटाबेस का पथ लेता है, इसे क्वेरी के लिए स्मृति में लोड करता है, और अपना उत्तर प्राप्त करने के बाद इसे बंद कर देता है। आप प्रॉक्सी सर्वर को भी कॉन्फ़िगर कर सकते हैं, और अपने लोडर को 2 पैरामीटर भेज सकते हैं: आपकी क्वेरी (जो मुझे लगता है कि इस मामले में एक साइफर क्वेरी है) और उस डेटाबेस का पथ जिसे आप क्वेरी करना चाहते हैं।

यदि आपके पास जवाब देने के लिए बहुत से वास्तविक समय के प्रश्न हैं तो यह पर्याप्त नहीं है। लेकिन अगर यह डेटा सेट पर कुछ एनालिटिक्स स्टोर करने और करने के लिए है, तो यह निश्चित रूप से आपकी आवश्यकताओं का उत्तर दे सकता है।

+2

क्या आप साइफर क्वेरी में ग्राफ डेटाबेस पथ को गतिशील रूप से संदर्भित करने के तरीके पर कुछ प्रकाश डाल सकते हैं। अग्रिम में धन्यवाद... –

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