如何将 spring-data-neo4j 与空间索引和密码一起使用?
How do I use spring-data-neo4j with spatial indexes and cypher?
我想通过 spring-data-neo4j 框架在 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 中进行的最佳方式是什么。
有效,您只需在外部创建整个查询字符串并将其作为参数传递,不会替换字符串常量中的占位符。
@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)
我想通过 spring-data-neo4j 框架在 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 中进行的最佳方式是什么。
有效,您只需在外部创建整个查询字符串并将其作为参数传递,不会替换字符串常量中的占位符。
@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)