वहाँ भंडारण रेखांकन के लिए कंटेनर के दो सामान्य प्रकार हैं:
सच ग्राफ डेटाबेस: उदाहरण के लिए, Neo4J, अपना पहला नाटक, GraphDB, और AllegroGraph; ये न केवल एक ग्राफ संग्रह करते हैं बल्कि वे यह भी समझते हैं कि एक ग्राफ है, उदाहरण के लिए, आप इन डेटाबेस क्वेरी कर सकते हैं उदा। नोड एक्स और नोड वाई से सबसे कम पथ के बीच कितने नोड्स हैं?
स्थिर ग्राफ कंटेनर: ट्विटर का 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 के रूप में कार्यान्वित में
redis डेटाबेस से डेटा निकालने सरणी; तो
परिवर्तित जो सीधे उस 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 कहा जाता है और मैं इसे इस्तेमाल नहीं किया है
मैंने आपके प्रश्न का शीर्षक संपादित किया और "nosql" टैग जोड़ा। विशेष रूप से, मैंने शीर्षक में संदर्भ को * networkx * में हटा दिया क्योंकि नेटवर्कक्स को किसी विशेष ग्राफ प्रारूप/प्रोटोकॉल की आवश्यकता नहीं है (वास्तव में, इसमें सभी सामान्य प्रारूपों से अनुवाद करने के तरीके हैं), इसलिए तथ्य यह है कि आपके ग्राफ़ हैं नेटवर्कक्स से उत्पन्न संभावित उत्तरों पर कोई प्रभाव नहीं पड़ता है। – doug