2012-06-18 7 views
9

के साथ सभी नोड्स के माध्यम से पुनरावृत्त करना संभव है क्या py2neo का उपयोग करते हुए neo4j डेटाबेस में प्रत्येक नोड के माध्यम से पुनरावृत्ति करने का कोई तरीका है?क्या py2neo

मेरा पहला विचार GraphDatabaseService के माध्यम से पुनरावृत्ति कर रहा था, लेकिन यह काम नहीं किया। अगर py2neo के साथ ऐसा करने का कोई तरीका नहीं है, तो क्या कोई दूसरा पायथन इंटरफ़ेस है जो मुझे जाने देगा?

संपादित करें: मैं अब @ निकोलस के उत्तर को स्वीकार कर रहा हूं, लेकिन अगर कोई मुझे जेनरेटर लौटाता है तो मैं इसे अपडेट कर दूंगा।

उत्तर

12

मैं कर रहा सुझाव है कि अतुल्यकालिक साइफर, की तरह कुछ के साथ:

from py2neo import neo4j, cypher 

    graph_db = neo4j.GraphDatabaseService() 

    def handle_row(row): 
     node = row[0] 
     # do something with `node` here 

    cypher.execute(graph_db, "START z=node(*) RETURN z", row_handler=handle_row) 

बेशक आप संदर्भ नोड बाहर करने के लिए है या नहीं तो क्वेरी tweak चाहते हो सकता है।

Nige

+1

धन्यवाद, यह काम करता है। मैं एक बड़े ग्राफ के लिए मान रहा हूं कि यह सब एक बार में पाइथन मेमोरी में लोड नहीं करेगा, सही? – beardc

+0

सही। एसिंक्रोनस साइफर निष्पादन प्रत्येक प्रतिक्रिया को संभालने के लिए सबमिट करता है क्योंकि यह HTTP प्रतिक्रिया स्ट्रीम से प्राप्त होता है। –

+2

py2neo 1.6 के रूप में (अक्टूबर 2013 रिलीज के कारण) यह साइफर क्वेरी परिणामों और मानक पायथन पुनरावृत्ति के स्ट्रीम किए गए सेट के साथ संभव होगा। –

4

दो समाधानों में से एक को ध्यान में आता है। या तो एक बीजलेख क्वेरी

START n=node(*) return n 

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

GlobalGraphOperations.at(graphDatabaseService).getAllNodes() 

जो रास्ता वर्ष पदावनत है graphDatabaseService.getAllNodes() सिफारिश करता है।

+0

धन्यवाद। साइफर क्वेरी को निष्पादित करना 'स्टार्ट एन = नोड (*) रिटर्न एन' एक सूची देता है, लेकिन आपके दूसरे उत्तर में एनालॉग नहीं मिला। अब उत्तर देने वाले जेनरेटर जवाब स्वीकार करते हैं। – beardc

+0

मैंने जेनरेटर को फिर से चलाने के लिए कई विकल्पों पर विचार किया है, हालांकि डेटाबेस में सभी नोड्स। दुर्भाग्यवश, मुझे नहीं लगता कि इसके बिना इसे प्राप्त करने का कोई तरीका है (i) HTTP कनेक्शन को तब तक खुला रखना जब तक कि एप्लिकेशन कोड सभी आइटमों के माध्यम से पुनरावृत्त नहीं हो जाता है या (ii) सभी आइटम को पहले से मेमोरी में लोड करना। जनरेटर दृष्टिकोण के साथ मुख्य मुद्दा यह है कि उस ट्रैवर्सल को उस _providing_ के बजाय जनरेटर कोड _using_ द्वारा नियंत्रित किया जाता है। यही कारण है कि मुझे लगता है कि कॉलबैक तंत्र इस उद्देश्य के लिए बेहतर है। –

2

py2neo स्वीकार किए जाते हैं संस्करण अब काम करता है के नए संस्करण के लिए। इसके बजाय उपयोग करें:

from py2neo import Graph 

graph = Graph("http://user:[email protected]:7474/db/data/") 

for n in graph.cypher.stream("START z=node(*) RETURN z"): 
    //do something with node here 
    print n