neo4j-rtree
Основанный на neo4j n-мерный пространственный индекс.
github: https://github.com/codingmiao/neo4j-rtree
gitee: https://gitee.com/wowtools/neo4j-rtree
rtree — это индекс, который вычисляет положение и расстояние объектов в n-мерном пространстве. Многие предшественники открыли исходный код для реализации rtree в памяти, но при больших объёмах данных полностью построенные в памяти rtree имеют проблемы с использованием памяти и длительным временем инициализации.
Поэтому этот проект, опираясь на реализацию conversant/rtree, строит rtree на базе графовой базы данных neo4j, создавая управляемый памятью и сохраняемый индекс rtree.
(Примечание: старая версия v1.x основана на neo4j spatial и имеет проблемы, такие как чрезмерное использование стека из-за рекурсии и ограниченная поддержка только 2D пространства, и больше не получает функциональных обновлений.)
try (RtreeEditor rtreeEditor = RtreeEditor.create(db, 2000, indexName)) {
// Создаём объект RectNd, описывающий минимальный ограничивающий прямоугольник n-мерного объекта
RectNd rect2d = new RectNd(new PointNd(new double[]{xmin, ymin}), new PointNd(new double[]{xmax, ymax}));
// Добавляем
rtreeEditor.add(rect2d);
// Методы remove и update аналогичны
}
Полный пример см. в тестировании.
Запрос объектов в индексе, которые пересекаются с введённым n-мерным прямоугольником.
// Создаём входные прямоугольники
PointNd p0 = new PointNd(new double[]{x0, y0});
PointNd p1 = new PointNd(new double[]{x1, y1});
RectNd inputRange = new RectNd(p0, p1);
try (Transaction tx = db.beginTx()) {
// Создаём RtreeIntersectsSearcher
RtreeIntersectsSearcher searcher = RtreeIntersectsSearcher.get(tx, indexName);
searcher.intersects(inputRange, tx, (dataNodeId) -> {
// Выводим найденные nodeId, также можно использовать id для получения более подробной информации о node в neo4j
System.out.println(dataNodeId);
return false;
});
}
Полный пример см. в тестировании.
// Находим пять ближайших точек к точке (x, y)
double x = 0.5, y = 0.5;
int hitNum = 5;
try (Transaction tx = db.beginTx()) {
// Создаём RtreeNearestSearcher
RtreeNearestSearcher searcher = RtreeNearestSearcher.get(tx, indexName);
// Создаем условие поиска NearestNeighbour, включая точку PointNd, максимальное количество возвращаемых элементов и формулу расстояния
PointNd pt = new PointNd(new double[]{x, y});
NearestNeighbour nearestNeighbour = new NearestNeighbour(hitNum, pt) {
@Override
public DistanceResult createDistanceResult(PointNd pointNd, long dataNodeId) {
RectNd rectNd = ...;// Получаем данные node из neo4j по dataNodeId
double dist = dist(rectNd);// Вычисляем расстояние от dataNode до (x,y)
return new DistanceResult(dist, dataNodeId);
}
};
nearests = searcher.nearest(nearestNeighbour, tx);
}
...
// Определяем формулу расстояния
private static final double dist(RectNd rect2d) {
double[] xy = rect2d.getMaxXs();
double x1 = xy[0];
double y1 = xy[1];
return Math.sqrt(Math.pow(x1 - x, 2) + Math.pow(y1 - y, 2));
}
Полный пример см. в тестировании.
geometry2d — это специализированный пакет для двумерных геометрических объектов, который также включает в себя вышеупомянутые функции.
Добавление, удаление и изменение данных индекса geometry2d Geometry2dRtreeEditor
Пересечение отношений geometry2d Geometry2dRtreeIntersectsSearcher
Поиск ближайших соседей geometry2d Geometry2dRtreeNearestSearcher
Добавьте maven зависимость, последняя версия — 2.0.2
<dependency>
<groupId>org.wowtools</groupId>
<artifactId>neo4j-rtree</artifactId>
<version>${neo4j-rtree-version}</version>
</dependency>
Если ваш проект уже использует другую версию neo4j (например, корпоративную версию), что вызывает конфликты, рассмотрите возможность исключения:
<dependency> ```
artifactId>neo4j-rtree</artifactId>
version>${neo4j-rtree-version}</version>
exclusions>
exclusion>
groupId>org.neo4j</groupId>
artifactId>neo4j-common</artifactId>
</exclusion>
exclusion>
groupId>org.neo4j</groupId>
artifactId>neo4j</artifactId>
</exclusion>
</exclusions>
Обратите внимание, что зависимости в центральном репозитории Maven скомпилированы с использованием JDK 11, поэтому если ваш проект использует JDK 8 или другую версию, вам может потребоваться скомпилировать собственную версию, подходящую для вашего JDK:
clone & install
git clone https://github.com/codingmiao/neo4j-rtree.git
mvn clean install -DskipTests
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )