2014-09-04 16 views
6

Tôi có hai loại nút sau:Nhận các nút mà không có mối quan hệ nhất định (cypher/neo4j)

c:City {name: 'blah'} 
s:Course {title: 'whatever', city: 'New York'} 

Nhìn tạo này:

(s)-[:offered_in]->(c) 

Tôi đang cố gắng để có được tất cả các khóa học KHÔNG gắn liền với các thành phố và tạo mối quan hệ với thành phố (thành phố được tạo ra nếu không tồn tại). Tuy nhiên, vấn đề là tập dữ liệu của tôi là khoảng 5 triệu nút và bất kỳ truy vấn nào tôi thực hiện thời gian (trừ khi tôi làm tăng 10k).

... có ai có lời khuyên nào không?

EDIT:

Đây là một truy vấn cho công việc tôi đang chạy bây giờ (mà đã được thực hiện trong 10k khối (trong số hàng triệu) vì phải mất vài phút vì nó là tạo ra thành phố nếu doesn. 't tồn tại):

match (j:Job) 
where not has(j.merged) and has(j.city) 
WITH j 
LIMIT 10000 
MERGE (c:City {name: j.city}) 
WITH j, c 
MERGE (j)-[:in]->(c) 
SET j.merged = 1 
return count(j) 

(hiện tại không biết cách làm tốt bằng cách gắn thẻ với thuộc tính "đã hợp nhất" tùy chỉnh mà tôi đã có chỉ số trên)

+0

Bạn có thể chia sẻ những gì bạn đang thử không? – JohnMark13

+0

Tôi không nghĩ rằng điều này có thể được trả lời mà không có ngữ cảnh nhiều hơn (và phù hợp với câu hỏi của bạn để cập nhật của bạn, tôi giả định công việc == khóa học và trong == offer_in). Bạn có đang hoạt động trên dữ liệu hiện tại hay đây là một lần nhập hàng loạt không? Bạn có thể cho chúng tôi biết một chút về thiết lập hệ thống của bạn không? Thay vì 'hợp nhất', bạn có thể sử dụng WHERE NOT (j) - [: in] ->(). – JohnMark13

+0

Bạn có thấy thời gian chờ thông qua giao diện trình duyệt không? –

Trả lời

2

500000 là công bằng f ew nút và trên câu hỏi khác của bạn, bạn đề nghị 90% là không có mối quan hệ mà bạn muốn tạo ở đây, vì vậy nó sẽ mất một chút thời gian. Nếu không có thêm kiến ​​thức về hệ thống của bạn (spec, thiết lập tân, môi trường lập trình) và khi bạn đang chạy này (trên dữ liệu cũ hoặc chèn) đây chỉ là một phỏng đoán tốt nhất tại một giải pháp ngăn nắp:

MATCH (j:Job) 
WHERE NOT (j)-[:IN]->() AND HAS(j.city) 
MERGE (c:City {name: j.city}) 
MERGE (j)-[:IN]->(c) 
return count(j) 

Rõ ràng bạn có thể thêm giới hạn của bạn trở lại theo yêu cầu.

+0

Đó là 5.000.000 nút. vì lý do nào đó mà truy vấn mà tôi có (và cái này) tạo ra nhiều thành phố trùng lặp ... Tôi đã từ bỏ và chỉ viết kịch bản python để thực hiện việc này theo cách thủ công theo từng phần nhỏ. sẽ mãi mãi, nhưng dường như giữ sự độc đáo và làm những gì tôi cần. Trên một lưu ý có liên quan, tôi đã thử chơi với "CREATE UNIQUE" (vì điều này được cho là đảm bảo tính độc đáo của các phần), nhưng nó vẫn giữ cho tôi hoặc là "mẫu không bị ràng buộc" hoặc không nên sử dụng cách (hoặc một cái gì đó dọc theo những dòng), vì vậy không bao giờ có mà để làm việc. – Diaspar

+1

Các chỉ mục nào bạn đã xác định và bạn có đang sử dụng hai câu lệnh hợp nhất như trên không? Một hợp nhất đơn ('MERGE (j) - [: IN] -> (c: Thành phố {tên: j.city})') sẽ tạo ra các bản sao do mô hình không bị ràng buộc chưa từng có. Bạn có thể cập nhật câu hỏi của mình với nhiều thông tin hơn (những gì bạn đã thử và những gì không thành công) vì điều này có thể thực hiện được không! – JohnMark13

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