2013-02-11 15 views
9

Tôi đang làm việc trên một dự án mà tôi phải xử lý đồ thị ... Tôi đang sử dụng biểu đồ để nhận các tuyến đường bằng xe buýt và xe đạp giữa hai điểm dừng.Lấy tất cả Tuyến đường giữa hai nút neo4j

Thực tế là, tất cả mối quan hệ của tôi đều chứa thời gian cần thiết để đi từ điểm bắt đầu của mối quan hệ và kết thúc.

Để có được đường đi ngắn nhất giữa đến nút, tôi đang sử dụng chức năng đường đi ngắn nhất của cypher. Nhưng một cái gì đó, con đường ngắn nhất không phải là nhanh nhất ....

Có cách nào để có được tất cả các đường dẫn giữa hai nút không được liên kết bởi một mối quan hệ không?

Cảm ơn

EDIT:

Trong thực tế, tôi thay đổi đồ thị của tôi, để làm cho nó dễ dàng hơn. Vì vậy, tôi vẫn có tất cả các nút của tôi. Bây giờ loại mối quan hệ tương ứng với thời gian cần thiết để chuyển từ nút này sang nút khác.

Hàm shortPath nhất của cypher cung cấp đường dẫn có ít mối quan hệ hơn. Tôi muốn rằng nó trả về con đường mà việc bổ sung tất cả các loại (thời gian) là nhỏ nhất .. Điều đó có khả thi không?

Cảm ơn

+0

Bạn có cần sử dụng Cypher không? Tôi có thể nghĩ về một số kịch bản gremlin sẽ in ra điều này nên trông khá gọn gàng. – Nicholas

+0

Trong thực tế tôi đang sử dụng nodeJs .. Và tôi có một thư viện để truy vấn biểu đồ neo4j của tôi cho phép tôi thực hiện truy vấn cypher ... và không truy vấn gremlin ... –

Trả lời

11

Trong cypher, để có được tất cả các đường dẫn giữa hai nút không được liên kết bởi một mối quan hệ, và sắp xếp theo một tổng trong một cân, bạn có thể sử dụng làm giảm chức năng giới thiệu trong 1.9:

start a=node(...), b=node(...) // get your start nodes 
match p=a-[r*2..5]->b // match paths (best to provide maximum lengths to prevent queries from running away) 
where not(a-->b) // where a is not directly connected to b 
with p, relationships(p) as rcoll // just for readability, alias rcoll 
return p, reduce(totalTime=0, x in rcoll: totalTime + x.time) as totalTime 
order by totalTime 

Bạn có thể ném một giới hạn 1 ở cuối, nếu bạn chỉ cần ngắn nhất.

+0

Bạn có ý gì khi 'nhận tất cả các đường dẫn giữa hai nút không được liên kết bởi một mối quan hệ'? Làm thế nào một con đường có thể được hình thành giữa các nút nếu chúng không được liên kết bởi các mối quan hệ? –

+0

Không được liên kết trực tiếp, ý tôi là. (cũng lưu ý, điều này là khá cũ ... cú pháp thậm chí sẽ không chạy những ngày này). Xin vui lòng xem Apoc trong 3.0 cho một số cách tốt hơn để làm điều này. –

4

Bạn có thể sử dụng thuật toán Dijkstra/Astar, có vẻ hoàn toàn phù hợp với bạn. Hãy xem http://api.neo4j.org/1.8.1/org/neo4j/graphalgo/GraphAlgoFactory.html

Rất tiếc, bạn không thể sử dụng những người từ Cypher.

+0

Vâng, tôi đã nghĩ về việc đó .. Tôi chỉ muốn biết nếu có một cách để có được tất cả các con đường giữa hai nút với cypher bởi vì sau khi nhận được tất cả các con đường có thể, tôi có thể phân tích chúng và nhận được nhanh nhất .. và sử dụng cypher để có được những người sẽ dễ dàng hơn cho tôi gây ra tôi ' m bằng cách sử dụng neo4j với nodejs .. –

+1

Mặc dù trước tiên có được tất cả các đường dẫn giữa hai nút và sau đó lọc có khả năng chậm hơn nhiều, vì thuật toán không thể thông minh và chọn đường dẫn tốt nhất ngay tức thì, hãy "phím tắt" –

+6

có lẽ nên phơi bày thêm một số thuật toán đó cho cypher bằng cách nào đó. –