1

我正在使用 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 为空。当我浏览图表时,我发现了以下数据:

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的来源,评论 //我们不再需要这个,因为我们返回的节点已经是一个“真实”节点 // Node node = db.getNodeById( (Long) spatialRecord.getProperty( "id" ) ); 似乎表明此功能在我使用的版本中不可用。

我的问题是,将 withinDistance 与其他匹配条件一起使用的推荐方法是什么?还有几个其他条件需要满足,但我似乎无法掌握实际节点以实际匹配它们。我应该明确创建关系吗?不使用 Cypher 并使用核心 API 进行遍历?拆分查询?

4

2 回答 2

1

两种选择:

a) 使用 GeoPipline.startNearestNeighborLatLonSearch 获取一组起始节点,提供给后续 Cypher 查询以对其他属性进行匹配/过滤 b) 由于我的纬度/经度在许多实体中是通用的 [使用区域的质心],我可以创建从空间节点到位于该区域的所有实体的关系,然后使用一个 Cypher 查询,例如:START n=node:stadiumsLocation('withinDistance:[53.489271,-2.246704, 5.0]') MATCH (n)<- [:LOCATED_IN]-(something) WHERE something.someProp=5 RETURN something

按照彼得的建议,选择了选项 b。但请注意,无法取回空间索引节点,以便您可以从中创建关系。必须对 0.0 距离进行 withinDistance 查询。

于 2013-05-28T08:02:29.833 回答
0

你能执行我在https://github.com/neo4j/spatial/blob/2803093d544f56d7dfe8f1d122e049fa73489d8a/src/test/java/org/neo4j/gis/spatial/IndexProviderTest.java#L199做的增强测试用例吗?它展示了如何找到一个位置,并使用密码遍历到下一个节点。

于 2013-05-28T11:59:51.737 回答