2013-07-04 20 views
1

我在Neo4j的首發,我想知道是否有可能使用Neo4j的,我在那裏有一個成本找到最佳路徑,但我想第一個最佳路徑,和第二最佳路徑等等...如何找到最佳路徑GraphAlgoFactory(第一最好的,退而求其次,等..)

如果我有3條可能的路徑,我需要通過成本得到訂購的所有3,如果我有100條可能的路徑,我需要限制的結果太(例如,前10名成績)。

這是可能的Neo4j的?

PS:在我的測試中,我用java-愛仕達路由示例:https://github.com/neo4j-examples/java-astar-routing

謝謝,對不起我的英文不好),

+0

您可以使用Dijkstra或A *並使用finder.getAllPaths(),然後按成本/重量排序。 –

+0

@MichaelHunger我認爲哪個finder.getAllPaths()返回所有最佳路徑,如果這些路徑具有相同的最佳成本,它將返回多於一個結果。我首先需要的最好的,退而求其次,等等... –

+0

所以通過(懶惰)結果迭代器遍歷和最好成績,一個(如果很多)從第二最好成績返回一個(如果有很多)...等等。 Dijkstra和AStar返回具有成本訪問器的WeightedPath對象。 –

回答

2

基本上,你想要的是ALL兩個節點之間的路徑,然後計算它們的權重,然後按成本對它們進行排序。

後兩位是很容易做到的,現在你需要的是找到所有路徑:

http://api.neo4j.org/current/org/neo4j/graphalgo/GraphAlgoFactory.html#allPaths(org.neo4j.graphdb.RelationshipExpander,INT)

+0

在您的解決方案,我怎麼會知道的最佳路徑的順序,我怎麼能限制的路徑,例如,第3條最佳路徑 –

+0

你只是排序的路徑集合你回來,根據他們的體重。你在代碼中手動執行,而不是在Neo4j中。無論如何,在Neo4J中做這件事並沒有什麼區別,因爲他們仍然需要檢查所有的路徑,看它是否屬於前3名 –

0

你也可以使用最佳優先順序寫自己的橫移政策。例如:

Traversal.traversal() 
    .order(new MyOwnBestFirstOrdering()) 
    ... 
    .traverse(startNode); 

class MyOwnBestFirstOrdering extends BestFirstSelectorFactory<Integer,Integer> 
{ 
    @Override public Integer startData() { 
     return 0; 
    } 

    ... 
}