如何将 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)