2014-12-08 30 views
6

Câu hỏi của tôi là: có thể triển khai thuật toán Dijkstra bằng Cypher không? giải thích trên trang web neo4j chỉ nói về REST API và rất khó hiểu đối với người mới bắt đầu như tôiLàm thế nào để thực hiện thuật toán Dijkstra trong Neo4j bằng cách sử dụng Cypher

Xin lưu ý rằng tôi muốn tìm đường đi ngắn nhất với khoảng cách ngắn nhất khoảng cách giữa hai nút chứ không phải đường đi ngắn nhất (liên quan đến số lượng mối quan hệ ít nhất) giữa hai nút. Tôi biết thuật toán shortestPath rất dễ thực hiện bằng cách sử dụng Cypher, nhưng nó không phục vụ mục đích của tôi.

Vui lòng hướng dẫn tôi cách tiến hành nếu tôi có cơ sở dữ liệu biểu đồ có nút và mối quan hệ giữa các nút có khoảng cách của thuộc tính. Tất cả những gì tôi muốn là viết một đoạn mã với sự giúp đỡ mà chúng ta có thể tìm ra khoảng cách ngắn nhất giữa hai nút trong cơ sở dữ liệu. Hoặc bất kỳ lời khuyên nào nếu tôi cần phải thay đổi cách tiếp cận của tôi và sử dụng một số chương trình khác cho việc này?

+0

có [câu hỏi gần đây] (http://stackoverflow.com/questions/27346686/implementing-dijkstras-algorithm-in-neo4j) liên quan đến vấn đề này, có thể giúp ích. – zaboco

+0

yea Tôi đã hỏi câu hỏi đó, câu trả lời tôi nhận được là đúng theo ý tôi có thể có được đường đi ngắn nhất (số lượng ít nhất các mối quan hệ) và tổng khoảng cách giữa các nút .... nhưng điều tôi đang tìm kiếm là ngắn nhất đường dẫn (ít nhất là 'khoảng cách') vì vậy tôi phải đưa ra một câu hỏi khác để làm rõ rằng – Shazu

+0

"Khoảng cách" ở đây có nghĩa là gì? Bạn có một số thuộc tính về mối quan hệ của bạn đại diện cho khoảng cách trên một mối quan hệ "hop" giữa hai nút? – FrobberOfBits

Trả lời

5

Trong trường hợp này bạn có thể thực hiện các allShortestPaths, ra lệnh cho các con đường trong một thứ tự tăng dần dựa trên tài sản khoảng cách của bạn trong những mối quan hệ và trở về chỉ có một, dựa trên bài cuối cùng của bạn nó sẽ là một cái gì đó như thế này:

MATCH (from: Location {LocationName:"x"}), (to: Location {LocationName:"y"}) , 
paths = allShortestPaths((from)-[:CONNECTED_TO*]->(to)) 
WITH REDUCE(dist = 0, rel in rels(paths) | dist + rel.distance) AS distance, paths 
RETURN paths, distance 
ORDER BY distance 
LIMIT 1 
+0

cảm ơn !! bạn có thể vui lòng chỉnh sửa mã của mình: đường dẫn thay vì đường dẫn trong dòng thứ tư và đường dẫn thay vì p trong dòng thứ năm để nếu có ai khác nhìn thấy điều này trong tương lai, chúng không bị nhầm lẫn. – Shazu

+0

có chắc chắn, xin lỗi về nó, trộn với một số thử nghiệm tại địa phương :) –

+1

Việc triển khai dijkstra trong Neo4j cũng có thể được sử dụng như một phần của phần mở rộng máy chủ hoặc thông qua REST API: http://neo4j.com/docs/stable/ rest-api-graph-algos.html # rest-api-execute-a-dijkstra-algorithm-với-bình-trọng-on-mối quan hệ –

0

Không, điều đó là không thể một cách hợp lý trừ khi bạn sử dụng các giao dịch và về cơ bản sẽ viết lại algorhythm. Câu trả lời trước là sai, nhưng đường dẫn ít tốn kém hơn sẽ không được trả về bởi tập hợp con allShortestPaths. Bạn sẽ lọc một tập con đường dẫn đã được chọn mà không xem xét chi phí mối quan hệ.

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