Neo4j

2011-12-12 9 views
9

में संबंध शक्ति का प्रतिनिधित्व (और वृद्धि) प्रतिनिधित्व करना मैं को Neo4j ग्राफ में नोड्स के बीच संबंधों की ताकत बदलना चाहता हूं।Neo4j

एक स्थिर ग्राफ के लिए, यह आसानी से संबंधों पर एक "शक्ति" संपत्ति की स्थापना द्वारा किया जाता है:

A --knows--> B 
     | 
    strength 
     | 
     3 

हालांकि, एक ग्राफ कि समय के साथ अद्यतन करने की जरूरत के लिए, वहाँ एक समस्या है, incrementing के बाद से संपत्ति का मूल्य परमाणु रूप से (आरईएसटी इंटरफ़ेस के माध्यम से) नहीं किया जा सकता है क्योंकि एक पूर्व-लेखन-लेखन की आवश्यकता होती है। आने वाले स्ट्रीम किए गए डेटा के जवाब में ग्राफ़ को अपडेट किया जा रहा है, तो वृद्धि (केवल अद्यतन करने के बजाय) आवश्यक है।

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

एक अन्य समाधान है, किसी भी गुण के बिना, कई रिश्तों को रिकॉर्ड करने के लिए इतना है कि "शक्ति" वास्तव में, रिश्ते की गिनती है यानी

A knows B 
A knows B 
A knows B 

शक्ति का संबंध का मतलब हो सकता है 3.

  • नुकसान: केवल पूर्णांक शक्तियों दर्ज किया जा सकता
  • लाभ: कोई पढ़ा-पहले-लिखने की आवश्यकता है
  • नुकसान: (शायद) अधिक भंडारण की आवश्यकता
  • नुकसान: (शायद) बहुत धीमी मान प्राप्त करने के बाद से कई रिश्तों को निकाला जाना चाहिए और गिना

किसी को भी इस दृष्टिकोण की कोशिश की है, और यह, प्रदर्शन के मुद्दों में चलाने के लिए विशेष रूप से होने की संभावना है जब पढ़ने ?

क्या इसका मॉडल करने का कोई बेहतर तरीका है?

उत्तर

5

अच्छा विचार। स्टोरेज को कम करने और बहु-पढ़ने के लिए उन रिश्तों को बैच नौकरी में एक से जोड़ा जा सकता है जो लेनदेन चलाता है।

प्रत्येक रिले में एक व्यक्तिगत वजन मूल्य भी हो सकता है, जिसका समेकित मूल्य वजन के रूप में उपयोग किया जाता है। यह पूर्णांक आधारित नहीं होना चाहिए और कमी का प्रतिनिधित्व करने के लिए नकारात्मक भी हो सकता है।

आप लेन-देन के एक रिश्ते पर वजन मूल्य अपडेट करने के लिए एक छोटा सर्वर-एक्सटेंशन भी लिख सकते हैं। शायद यहां तक ​​कि (REST API लिए फ़ायदेमंद होगा "एकल मान सेट" आपरेशन के अलावा के रूप में एक मूल्य आपरेशन को संशोधित किया है।

PUT http://localhost:7474/db/data/node/15/properties/mod/foo 

शरीर डेल्टा मूल्य (1.5 शामिल है, -10)। एक और विचार होगा वास्तविक ऑपरेशन से मोड कीवर्ड को बदलने के लिए हो सकता है।

PUT http://localhost:7474/db/data/node/15/properties/add/foo 
PUT http://localhost:7474/db/data/node/15/properties/or/foo 
PUT http://localhost:7474/db/data/node/15/properties/concat/foo 

क्या "वेतन वृद्धि" एक गैर पूर्णांक मामले में मतलब होता है?

+0

धन्यवाद - वहां कई दिलचस्प संभावनाएं हैं! शब्दकोश की जांच करने के बाद, मुझे लगता है कि गैर-पूर्णांक 'वृद्धि' के बारे में बात करना ठीक है (हालांकि स्पष्ट रूप से आपको राशि निर्दिष्ट करना होगा)! – DNA

1

आपके द्वारा लक्षित किए जाने वाले लोड और लिखने वाले लोड पर थोड़ा सा निर्भर करता है। कुल ग्राफ कितना बड़ा होगा?

+0

किसी न किसी अनुमान पर, मैं कुछ लाखों नोड्स कहूंगा। संबंधों की संख्या कम निश्चित है, लेकिन शायद नोड्स की संख्या का एक छोटा सा हिस्सा। ग्राफ़ लगातार प्रति सेकंड या कुछ सैकड़ों इकाइयों को जोड़ने या अपडेट करने के लिए अद्यतन किया जाएगा। पठन भार शायद काफी हल्का होगा; उदाहरण के लिए, निर्दिष्ट नोड के इलाके में नोड्स की एक छोटी संख्या का चयन करना। – DNA

+0

mmh, यदि आप एक-एक-एक से अधिक लेन-देन में अपडेट को समूहबद्ध कर सकते हैं, तो आपको ठीक प्रदर्शन करना चाहिए। –

2

हम्म एक अलग दृष्टिकोण का थोड़ा सा है, लेकिन आप एक क्यूइंग सिस्टम का उपयोग करने पर विचार कर सकते हैं। मैं Neo4j REST इंटरफ़ेस का भी उपयोग कर रहा हूं और लगातार बदलती रिश्ते की शक्ति को संग्रहीत करने में देख रहा हूं। परियोजना रेल में है और Resque का उपयोग कर रहा है। जब भी Neo4j डेटाबेस के लिए एक अद्यतन की आवश्यकता होती है तो उसे एक कार्यकर्ता द्वारा पूरा किए जाने वाले रेस्क्यू कतार में फेंक दिया जाता है। मेरे पास केवल एक कार्यकर्ता नियो 4j रेस्क्यू कतार पर काम कर रहा है, इसलिए यह कभी भी एक बार में एक से अधिक नियो 4j अपडेट करने की कोशिश नहीं करता है।

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