2015-12-02 25 views
5

Tôi biết điều này đã được hỏi nhiều lần nhưng tôi không tìm thấy bất kỳ tham chiếu nào về phiên bản Tinkerpop cuối cùng (3.1), có nhiều chức năng hữu ích mới mà chúng tôi có thể sử dụng của chúng tôi traversals.Cách tốt nhất để tìm đường đi ngắn nhất giữa hai nút trong Tinkerpop 3.1

Hãy nói rằng tôi phải tìm một con đường ngắn nhất giữa các nút 3 và 4. là âm thanh traversal này?

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().limit(1) 

Ở đây tôi giả định rằng khi tôi lặp tìm kiếm BFS được thực thi (do đó, kết quả đầu tiên là đường đi ngắn nhất) là it seems that this was the case with the loop() function.

Ngoài ra, có cách nào để bao gồm biến bị ràng buộc trước đó (bằng cách sử dụng bước as) trong bước until không? Chính xác hơn, tôi đang cố gắng để chọn hai nút trong traversal, và sau đó tìm đường đi ngắn nhất giữa chúng, ví dụ,

g.V().match(
__as('e0').out('Feedbacks').as('e1'), 
__as('e0').repeat(out('Meets')).until(<I reach e1>).path().<get_length>.as('len') 
).select('e0', 'e1', 'len') 

Cuối cùng, như có thể được nhìn thấy từ traversal trước, nó không phải là rõ ràng đối với tôi làm thế nào tôi có thể có được chiều dài của con đường ngắn nhất. Sử dụng một cái gì đó giống như

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().size() 

trả về kích thước của kết quả (số hàng trả lại), trong khi

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().by(__size()) 

trả về một lỗi.

Đây là biểu đồ tôi đang thử nghiệm, bất kỳ ai cũng muốn phát một chút.

graph = TinkerGraph.open() 
e0 = graph.addVertex(T.id, 0, label, "User", "name", "e0") 
e1 = graph.addVertex(T.id, 1, label, "User", "name", "e1") 
e2 = graph.addVertex(T.id, 2, label, "User", "name", "e2") 
e3 = graph.addVertex(T.id, 3, label, "User", "name", "e3") 
e4 = graph.addVertex(T.id, 4, label, "User", "name", "e4") 
e0.addEdge("Feedbacks", e2) 
e0.addEdge("Meets", e1) 
e2.addEdge("Feedbacks", e4) 
e2.addEdge("Meets", e4) 
e3.addEdge("Feedbacks", e0) 
e3.addEdge("Meets", e2) 
e4.addEdge("Feedbacks", e0) 
g = graph.traversal() 

Trả lời

8

Có một biến thể hơi ngắn hơn cho truy vấn con đường ngắn nhất của bạn:

g.V(3).repeat(out().simplePath()).until(hasId(4)).path().limit(1) 

giả định của bạn, đó là con đường đầu tiên luôn luôn là con đường ngắn nhất, là đúng. Để có được độ dài đường dẫn, bạn có thể sử dụng count(local):

g.V(3).repeat(out().simplePath()).until(hasId(4)).path().count(local) 

CẬP NHẬT

Về truy vấn cập nhật của bạn, chương trình này nên giải quyết vấn đề:

g.V().as("e0").out("Feedbacks").as("e1").select("e0"). 
     repeat(out("Meets")).until(where(eq("e1"))).path(). 
     map(union(count(local), constant(-2)).sum()).as("len"). 
     select("e0","e1","len") 

tôi trừ 2 từ chiều dài đường dẫn tổng thể, bởi vì tôi nghĩ rằng bạn chỉ quan tâm đến độ dài của đường đi ngang qua khối repeat() và không thể là out().select() ngay từ đầu bao gồm. Nếu đó không phải là trường hợp, thì bạn chỉ có thể thay thế dòng thứ ba bằng count(local).as("len")..

+0

Cảm ơn @Daniel Kuppitz. Trong khi bạn đang viết câu trả lời của mình, tôi đã sửa đổi câu hỏi. Bạn sẽ có một chút thời gian để kiểm tra yêu cầu mới, đó là, làm thế nào tôi tham chiếu đến một nút đã được đánh dấu trước đó trong bước 'until()'? – Alberto

+0

Cảm ơn lần nữa, Daniel – Alberto

+0

Xin lỗi vì đã làm phiền lần nữa nhưng .. Tôi đang cố gắng hợp nhất các kết quả của hai câu hỏi bằng cách tính chiều dài của đường đi ngắn nhất 'Meets' * undirected * ('cả hai ('Meets')') kết nối hai đỉnh được nối với nhau bởi một cạnh Phản hồi.Nó không phải là tầm thường vì tôi không thể sử dụng 'simplePath()' bên trong 'repeat()' vì các kiểu 'as ('e0')' -'electelect ('e0') 'và tôi không thể chọn đường dẫn đầu tiên với một 'giới hạn (1)' sau 'đến()' vì nếu không thì tôi sẽ giải các giải pháp. Bạn có bất kỳ ý tưởng làm thế nào để giải quyết điều này? – Alberto

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