В последние несколько недель я проводил свободное время, создавая приложение, которое генерирует маршруты на основе данных Open Roads — конечно, преобразованные и импортированные в Neo4j!
Я создал пользовательскую процедуру, которая объединяет несколько запросов по кратчайшему пути, но я хотел выйти из любого из этих поисков по кратчайшему пути, если они занимают слишком много времени. Мой код без тайм-аута выглядит так:
1
2
3
4
5
6
|
StandardExpander orderedExpander = new OrderedByTypeExpander() .add( RelationshipType.withName( "CONNECTS" ), Direction.BOTH ); PathFinder<Path> shortestPathFinder = GraphAlgoFactory.shortestPath( expander, 250 ); ... |
Есть несколько мест, где мы можем проверить прошедшее время, но метод расширения в Expander мне показался очевидным. Я написал свой собственный класс Expander, который выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class TimeConstrainedExpander implements PathExpander { private final StandardExpander expander; private final long startTime; private final Clock clock; private int pathsExpanded = 0 ; private long timeLimitInMillis; public TimeConstrainedExpander( StandardExpander expander, Clock clock, long timeLimitInMillis ) { this .expander = expander; this .clock = clock; this .startTime = clock.instant().toEpochMilli(); this .timeLimitInMillis = timeLimitInMillis; } @Override public Iterable<Relationship> expand( Path path, BranchState state ) { long timeSoFar = clock.instant().toEpochMilli() - startTime; if ( timeSoFar > timeLimitInMillis ) { return Collections.emptyList(); } return expander.expand( path, state ); } @Override public PathExpander reverse() { return expander.reverse(); } } |
Фрагмент кода из более ранней версии теперь необходимо обновить, чтобы использовать наш новый класс, что не так сложно:
1
2
3
4
5
6
7
8
|
StandardExpander orderedExpander = new OrderedByTypeExpander() .add( RelationshipType.withName( "CONNECTS" ), Direction.BOTH ); TimeConstrainedExpander expander = new TimeConstrainedExpander(orderedExpander, Clock.systemUTC(), 200 ); PathFinder<Path> shortestPathFinder = GraphAlgoFactory.shortestPath( expander, 250 ); ... |
Я не уверен, что это лучший способ достичь того, чего я хочу, но после неудачи с несколькими другими подходами, по крайней мере, этот действительно работает!
Опубликовано на Java Code Geeks с разрешения Марка Нидхэма, партнера нашей программы JCG . См. Оригинальную статью здесь: Neo4j: время ожидания запроса обхода
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |