根据即时计算或变量的结果订购Neo4j cypher结果

时间:2013-06-27 02:09:36

标签: neo4j cypher graph-databases

我在neo4j(http://www.neo4j.org/)中有一个图表,节点代表人。其中一些节点保存了物理位置(在各种属性中:经度,纬度,location_name,location_id),但它们也可以为零。

我想构建一个cypher查询,该查询按照与原始节点列出的物理位置的距离对结果节点进行排序。例如,我想从具有经度-122.419,纬度37.7793,location_name“旧金山,加利福尼亚”和location_id 114952118516947的节点ID 42开始查询,并通过物理位置(最短距离)检索距离节点42最近的10个人。我已经找到了使用经度和纬度来计算两点之间(近似)距离的资源,所以这不是问题。

有没有办法为每个被访问节点计算类似的变量,然后按该变量对结果进行排序?

我意识到这可能是计算上昂贵的,所以这是我想要开始工作的另一种选择:

  • 在查询中,检查节点的location_id或location_name是否与原始节点的匹配,并首先对这些匹配的节点进行排序。 (不是一个完美的解决方案,但在短期内可能是可以接受的)

当我尝试将ORDER BY(http://docs.neo4j.org/chunked/milestone/query-order.html)与从WITH运算符(http://docs.neo4j.org/chunked/stable/query-with.html)计算的变量一起使用时,我收到此错误:

SyntaxException: Unknown identifier `flag`.

以下是完整查询:

start n = node(42) match (n)<-[:friends]->(f) WITH f, (f.fb_location_id = 114952118516947) AS flag RETURN DISTINCT f ORDER BY flag LIMIT 10

如果无法做到这一点,最好的方法是什么?

  • [无需排序的过滤结果]在查询之前,计算可接受距离(例如20英里)内的纬度+经度组合范围,然后从结果中过滤掉其他组合。如果我想扩大距离,请再次询问。
  • [无需排序的过滤结果]在查询之前,确定哪些位置(城市)在可接受的距离内(例如20英里),然后从结果中过滤掉其他位置(使用location_id)。如果我想扩大距离,请再次询问。

谢谢!

1 个答案:

答案 0 :(得分:4)

尝试在距离内使用该怎么办? e.g。

START n=node:people('withinDistance:[53.489271,-2.246704, 20.0]')
<conditions here>
RETURN n

此处提供的纬度/经度是示例中节点42的位置,20.0是以km为单位的最大距离。 如果您使用的是Neo4j 1.9+,请查看http://architects.dzone.com/articles/neo4jcypher-finding-football,其中介绍了您可以使用Neo4j Spatial做些什么。

注意:withinDistance的结果默认按距离asc

排序