我使用Neo4j 1.8.2和Neo4j Spatial 0.9 for 1.8.2(http://m2.neo4j.org/content/repositories/releases/org/neo4j/neo4j-spatial/0.9-neo4j-1.8.2/)
按照此处http://architects.dzone.com/articles/neo4jcypher-finding-football的示例代码进行一次更改 - 而不是SpatialIndexProvider.SIMPLE_WKT_CONFIG,我使用了SpatialIndexProvider.SIMPLE_POINT_CONFIG_WKT
在您执行以下查询之前,一切正常:
START n=node:stadiumsLocation('withinDistance:[53.489271,-2.246704, 5.0]')
RETURN n.name, n.wkt;
n.name为null。当我探索图表时,我发现了这些数据:
Node[80]{lon:-2.20024,lat:53.483,id:79,gtype:1,bbox:-2.20024,53.483,-2.20024,53.483]}
Node[168]{lon:-2.29139,lat:53.4631,id:167,gtype:1,bbox:-2.29139,53.4631,-2.29139,53.4631]}
对于返回的节点80,看起来这是为空间记录创建的节点,其中包含属性id:79。节点79是示例中的实际体育场记录。
根据IndexProviderTest的来源,评论 //我们不再需要这个,因为我们已经获得了一个'Real'节点 // Node node = db.getNodeById((Long)spatialRecord.getProperty(“id”)); 似乎表明我正在使用的版本中没有此功能。
我的问题是,在其他匹配条件下使用withinDistance的推荐方法是什么?还有其他几个条件需要实现,但我似乎无法在实际节点上找到实际匹配它们的句柄。 我应该明确创建关系吗?不使用Cypher并使用核心API进行遍历?拆分查询?
答案 0 :(得分:1)
两个选项:
a)使用GeoPipline.startNearestNeighborLatLonSearch获取一组起始节点,提供给后续的Cypher查询以对其他属性进行匹配/过滤 b)由于我的lat / long在许多实体中是共同的[使用区域的质心],我可以创建从空间节点到位于该区域中的所有实体的关系,然后使用一个Cypher查询,例如: START n = node:stadiumsLocation('withinDistance:[53.489271,-2.246704,5.0]') MATCH(n)< - [:LOCATED_IN] - (某事) 什么东西.someProp = 5 返回一些东西
彼得建议,选择b。 但请注意,无法返回空间索引节点,以便您可以从中创建关系。不得不做0.0距离的内部距离查询。
答案 1 :(得分:0)
你可以执行我在https://github.com/neo4j/spatial/blob/2803093d544f56d7dfe8f1d122e049fa73489d8a/src/test/java/org/neo4j/gis/spatial/IndexProviderTest.java#L199做的增强测试用例吗?它显示了如何查找位置,并使用cypher遍历到下一个节点。