Хороший день,
Я хочу працювати з побудовою геометрії на абільший масштаб. З цією метою я імпортую геометричні дані з різних джерел (також 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 слід зберігати Polygon
s (див. див 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-дерева. Однак оновленням та видаленням вузла індексу необхідно обробляти вручну.