2012-06-18 40 views
9

Có cách nào để lặp qua tất cả các nút trong cơ sở dữ liệu neo4j bằng py2neo không?Có thể lặp qua tất cả các nút với py2neo

Suy nghĩ đầu tiên của tôi đã được lặp lại thông qua GraphDatabaseService, nhưng điều đó không hiệu quả. Nếu không có cách nào để làm điều đó với py2neo, có giao diện python nào khác sẽ cho tôi không?

Chỉnh sửa: Tôi chấp nhận câu trả lời của @ Nicholas lúc này, nhưng tôi sẽ cập nhật câu trả lời nếu ai đó có thể cho tôi cách trả lại máy phát.

Trả lời

12

tôi sẽ đề nghị làm điều đó với đồng bộ Cypher, một cái gì đó như:

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) 

Tất nhiên bạn có thể muốn loại trừ các nút tham khảo hoặc tinh chỉnh các truy vấn.

Nige

+1

Cảm ơn, có vẻ như công trình này hoạt động. Tôi giả định cho một đồ thị lớn nó sẽ không tải tất cả chúng vào bộ nhớ python cùng một lúc, đúng không? – beardc

+0

Chính xác. Việc thực thi Cypher không đồng bộ đệ trình mỗi hàng để xử lý khi nó nhận được từ luồng phản hồi HTTP. –

+2

Kể từ py2neo 1.6 (do phát hành tháng 10 năm 2013) điều này sẽ có thể thực hiện với một tập hợp các kết quả truy vấn Cypher và luồng lặp Python chuẩn. –

4

Một trong hai giải pháp được đề cập đến. Hoặc làm một truy vấn cypher

START n=node(*) return n 

Các khác, và tôi không quen thuộc với python vì vậy tôi sẽ cung cấp cho các ví dụ trong Java là

GlobalGraphOperations.at(graphDatabaseService).getAllNodes() 

đó là con đường cũ phản đối graphDatabaseService.getAllNodes() đề xuất.

+0

Cảm ơn. Thực hiện truy vấn cypher 'START n = node (*) return n' trả về một danh sách, nhưng không thể tìm thấy một tương tự với câu trả lời thứ hai của bạn. Bây giờ chấp nhận câu trả lời mà trả lại máy phát điện. – beardc

+0

Tôi đã xem xét một số tùy chọn để thực hiện một trình tạo để lặp lại mặc dù tất cả các nút trong cơ sở dữ liệu. Thật không may, tôi không nghĩ rằng có một cách để đạt được điều này mà không có (i) giữ kết nối HTTP mở cho đến khi mã ứng dụng đã lặp qua tất cả các mục hoặc (ii) tải tất cả các mục vào bộ nhớ trước. Vấn đề chính với cách tiếp cận máy phát điện là việc truyền tải đó nhất thiết phải được kiểm soát bởi mã _using_ bộ tạo thay vì _providing_ nó. Đây là lý do tại sao tôi cảm thấy cơ chế gọi lại là thích hợp hơn cho mục đích này. –

2

Đối với phiên bản mới hơn của py2neo, phiên bản được chấp nhận không còn hoạt động nữa. Thay vào đó, hãy sử dụng:

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 
Các vấn đề liên quan