Как использовать spring-data-neo4j с пространственными индексами и шифром?
Я хочу использовать пространственный индекс в Neo4j с фреймворком spring-data-neo4j. Кроме того, я хочу запросить индекс с помощью шифра. База данных встроена.
Я немного невежественен относительно того, как соединить все это вместе.
С таким доменным объектом,
@NodeEntity
class Junction {
@GraphId Long id;
@Indexed(indexType = IndexType.POINT, indexName = "junctionLocations") Point wkt;
}
SDN должен поддерживать индекс для меня. Это выглядит так, как я могу делать пространственные запросы, используя хранилище:
interface JunctionGraph extends GraphRepository<Junction>, SpatialRepository<Junction> {}
с
junctionGraph.findWithinBoundingBox("junctionLocations", new Box(lowerBound.point, upperBound.point))
Тем не менее, я понимаю, что для запроса этого индекса с использованием шифра (через @Query в хранилище) эта конфигурация пространственного индекса не будет работать. Я думаю, что это потому, что каждый узел должен быть вручную добавлен в пространственный индекс (или, по крайней мере, прокси для узла). Это означает, что добавление этого в JunctionGraph:
@Query("START n=node:junctionLocations('withinDistance:[{0}, {1}, {2}]') MATCH n-[*]->(i:Item) return i")
Collection<Item> getItemsWithin(double lat, double lon, double radius)
не работает
У кого-нибудь есть рабочий рецепт? Мне кажется, это немного чёрная магия, и я не уверен, как лучше поступить в SDN.
1 ответ
Это работает, вам просто нужно создать всю строку запроса снаружи и передать ее в качестве параметра, заполнители внутри строковых констант не подставляются.
@Query("START n=node:junctionLocations({0}) MATCH n-[*]->(i:Item) return i")
Collection<Item> getItemsWithin(String query)
Вы должны сделать замену самостоятельно, например, используя String.format
String.format("withinDistance:[%f, %f, %f]",lat,lon,radius)