2015-12-02 19 views
5

Bunun birkaç kez sorulduğunu biliyorum, ancak Tinkerpop'un (3.1) son sürümü hakkında herhangi bir referans bulamadık. bizim geçişlerimiz.İki düğüm arasında en kısa yolu bulmanın en iyi yolu Tinkerpop 3.1

n nodları 3 ve 4 arasındaki en kısa yolu bulmam gerektiğini varsayalım. Bu traversal ses mi? İşte

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

Ben BFS arama döngü olduğumda yürütülür varsayarak yaşıyorum it seems that this was the case with the loop() function olarak (böylece, ilk sonuç kısa yol).

Ayrıca, until adımında önceden bağlanmış bir değişkeni (as adımını kullanarak) dahil etmenin herhangi bir yolu var mı? Bu kadar net değil önceki geçişi de görülebileceği olarak Daha doğrusu, ben, son olarak, örneğin, aralarında kısa yolu bulmak daha sonra

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') 

çevirmesi esnasında iki düğüm seçmek için çalışıyorum ve bana en kısa yolun uzunluğunu nasıl alabilirim.

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

bir hata verir iken

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

gibi kullanma şey, sonuç (satır sayısı iade) boyutunu verir.

İşte bir deneyeyim, biraz oynamak isterse. İlk yol her zaman en kısa yol olduğunu,

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

Sizin varsayım doğrudur:

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() 

cevap

8

Orada sizin en kısa yol sorgusu için biraz daha kısa varyantı var. yol uzunluklarını almak için, count(local) kullanabilirsiniz:

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") 

ben den 2 çıkarma:

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

GÜNCELLEME

güncellenmiş sorgu ile ilgili olarak, bu bir sorunu çözmek gerekir genel yol uzunluğu, çünkü sadece repeat() bloğu tarafından geçilen yolun uzunluğu ile ilgilendiğinizi düşünüyorum ve başlangıçta out().select() dahil. Durum böyle değilse, 3. satırı count(local).as("len"). ile değiştirebilirsiniz.

+0

Teşekkürler @Daniel Kuppitz. Cevabını yazarken soruyu değiştirdim. Yeni isteği kontrol etmek için biraz zamanınız olacak, yani, 'till() 'adımındaki daha önce takma bir düğümle nasıl referans yapıyorum? – Alberto

+0

Tekrar teşekkürler, Daniel – Alberto

+0

Tekrar rahatsız ettiğim için özür dilerim. Şimdi iki sorudan oluşan sonuçları bir araya getirmeye çalışıyorum: 'Karşılaşılanlar' * doğrulanmamış * ('her ikisi ('Meets')') en kısa yolunu hesaplayarak Geri besleme kenarı tarafından bağlanan iki köprüyü bağlar.'('E0')' -'select ('e0') 'desenlerinden dolayı' simplePath() 'ı 'tekrarla' (' '' '' '' 'içinde kullanamadığımdan önemsiz değildir ve ilk yolu seçemiyorum. bir 'limit (1)' sonrası kadar() 'dır, aksi halde çözümleri kaybederim. Bununla nasıl başa çıkacağın hakkında bir fikrin var mı? – Alberto

İlgili konular