1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wowtools-neo4j-rtree

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

neo4j-rtree

Основанный на neo4j n-мерный пространственный индекс.

github: https://github.com/codingmiao/neo4j-rtree

gitee: https://gitee.com/wowtools/neo4j-rtree

中文文档 | README

Введение

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

Полный пример см. в тестировании.

Двумерный индекс на основе jts geometry

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 )

Вы можете оставить комментарий после Вход в систему

Введение

Пространственный индекс для Neo4j. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/wowtools-neo4j-rtree.git
git@api.gitlife.ru:oschina-mirror/wowtools-neo4j-rtree.git
oschina-mirror
wowtools-neo4j-rtree
wowtools-neo4j-rtree
master