Из-за известной проблемы Neo4j, упомянутой @cybersam, я реализовал временный обходной путь на стороне клиента (java) для выполнения бинарного поиска.Он находит максимальное значение с помощью до 32 запросов к одному узлу, что сокращает время выполнения до доли секунды, по сравнению с более чем минутой для исходного одиночного вызова с размером данных более ста миллионов узлов.
public int getLastTransactionId() {
//return getInteger("MATCH (n:Transaction) RETURN n.id ORDER BY n.id DESC LIMIT 1").orElse(0);
//Neo4j currently having issues with using inexes for ORDER or MAX
//do binary search as a workaround
return findMax("MATCH (n:Transaction {id:{id}}) RETURN n.id");
}
public int findMax(String query) {
int minVal = 0;
int maxVal = Integer.MAX_VALUE;
while (minVal < maxVal) {
int middle = (int) ((1L + minVal + maxVal) / 2);
OptionalInt o = getInteger(query, Values.parameters("id", middle));
log.debug("min:{}, max:{}, middle:{}, o:{}", minVal, maxVal, middle, o);
if (o.isPresent()) {
minVal = middle;
} else {
maxVal = middle - 1;
}
}
return maxVal;
}