2013-02-04 36 views
11

Tôi đã cố gắng để chạy truy vấn này theo khuyến cáo trong nhóm neo4j google và trong các nguồn trực tuyến khác:Xóa tất cả các nút và các mối quan hệ trong neo4j sử dụng cypher vượt quá không gian đống

BẮT ĐẦU n = nút (*) Đội hình thi đấu n - [r?] -() WHERE ID (n)> 0 DELETE n, r;

để xóa tất cả các nút và mối quan hệ giữa các lần kiểm tra. Khi tôi làm như vậy từ giao diện điều khiển, tôi chạy ra khỏi không gian java heap. Khi tôi làm như vậy từ python (bằng cách sử dụng graph_db.clear mới(), xuất hiện sử dụng cùng một truy vấn), tôi nhận được một "SystemError: None" mà, tôi giả định, là cùng một lỗi không gian java heap. Tôi có một cơ sở dữ liệu với 500k nút, chỉ có mối quan hệ 5k và thuộc tính 7M. Tôi đang chạy trên máy tính xách tay Mac (10.6.8) với RAM 8GB sử dụng neo4j-1.8.1. Tôi đoán tôi là một chút ngạc nhiên khi xóa các nút (về cơ bản không có mối quan hệ, vì vậy rất nhỏ subgraphs) sẽ vượt quá không gian java heap, nhưng tôi khá ngây thơ về cách neo4j hoạt động. Bất kỳ đề xuất nào về cách tiếp tục được đánh giá cao. Tôi biết rằng rm -rf trong thư mục dữ liệu và bắt đầu từ đầu sẽ làm việc, nhưng tôi nghĩ rằng có thể có một giải pháp ít quyết liệt hơn.

[chéo được đưa lên neo4j nhóm google]

+0

Phân trang sau WITH WITH thậm chí còn thuận tiện hơn và hợp lý hơn: 'START n = node (*) MATCH n- [r?] -() VỚI n, r LIMIT 10000 DELETE n, r; ' –

+0

@MichaelHunger không nên là:' START n = node (*) VỚI n LIMIT 10000 MATCH n- [r?] -() DELETE n, r; '? – joewhite86

Trả lời

3

Kể từ Neo4j 2.3.3, một cách mới để loại bỏ nút và mối quan hệ đã được giới thiệu. Xem 2.3.3 Docs.

Ví dụ, bạn có thể làm:

MATCH(n) DETACH DELETE n; 
+0

Điều này làm việc cho các tập dữ liệu nhỏ nhưng thổi không gian Java Heap của tôi trên một cơ sở dữ liệu lớn – fiat

18

Tuyên bố cypher trên gây ra tất cả các nút (bên cạnh nút gốc với ID 0) được khởi tạo trước khi xóa trong một giao dịch duy nhất. Điều này ăn quá nhiều bộ nhớ khi thực hiện với các nút 500k.

Cố gắng hạn chế số lượng các nút để xóa một cái gì đó khoảng 10k-50k, như ví dụ:

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<10000) 
DELETE n, r; 

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<20000) 
DELETE n, r; 

, vv

Tuy nhiên, không có gì sai với việc loại bỏ toàn bộ thư mục cơ sở dữ liệu là, rất tốt thực hành.

+1

Vâng, +1 khi xóa thư mục cơ sở dữ liệu. –

+0

Tôi nên nghĩ đến việc giới hạn số lượng nút trong quá trình xóa. Cảm ơn gợi ý. Rõ ràng, mặc dù, con đường để đi dường như được loại bỏ các thư mục cơ sở dữ liệu. – seandavi

+5

Dấu hỏi không còn được sử dụng cho các mẫu tùy chọn. Trong các phiên bản gần đây của Neo4j, cần phải thay đổi mệnh đề khớp cho: TÙY CHỌN TÙY CHỌN n- [r] -() – IsidroGH

7

Dấu chấm hỏi không hoạt động nữa. Sử dụng tùy chọn Match..the dưới đây sẽ làm việc.

   START n = node(*) 
       OPTIONAL MATCH n-[r]-() 
       WHERE (ID(n)>0 AND ID(n)<10000) 
       DELETE n, r; 
+1

+1 cho điều này. bạn sẽ nhận được một "Dấu hỏi không còn được sử dụng cho các mẫu tùy chọn - sử dụng MATION MATCH thay thế" trong ví dụ trên. –

9

Theo tài liệu neo4j, việc xóa một isa graph thực hiện thông qua:

MATCH (n) 
OPTIONAL MATCH (n)-[r]-() 
DELETE n,r; 

Để tránh lỗi này không gian java heap, tôi conbined mã này với LIMIT:

MATCH (n) 
OPTIONAL MATCH (n)-[r]-() 
WITH n,r LIMIT 100000 DELETE n,r; 

Nó hoạt động để giảm số nút và cuối cùng cho phép sử dụng mã đầu tiên, được khuyên dùng và tổng quát hơn.

0

Bạn có thể tăng không gian đống trong neo4j tài sản của bạn và cho phép đăng nhập gc và xem sự trỗi dậy của không gian đống nếu nó thực sự gần giới hạn trên. kích thước bộ nhớ cache của trang cần được giảm hoặc tăng tùy thuộc vào kích thước ban đầu của bạn. ... giảm/tăng nó và kiểm tra hiệu ứng trên thời gian tải. neo4j là bộ nhớ đói ... cần kích thước heap lớn hơn nhiều mà u có thể nhận được.

Các vấn đề liên quan