2013-07-04 1 views
1

Я стартер в neo4j, и я хочу знать, если можно найти лучшие пути, используя neo4j, где у меня есть стоимость, но я хочу первый лучший путь и второй лучший путь и т. д.Как найти наилучшие пути GraphAlgoFactory (первый лучший, второй лучший и т. Д.)

Если у меня есть 3 возможных пути, мне нужно получить все 3 в порядке по стоимости, если у меня есть 100 возможных путей, мне тоже нужно ограничить результаты (например, 10 лучших результатов).

Это возможно в neo4j?

PS: в моих тестах я использовал образец Java-ASTAR-маршрутизации: https://github.com/neo4j-examples/java-astar-routing

Спасибо и извините за мой бедный английский;),

+0

Вы можете использовать Dijkstra или A * и использовать finder.getAllPaths(), которые затем упорядочиваются по стоимости/весу. –

+0

@MichaelHunger Я думаю, что finder.getAllPaths() возвращает все наилучшие пути, он вернет более одного результата, если эти пути имеют одинаковую цену. Мне нужно первое, второе и так далее ... –

+0

Итак, итератор через (ленивый) результат итератора и возвращай один (если много) из лучшего балла, один (если много) из второго лучшего результата ... и так далее. Dijkstra и AStar возвращают объекты WeightedPath, у которых есть аксессор стоимости. –

ответ

2

В принципе, что вы хотите все пути между двумя узлами, затем вычислить их веса, а затем отсортировать их по стоимости.

Последних два бита является довольно легко сделать, теперь все, что вам нужно, чтобы найти все пути:

http://api.neo4j.org/current/org/neo4j/graphalgo/GraphAlgoFactory.html#allPaths(org.neo4j.graphdb.RelationshipExpander, целый)

+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; 
    } 

    ... 
} 
Смежные вопросы