2012-02-15 10 views
26

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

मैंने चारों ओर देखा और वास्तव में कुछ भी नहीं मिला लेकिन मुझे एक साधारण MySQL बैकएंड को अनुमति देने से संबंधित कुछ भी नहीं मिला।

क्या यह संभव है? क्या किसी भी प्रकार के लगातार भंडारण के लिए कनेक्टिविटी की अनुमति देने के लिए कुछ भी मौजूद है?

धन्यवाद!

अद्यतन: मुझे इस विषय को 'स्टार्टअप के लिए सोशल नेटवर्क विश्लेषण' में देखना याद है, लेखक अन्य स्टोरेज विधियों (एचबीएएस, एस 3 इत्यादि सहित) के बारे में बात करता है लेकिन यह नहीं दिखाता कि यह कैसे करें या यदि संभव हो।

+3

मैंने आपके प्रश्न का शीर्षक संपादित किया और "nosql" टैग जोड़ा। विशेष रूप से, मैंने शीर्षक में संदर्भ को * networkx * में हटा दिया क्योंकि नेटवर्कक्स को किसी विशेष ग्राफ प्रारूप/प्रोटोकॉल की आवश्यकता नहीं है (वास्तव में, इसमें सभी सामान्य प्रारूपों से अनुवाद करने के तरीके हैं), इसलिए तथ्य यह है कि आपके ग्राफ़ हैं नेटवर्कक्स से उत्पन्न संभावित उत्तरों पर कोई प्रभाव नहीं पड़ता है। – doug

उत्तर

41

वहाँ भंडारण रेखांकन के लिए कंटेनर के दो सामान्य प्रकार हैं:

  1. सच ग्राफ डेटाबेस: उदाहरण के लिए, Neo4J, अपना पहला नाटक, GraphDB, और AllegroGraph; ये न केवल एक ग्राफ संग्रह करते हैं बल्कि वे यह भी समझते हैं कि एक ग्राफ है, उदाहरण के लिए, आप इन डेटाबेस क्वेरी कर सकते हैं उदा। नोड एक्स और नोड वाई से सबसे कम पथ के बीच कितने नोड्स हैं?

  2. स्थिर ग्राफ कंटेनर: ट्विटर का MySQL- अनुकूलित फ़्लॉक डीबी यहां सबसे प्रसिद्ध उदाहरण है। ये डीबी ग्राफ़ को ठीक से स्टोर और पुनर्प्राप्त कर सकते हैं; लेकिन ग्राफ को स्वयं पूछने के लिए, आपको पहले को डीबी से ग्राफ़ पुनर्प्राप्त करना होगा, फिर ग्राफ को क्वेरी करने के लिए लाइब्रेरी (उदा। पायथन के उत्कृष्ट नेटवर्कक्स) का उपयोग करें।

redis आधारित ग्राफ कंटेनर मैं नीचे चर्चा करते हैं, दूसरी श्रेणी में है, हालांकि जाहिरा तौर पर redis भी पहली श्रेणी में कंटेनरों के लिए अच्छी तरह से अनुकूल है के रूप में एक ग्राफ लागू करने के लिए redis-graph, एक उल्लेखनीय छोटे अजगर पैकेज इसका सबूत रेडिस में डेटाबेस।

redis खूबसूरती से काम करेगा।

Redis उत्पादन के उपयोग के लिए उपयुक्त एक भारी शुल्क, टिकाऊ डेटा स्टोर है, फिर भी यह कमांड लाइन विश्लेषण के लिए उपयोग करने के लिए काफी आसान है।

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

आपको पहले redis और पायथन क्लाइंट स्थापित करने की आवश्यकता है। DeGizmo Blog में एक उत्कृष्ट "अप-एंड-रनिंग" ट्यूटोरियल है जिसमें दोनों को स्थापित करने पर चरण-दर-चरण मार्गदर्शिका शामिल है। निर्देशिका जिसमें आप redis स्थापित (/usr/स्थानीय करने के लिए

  • सीडी:

    एक बार redis और उसके अजगर ग्राहक स्थापित कर रहे हैं, एक redis सर्वर है, जो आपको इतना पसंद करते हैं शुरू /bin 'nix पर अगर आपने के माध्यम से स्थापित किया है तो इंस्टॉल करें); अगले

  • प्रकार redis-सर्वर सुरक्षा प्रॉम्प्ट पर तो दर्ज

आप अब देखना चाहिए सर्वर लॉग फाइल नीचे अपनी खोल खिड़की

>>> import numpy as NP 
>>> import networkx as NX 

>>> # start a redis client & connect to the server: 
>>> from redis import StrictRedis as redis 
>>> r1 = redis(db=1, host="localhost", port=6379) 

पर पीछा स्निपेट में, मैंने एक चार-नोड ग्राफ संग्रहित किया है; नीचे दी गई प्रत्येक पंक्ति रेडिस क्लाइंट पर एचएमएससेट पर कॉल करती है और उस नोड ("0" => किनारे, "1" => किनारे से जुड़े किनारे को स्टोर करती है। (व्यवहार में, जाहिर है, आप चाहते हैं सार एक समारोह में इन दोहराए कॉल; मैं प्रत्येक कॉल दिखा यहाँ हूँ क्योंकि यह संभावना है आसान है कि जिस तरह से समझने के लिए।)

>>> r1.hmset("n1", {"n1": 0, "n2": 1, "n3": 1, "n4": 1}) 
     True 

>>> r1.hmset("n2", {"n1": 1, "n2": 0, "n3": 0, "n4": 1}) 
     True 

>>> r1.hmset("n3", {"n1": 1, "n2": 0, "n3": 0, "n4": 1}) 
     True 

>>> r1.hmset("n4", {"n1": 0, "n2": 1, "n3": 1, "n4": 1}) 
     True 

>>> # retrieve the edges for a given node: 
>>> r1.hgetall("n2") 
     {'n1': '1', 'n2': '0', 'n3': '0', 'n4': '1'} 

अब जब कि ग्राफ एक समान होती है, इसे पुनः प्राप्त रेडिस डीबी से नेटवर्कएक्स ग्राफ के रूप में।

, यह करने के लिए कई तरीके हैं नीचे दो * चरणों * में यह किया: एक निकटता मैट्रिक्स, एक 2D NumPy के रूप में कार्यान्वित में

  1. redis डेटाबेस से डेटा निकालने सरणी; तो

  2. परिवर्तित जो सीधे उस NetworkX ग्राफ एक NetworkX उपयोग करने के लिए निर्मित समारोह:

कोड करने के लिए कम, इन दो चरणों हैं:

>>> AM = NP.array([map(int, r1.hgetall(node).values()) for node in r1.keys("*")]) 
>>> # now convert this adjacency matrix back to a networkx graph: 
>>> G = NX.from_numpy_matrix(am) 

>>> # verify that G in fact holds the original graph: 
>>> type(G) 
     <class 'networkx.classes.graph.Graph'> 
>>> G.nodes() 
     [0, 1, 2, 3] 
>>> G.edges() 
     [(0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (3, 3)] 

जब आप खत्म एक लाल सत्र, आप क्लाइंट से सर्वर को बंद कर सकते हैं:

>>> r1.shutdown() 

रेडिस इसे बंद करने से ठीक पहले डिस्क पर सहेजता है, इसलिए यह सुनिश्चित करने का एक अच्छा तरीका है कि सभी लेखन जारी रहे।

तो रेडिस डीबी कहां है? यह डिफ़ॉल्ट फ़ाइल नाम के साथ डिफ़ॉल्ट स्थान में संग्रहीत है, जो डंप है।आपकी होम निर्देशिका पर rdb

इसे बदलने के लिए, redis.conf फ़ाइल (redis स्रोत वितरण के साथ शामिल है) संपादित; कुछ भी आप चाहते हैं

# The filename where to dump the DB 
dbfilename dump.rdb 

परिवर्तन dump.rdb, लेकिन जगह में .rdb विस्तार छोड़: लाइन के साथ शुरू करने के लिए जाना।

इसके बाद, फ़ाइल पथ को बदलने के लिए, redis.conf में इस लाइन को खोजने:

# Note that you must specify a directory here, not a file name 

कि नीचे लाइन redis डेटाबेस के लिए निर्देशिका स्थान है। इसे संपादित करें ताकि वह आपके इच्छित स्थान को पढ़ सके। अपने संशोधन सहेजें और इस फ़ाइल का नाम बदलें, लेकिन .conf एक्सटेंशन रखें। आप अपनी कॉन्फ़िगरेशन फ़ाइल को कहीं भी स्टोर कर सकते हैं, जब आप रेडिस सर्वर शुरू करते हैं तो उसी कस्टम कॉन्फ़िगरेशन फ़ाइल का पूरा पथ और नाम प्रदान करें:

तो अगली बार जब आप एक रेडिस सर्वर शुरू करेंगे, तो आपको करना होगा । यह बहुत की तरह (सुरक्षा प्रॉम्प्ट से:

$> cd /usr/local/bin # or the directory in which you installed redis 

$> redis-server /path/to/redis.conf 

अंत में, Python Package Index सूचियों एक पैकेज विशेष रूप से redis में एक ग्राफ डेटाबेस को लागू करने के लिए पैकेज redis-graph कहा जाता है और मैं इसे इस्तेमाल नहीं किया है

+1

वाह, बहुत बहुत धन्यवाद। यह नहीं पता था कि यह संभव था लेकिन मैं इसके साथ खेलना चाहूंगा। चूंकि आपने मेरे ग्राफ से संबंधित प्रश्नों का बहुत जवाब दिया है, इसलिए मैं आपके दिमाग को दूसरे के साथ लेने की कोशिश करने जा रहा हूं ... क्या आप जानते हैं या आपने neo4j के साथ नेटवर्कक्स (या कोई ग्राफिंग lib) को एकीकृत करने का प्रयास किया है? जब मैंने यह प्रश्न लिखा था तो मैं रेडिस के बारे में सोच रहा था लेकिन हाल ही में ऐसा लगता है कि neo4j ग्राफ से संबंधित कार्यों के लिए अधिक अनुकूल है .. नेटवर्क x (या जंग, आदि ..) के साथ neo4j का उपयोग करने पर कई विचार? मुझे बहुत बड़े ग्राफ (लाखों नए नोड्स/दिन) का अध्ययन करने और नोड्स/डेज पेजरैंक इत्यादि की तुलना करने की आवश्यकता है। – Lostsoul

+5

neo4j एक वास्तविक ग्राफ डेटाबेस है; जो मैंने अपने उत्तर में लागू किया वह एक "सतत ग्राफ" है। दोनों ग्राफ स्टोर कर सकते हैं; एक ग्राफ डीबी "समझता है" क्या ग्राफ है, इसलिए यह पूछताछ की जा सकती है कि "नोड्स एक्स और नोड्स वाई के बीच कितने नोड्स हैं? ऐसा करने के लिए ऊपर मेरे रेडिस कार्यान्वयन में आपको पहले लाल रंग से ग्राफ को निकालने की आवश्यकता होगी, नेटवर्कक्स। दूसरे शब्दों में, neo4j (जो कि एकमात्र ओपन-सोर्स ग्राफ डीबी है, मुझे पता है) मेरे रेडिस कार्यान्वयन + स्मार्ट ग्राफ एप्लिकेशन लेयर (नेटवर्कएक्स) की तरह है। यदि आप नेटवर्कक्स का उपयोग करना पसंद करते हैं, तो उस अतिरिक्त कार्यक्षमता को अभी मिल सकता है रास्ते में – doug

+0

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

1

मुझे हार्ड ड्राइव का उपयोग करने का सबसे अच्छा तरीका देखने में दिलचस्पी होगी। अतीत में मैंने कई ग्राफ बनाए हैं और उन्हें .dot फ़ाइलों के रूप में सहेजा है। फिर किसी तरह से स्मृति में उनमें से कुछ मिश्रित। हालांकि सबसे अच्छा समाधान नहीं है।

from random import random 
import networkx as nx 

def make_graph(): 
    G=nx.DiGraph() 
    N=10 
    #make a random graph 
    for i in range(N): 
     for j in range(i): 
      if 4*random()<1: 
       G.add_edge(i,j) 

    nx.write_dot(G,"savedgraph.dot") 
    return G 

try: 
    G=nx.read_dot("savedgraph.dot") 
except: 
    G=make_graph() #This will fail if you don't use the same seed but have created the graph in the past. You could use the Singleton design pattern here. 
print G.adj 
+0

महान उत्तर रॉबर्ट के लिए धन्यवाद। मैंने इस बारे में सोचा था, एक बुरी स्थिति के रूप में, ऐसी प्रक्रिया है जो इन फ्लैट फ़ाइलों को लेती है (जो मुझे पता है कि कैसे बनाना है) और उन्हें हबेस में धक्का देता है और फिर उन्हें मांग पर भी उत्पन्न करता है। मुझे नहीं लगता कि यह सबसे अच्छा जवाब है क्योंकि कभी-कभी डेटाबेस सिस्टम स्टोरेज मेमोरी से अधिक हो जाता है (जो अंत में इस डेटा को स्टोर करेगा), अगर स्मृति समस्या की तुलना में डेटाबेस को लगातार संदर्भित करने का कोई तरीका है। – Lostsoul

+0

हाँ, उम्मीद है कि कोई बेहतर जवाब पोस्ट करेगा। –

+0

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

3

नहीं है। क्लाउडलाइट नामक SQLXite3 समर्थित नेटवर्कएक्स कार्यान्वयन। https://www.assembla.com/spaces/cloudlight/wiki/Tutorial

+0

बहुत अच्छा, मैं निश्चित रूप से इसका उपयोग कर सकता हूं! – RubyGladiator