#playframework #neo4j #neo4j-spatial
#playframework #neo4j #neo4j-пространственный
Вопрос:
У меня есть класс NodeA, помеченный @NodeEntity. В нем много полей, в том числе:
@Indexed
public Double lat;
@Indexed
public Double lon;
Обратите внимание, что NodeA уже способен хранить достаточное количество информации о местоположении через поля широты и lon. Я хочу добавить узлы типа NodeA в пространственный слой, чтобы я мог запускать пространственные запросы, используя геопровод.
- Как я могу добавить объекты NodeA непосредственно в пространственный слой? В настоящее время я могу добавлять только такие точки, как
new Coordinate(13.766, 55.566)
, в пространственный слой. (Если решения нет, как я могу связать узел NodeA с соответствующим узлом координат?) - Нужно ли добавлять узлы в пространственный индекс отдельно?
Я использую:
- 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, и узлы добавляются в пространственное хранилище.