/ / пролетни данни neo4j пространствена работа с полигони - neo4j, шифър, многоъгълник, spring-data-neo4j, neo4j-пространствен

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

Добър ден,

Искам да работя с геометрия на сграда напо-голям мащаб. За тази цел аз импортирам геометрични данни от различни източници (също 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, трябва да бъде възможно 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();

и извикване на запис на хранилището (). Въпреки това, това не изглежда да работи. 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. Актуализирането и изтриването на индексния възел обаче трябва да се извършва ръчно.