Добър ден,
Искам да работя с геометрия на сграда напо-голям мащаб. За тази цел аз импортирам геометрични данни от различни източници (също shp-файлове) към вградена база данни neo4j, работеща с spring-data-neo4j. Дотук добре.
Където съм заседнал: В моя домейн определям a 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);
Проблемът е, че няма въведени индекси за 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();
и извикване на запис на хранилището (). Въпреки това, това не изглежда да работи. Wkt не се съхранява, това е нула.
Възможно ли е да се използва този име на индекс (е, че дори е възможно) в моя Building
по някакъв начин - или премества всички транзакции през REST на пространствения плъгин на neo4j наистина единственият начин да направите това.
Би ли било възможно например да се приложи ново IndexType
? всички вход е много оценявам!
Отговори:
0 за отговор № 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-Tree. Актуализирането и изтриването на индексния възел обаче трябва да се извършва ръчно.