Статьи

Neo4j: время ожидания запроса обхода

В последние несколько недель я проводил свободное время, создавая приложение, которое генерирует маршруты на основе данных 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, являются их собственными.