2013-06-06 6 views
5

का उपयोग करते हुए एक neo4j डेटाबेस में नोड्स डालने का सबसे प्रभावी तरीका क्या है I py2neo पायथन का उपयोग करके साइफर कमांड निष्पादित करके एक बड़ी संख्या में नोड्स (~ 500,000) को एक (गैर-एम्बेडेड) neo4j डेटाबेस में डालने का प्रयास कर रहा हूं मॉड्यूल (py2neo.cypher.execute)। आखिर में मुझे py2neo पर निर्भरता को हटाने की जरूरत है, लेकिन मैं इस समय इसका उपयोग तब तक कर रहा हूं जब तक कि मैं साइफर और neo4j के बारे में अधिक नहीं सीखता।साइफर

मेरे पास दो नोड प्रकार ए और बी हैं, और नोड्स का विशाल बहुमत प्रकार ए के हैं। दो संभावित रिश्तों आर 1 और आर 2 हैं, जैसे कि ए- [आर 1] -ए और ए- [आर 2] -बी । टाइप ए के प्रत्येक नोड में 0 - 100 आर 1 रिश्ते होंगे, और टाइप बी के प्रत्येक नोड में 1 - 5000 आर 2 रिश्ते होंगे।

फिलहाल मैं बड़े क्रिएट स्टेटमेंट्स का निर्माण करके नोड्स डाल रहा हूं। उदाहरण के लिए मैं एक बयान

CREATE (:A {uid:1, attr:5})-[:r1]-(:A {uid:2, attr:5})-[:r1]-... 

जहां ... एक और 5000 या तो नोड्स और रिश्तों ग्राफ में एक रेखीय श्रृंखला के गठन हो सकता है हो सकता है। यह ठीक काम करता है, लेकिन यह बहुत धीमी है। मैं भी

CREATE INDEX ON :A(uid) 

इस्तेमाल करने के बाद मैं सभी प्रकार के एक नोड्स जोड़ने गए इन नोड्स का अनुक्रमण कर रहा हूँ, मैं ग्रुप बी बयान फिर से बनाएँ का उपयोग कर नोड्स जोड़ें। अंत में, मैं की तरह

MATCH c:B, m:A where c.uid=1 AND (m.uid=2 OR m.uid=5 OR ...) 
CREATE (m)-[:r2]->(c) 

जहां एक बयान का उपयोग कर r2 रिश्तों को जोड़ने के लिए ... कुछ हजार या कथन का प्रतिनिधित्व कर सकता है कोशिश कर रहा हूँ। यह प्रति सेकेंड केवल कुछ रिश्तों को जोड़ने में वास्तव में धीमा लगता है।

तो, क्या ऐसा करने का एक बेहतर तरीका है? क्या मैं यहां पूरी तरह से ट्रैक बंद कर रहा हूँ? मैंने this question देखा लेकिन यह समझ में नहीं आता है कि कैसे नोड्स को कुशलतापूर्वक लोड करने के लिए साइफर का उपयोग करना है। मैं जो कुछ भी देखता हूं वह जावा का उपयोग करता है, वास्तविक साइफर प्रश्नों को दिखाए बिना इस्तेमाल किया जा सकता है।

उत्तर

6

अंत तक (2.0 में) इंडेक्स न बनाएं। यह नोड निर्माण धीमा कर देगा।

क्या आप अपने साइफर में पैरामीटर का उपयोग कर रहे हैं?

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

आप पहले से ही अपने साइफर अनुरोध में काफी भारी हिस्से भेज रहे हैं, लेकिन बैच अनुरोध API आपको एक से अधिक आरईएसटी अनुरोध में एक से अधिक भेजने देगा, जो तेज़ हो सकता है (इसे आजमाएं!)।

अंत में, यदि यह एक बार आयात है, तो आप बैच-आयात उपकरण का उपयोग करने पर विचार कर सकते हैं - यह खराब हार्डवेयर पर कुछ मिनटों में 500K नोड्स के माध्यम से जला सकता है ... फिर आप डेटाबेस फ़ाइलों को अपग्रेड कर सकते हैं (मुझे नहीं लगता कि यह अभी तक 2.0 फाइलें बना सकता है, लेकिन यह जल्द ही आ रहा है), और साइफर के माध्यम से अपने लेबल/इंडेक्स बनाएं।

अद्यतन: मैंने अभी अंत में आपके MATCH कथन को देखा है। आपको इसे इस तरह से नहीं करना चाहिए - ids के लिए OR का उपयोग करने के बजाय एक समय में एक रिश्ता करें। यह शायद बहुत मदद करेगा - और सुनिश्चित करें कि आप यूआईडी के लिए पैरामीटर का उपयोग करें। साइफर 2.0 या तो इंडेक्स संकेत का उपयोग करते समय, या तो इंडेक्स लुकअप करने में सक्षम नहीं प्रतीत होता है। शायद यह बाद में आएगा।

दिसंबर 2013 अपडेट करें: 2.0 में साइफर ट्रांजैक्शनल एंडपॉइंट है, जिसे मैंने महान थ्रूपुट सुधार देखा है।मैं 100-3000 स्टेटमेंट्स के "exec" आकारों का उपयोग करके 20-30k साइफर कथन/दूसरा भेज सकता हूं, और कुल 1000-10000 विवरणों के लेनदेन आकार का उपयोग कर रहा हूं। साइफर पर लोडिंग तेज करने के लिए बहुत प्रभावी है।

+1

मैं दूसरे वेस टिप्पणियों को चाहता हूं: पैरामीटर, छोटे कथन, यदि आप 2.0 का उपयोग कर रहे हैं, तो साइफर के लिए लेनदेन संबंधी HTTP एंडपॉइंट का उपयोग करने पर विचार करें, देखें: http://neo4j.org/develop/labels साइफर और आयात के लिए देखें: http: //www.neo4j.org/develop/import और http://jexp.de/blog/2013/05/on-importing-data-in-neo4j-blog-series/ –

+0

सलाह के लिए धन्यवाद। क्या आप जानते हैं कि मैं पाइथन से साइफर क्रिएट स्टेटमेंट के साथ पैरामीटर का उपयोग कैसे कर सकता हूं? सब कुछ जो मैं पैरामीटर के बारे में ढूंढने में सक्षम हूं, जावा हैश मैप्स के बारे में बात कर रहा है। – savagent

+0

py2neo में यह पैराम्स नामक एक शब्दकोश पैरामीटर है। http://book.py2neo.org/en/latest/cypher.html यदि आप HTTP पर कच्चे JSON कर रहे हैं, तो आप क्वेरी के साथ JSON अनुरोध पर एक पैराम जोड़ सकते हैं: {uid: ...}। –

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