/ / весняні дані neo4j просторові, що працюють з багатокутниками - neo4j, cypher, polygon, spring-data-neo4j, neo4j-просторові

навесні дані neo4j просторової роботи з полігонами - neo4j, cypher, polygon, spring-data-neo4j, neo4j-spatial

Хороший день,

Я хочу працювати з побудовою геометрії на абільший масштаб. З цією метою я імпортую геометричні дані з різних джерел (також shp-файлів) до вбудованої бази даних neo4j, що працює з spring-data-neo4j. Все йде нормально.

Де я застряг: У своєму домені я визначаю: Building сутність, яка має форму Polygon wkt; Чи можливо створити вузол, що має a Polygon власність через CRUDRepository?

З Point це спрацювало б чудово: напр.

@NodeEntity
public class Building implements Serializable{
@GraphId
private Long id;
@Indexed(indexType = IndexType.POINT, indexName = "building_wkt_index", unique = false)
private Point wkt;
}

public interface BuildingRepository extends GraphRepository<Building>, SpatialRepository<Building>{
/**
* CRUD
*/
}

Building b = new Building();
b.setWkt(new Point(12,12));
buildingService.save(b);

Проблема полягає в тому, що для нього не реалізовано IndexTypes Lines і Polygons. Це мій перший проект із джерелами даних іneo4j, тому я не впевнений, в якому напрямку я повинен піти. Переглянувши просторову документацію neo4j, видно, що за допомогою wkt "s слід зберігати Polygons (див. див http://neo4j-contrib.github.io/spatial/#spatial-server-plugin)

https://stackoverflow.com/a/26567534 також пропонує створити просторовий індекс через REST. Ще одна пропозиція: https://stackoverflow.com/a/24741823.

Я намагався вручну створити просторовий індекс так:

Transaction tx = template.getGraphDatabaseService().beginTx();
template.getGraphDatabaseService().index().forNodes("building_wkt_index", MapUtil.stringMap(
IndexManager.PROVIDER, "spatial", "geometry_type", "polygon", "wkt", "wkt"));
tx.success();

і зателефонуйте сховищу "s save (). Однак це, здається, не працює. Wkt не зберігається, він є нульовим.

Чи можна використовувати цей названий індекс (це можливо навіть) в моєму Buildingякимось чином - або переміщення всіх транзакцій через просторовий плагін neo4j REST - це єдиний спосіб зробити це.

Можна, наприклад, реалізувати нове IndexType? всі дані високо оцінені!

Відповіді:

0 для відповіді № 1

Для всіх, хто цікавиться можливим рішенням:

1-й я вручну створюю просторовий індекс:

template.getGraphDatabaseService().index().forNodes("your_spatial_index", MapUtil.stringMap(
IndexManager.PROVIDER, "spatial", "geometry_type","polygon","wkt", "wkt"));

Всередині об'єкта домену wkt зберігається як String:

String wkt;

Потім я перемістив доступ до репозиторію до послуги. Коли новий вузол зберігається, цей вузол додається вручну до просторового індексу:

Transaction tx = template.getGraphDatabase().beginTx();
Node n = template.getNode(b.getId());
template.getGraphDatabase().getIndex("your_spatial_index").add(n,"id",b.getId());
tx.success();
tx.close();

Принаймні, це швидке виправлення, щоб отримати багатокутник wkt до R-дерева. Однак оновленням та видаленням вузла індексу необхідно обробляти вручну.