Добавить NodeEntity непосредственно в Neo4j-пространственный слой?

#playframework #neo4j #neo4j-spatial

#playframework #neo4j #neo4j-пространственный

Вопрос:

У меня есть класс NodeA, помеченный @NodeEntity. В нем много полей, в том числе:

 @Indexed
public Double lat;

@Indexed
public Double lon;
  

Обратите внимание, что NodeA уже способен хранить достаточное количество информации о местоположении через поля широты и lon. Я хочу добавить узлы типа NodeA в пространственный слой, чтобы я мог запускать пространственные запросы, используя геопровод.

  1. Как я могу добавить объекты NodeA непосредственно в пространственный слой? В настоящее время я могу добавлять только такие точки, как new Coordinate(13.766, 55.566) , в пространственный слой. (Если решения нет, как я могу связать узел NodeA с соответствующим узлом координат?)
  2. Нужно ли добавлять узлы в пространственный индекс отдельно?

Я использую:

  • Java в игре!Фреймворк 2.2.2 (может быть обновлен)
  • Встроенный Neo4j-Spatial 0.13-neo4j-2.0.1 (может быть обновлен)

Редактировать: Когда я подключаю уже существующий узел типа NodeA к RTREE_ROOT, GeoPipeline жалуется на отсутствие свойства bbox узла NodeA. (Конечно же, в NodeA нет свойства bbox, но оно присутствует в других узлах типа Coordinate).

Ответ №1:

Я нашел решение здесь:
http://www.markhneedham.com/blog/2013/03/10/neo4jcypher-finding-football-stadiums-near-a-city-using-spatial/

Нам просто нужно добавить узлы в пространственный индекс. Узлы должны иметь свойство wkt, которое содержит информацию о координатах. Все узлы, добавленные в этот индекс, также будут автоматически добавлены в пространственный слой.

IndexProviderTest.java предоставляет обновленную реализацию:
https://github.com/mneedham/spatial/blob/master/src/test/java/org/neo4j/gis/spatial/IndexProviderTest.java#L251

 @Test
public void testWithinDistanceIndex() {
Map<String, String> config = SpatialIndexProvider.SIMPLE_WKT_CONFIG;
IndexManager indexMan = db.index();
Index<Node> index = indexMan.forNodes("layer2", config);
Transaction tx = db.beginTx();
Node batman = db.createNode();
String wktPoint = "POINT(41.14 37.88 )";
batman.setProperty("wkt", wktPoint);
String batman1 = "batman";
batman.setProperty("name", batman1);
index.add(batman, "dummy", "value");
Map<String, Object> params = new HashMap<String, Object>();
Double[] point = {37.87, 41.13};
params.put(LayerNodeIndex.POINT_PARAMETER,
        point);
params.put(LayerNodeIndex.DISTANCE_IN_KM_PARAMETER, 2.0);
IndexHits<Node> hits = index.query(
        LayerNodeIndex.WITHIN_DISTANCE_QUERY, params);
tx.success();
tx.finish();
Node node = hits.getSingle();
assertTrue(node.getId() == batman.getId());
assertTrue(node.getProperty("name").equals(batman1));
}
  

Ответ №2:

В блоге рядом с вами находятся работы Ван Гога с пространственными данными Neo4j и Spring Neo4j 3.0.1

http://inserpio.wordpress.com/2014/04/03/artworks-spatial-search/

делает именно то, что я искал. @NodeEntity содержит свойство wkt, и узлы добавляются в пространственное хранилище.